Merge branch 'chromeos-security-3.4' into chromeos-3.4
authorOlof Johansson <olof@lixom.net>
Fri, 1 Jun 2012 07:06:50 +0000 (00:06 -0700)
committerOlof Johansson <olof@lixom.net>
Fri, 1 Jun 2012 07:06:50 +0000 (00:06 -0700)
By Will Drewry (22) and others
via Grant Grundler
* chromeos-security-3.4: (31 commits)
  CHROMIUM: ARM: r1->r0 for get/set arguments
  CHROMIUM: seccomp: set -ENOSYS if there is no tracer
  CHROMIUM: ARM: arch/arm: allow a scno of -1 to not cause a SIGILL
  CHROMIUM: arch/arm: select HAVE_ARCH_SECCOMP_FILTER
  CHROMIUM: arch/arm: move secure_computing into trace; respect return code
  CHROMIUM: arch/arm: add asm/syscall.h
  BACKPORT: samples/seccomp: fix dependencies on arch macros
  BACKPORT: seccomp: fix build warnings when there is no CONFIG_SECCOMP_FILTER
  BACKPORT: seccomp: ignore secure_computing return values
  BACKPORT: seccomp: use a static inline for a function stub
  BACKPORT: Documentation: prctl/seccomp_filter
  BACKPORT: x86: Enable HAVE_ARCH_SECCOMP_FILTER
  BACKPORT: ptrace,seccomp: Add PTRACE_SECCOMP support
  BACKPORT: seccomp: Add SECCOMP_RET_TRAP
  BACKPORT: signal, x86: add SIGSYS info and make it synchronous.
  BACKPORT: seccomp: add SECCOMP_RET_ERRNO
  BACKPORT: seccomp: remove duplicated failure logging
  BACKPORT: seccomp: add system call filtering using BPF
  BACKPORT: arch/x86: add syscall_get_arch to syscall.h
  BACKPORT: asm/syscall.h: add syscall_get_arch
  ...

170 files changed:
.gitignore
.scmversion [new file with mode: 0644]
Documentation/kernel-parameters.txt
arch/x86/kernel/process.c
arch/x86/kernel/tsc.c
arch/x86/platform/efi/efi.c
chromeos/config/armel/chromeos-tegra2.flavour.config [new file with mode: 0644]
chromeos/config/armel/chromiumos-arm.flavour.config [new file with mode: 0644]
chromeos/config/armel/chromiumos-exynos5.flavour.config [new file with mode: 0644]
chromeos/config/armel/common.config [new file with mode: 0644]
chromeos/config/base.config [new file with mode: 0644]
chromeos/config/i386/chromeos-pinetrail-i386.flavour.config [new file with mode: 0644]
chromeos/config/i386/chromiumos-i386.flavour.config [new file with mode: 0644]
chromeos/config/i386/common.config [new file with mode: 0644]
chromeos/config/x86_64/chromeos-intel-pineview.flavour.config [new file with mode: 0644]
chromeos/config/x86_64/chromiumos-x86_64.flavour.config [new file with mode: 0644]
chromeos/config/x86_64/common.config [new file with mode: 0644]
chromeos/drivers/Kconfig [new file with mode: 0644]
chromeos/drivers/Makefile [new file with mode: 0644]
chromeos/scripts/kernelconfig [new file with mode: 0755]
chromeos/scripts/prepareconfig [new file with mode: 0755]
chromeos/scripts/splitconfig [new file with mode: 0755]
drivers/Kconfig
drivers/acpi/acpica/evxfevnt.c
drivers/acpi/acpica/hwacpi.c
drivers/acpi/pci_root.c
drivers/acpi/sleep.c
drivers/ata/libata-core.c
drivers/char/Kconfig
drivers/char/mem.c
drivers/char/ramoops.c
drivers/char/tpm/Kconfig
drivers/char/tpm/Makefile
drivers/char/tpm/tpm.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm_tis.c
drivers/char/tpm/tpm_tis_i2c.c [new file with mode: 0644]
drivers/firmware/google/memconsole.c
drivers/gpio/Kconfig
drivers/gpio/Makefile
drivers/gpio/nm10_gpio.c [new file with mode: 0644]
drivers/gpu/drm/Kconfig
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_bios.c
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_dvo.c
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_i2c.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_modes.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_ringbuffer.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/hid/hid-apple.c
drivers/i2c/busses/i2c-i801.c
drivers/input/mouse/Kconfig
drivers/input/mouse/Makefile
drivers/input/mouse/cyapa.c [new file with mode: 0644]
drivers/input/mouse/synaptics.c
drivers/input/touchscreen/atmel_mxt_ts.c
drivers/md/dm-table.c
drivers/net/ethernet/realtek/r8169.c
drivers/net/usb/Kconfig
drivers/net/usb/Makefile
drivers/net/usb/gobi/Makefile [new file with mode: 0644]
drivers/net/usb/gobi/README [new file with mode: 0644]
drivers/net/usb/gobi/buffer.c [new file with mode: 0644]
drivers/net/usb/gobi/buffer.h [new file with mode: 0644]
drivers/net/usb/gobi/qcusbnet.c [new file with mode: 0644]
drivers/net/usb/gobi/qcusbnet.h [new file with mode: 0644]
drivers/net/usb/gobi/qmi.c [new file with mode: 0644]
drivers/net/usb/gobi/qmi.h [new file with mode: 0644]
drivers/net/usb/gobi/qmidevice.c [new file with mode: 0644]
drivers/net/usb/gobi/qmidevice.h [new file with mode: 0644]
drivers/net/usb/gobi/structs.h [new file with mode: 0644]
drivers/net/usb/usbnet.c
drivers/pci/pcie/aspm.c
drivers/platform/Kconfig
drivers/platform/Makefile
drivers/platform/arm/Kconfig [new file with mode: 0644]
drivers/platform/arm/Makefile [new file with mode: 0644]
drivers/platform/arm/chromeos_arm.c [new file with mode: 0644]
drivers/platform/chromeos.c [new file with mode: 0644]
drivers/platform/chromeos.h [new file with mode: 0644]
drivers/platform/x86/Kconfig
drivers/platform/x86/Makefile
drivers/platform/x86/chromeos_acpi.c [new file with mode: 0644]
drivers/platform/x86/chromeos_laptop.c [new file with mode: 0644]
drivers/platform/x86/chromeos_laptop.h [new file with mode: 0644]
drivers/staging/iio/light/isl29018.c
drivers/staging/iio/light/tsl2583.c
drivers/thermal/thermal_sys.c
firmware/radeon/BARTS_mc.bin.ihex [new file with mode: 0644]
firmware/radeon/BARTS_me.bin.ihex [new file with mode: 0644]
firmware/radeon/BARTS_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/BTC_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/CAICOS_mc.bin.ihex [new file with mode: 0644]
firmware/radeon/CAICOS_me.bin.ihex [new file with mode: 0644]
firmware/radeon/CAICOS_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/CAYMAN_mc.bin.ihex [new file with mode: 0644]
firmware/radeon/CAYMAN_me.bin.ihex [new file with mode: 0644]
firmware/radeon/CAYMAN_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/CAYMAN_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/CEDAR_me.bin.ihex [new file with mode: 0644]
firmware/radeon/CEDAR_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/CEDAR_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/CYPRESS_me.bin.ihex [new file with mode: 0644]
firmware/radeon/CYPRESS_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/CYPRESS_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/JUNIPER_me.bin.ihex [new file with mode: 0644]
firmware/radeon/JUNIPER_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/JUNIPER_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/PALM_me.bin [new file with mode: 0644]
firmware/radeon/PALM_me.bin.ihex [new file with mode: 0644]
firmware/radeon/PALM_pfp.bin [new file with mode: 0644]
firmware/radeon/PALM_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/R600_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/R700_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/REDWOOD_me.bin.ihex [new file with mode: 0644]
firmware/radeon/REDWOOD_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/REDWOOD_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/SUMO2_me.bin.ihex [new file with mode: 0644]
firmware/radeon/SUMO2_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/SUMO_me.bin.ihex [new file with mode: 0644]
firmware/radeon/SUMO_pfp.bin.ihex [new file with mode: 0644]
firmware/radeon/SUMO_rlc.bin [new file with mode: 0644]
firmware/radeon/SUMO_rlc.bin.ihex [new file with mode: 0644]
firmware/radeon/TURKS_mc.bin.ihex [new file with mode: 0644]
firmware/radeon/TURKS_me.bin.ihex [new file with mode: 0644]
firmware/radeon/TURKS_pfp.bin.ihex [new file with mode: 0644]
fs/exec.c
fs/open.c
fs/proc/Makefile
fs/proc/breakme.c [new file with mode: 0644]
fs/proc/root.c
include/drm/drm_fixed.h
include/linux/chromeos_platform.h [new file with mode: 0644]
include/linux/kernel.h
include/linux/low-mem-notify.h [new file with mode: 0644]
include/linux/mm.h
include/linux/pci_ids.h
include/linux/proc_fs.h
include/linux/sched.h
include/linux/thermal.h
include/linux/time.h
include/trace/events/fs.h [new file with mode: 0644]
init/do_mounts.c
kernel/posix-timers.c
kernel/power/suspend.c
kernel/sched/core.c
kernel/sysctl.c
kernel/trace/trace.c
kernel/watchdog.c
mm/Kconfig
mm/Makefile
mm/low-mem-notify.c [new file with mode: 0644]
mm/page_alloc.c
mm/shmem.c
mm/vmscan.c
scripts/Makefile.fwinst
sound/pci/hda/patch_ca0132.c
sound/pci/hda/patch_cirrus.c
sound/pci/hda/patch_realtek.c
tools/mm/low-mem-test.c [new file with mode: 0644]

index 57af07c..9a3baa7 100644 (file)
@@ -64,6 +64,9 @@ include/linux/version.h
 include/generated
 arch/*/include/generated
 
+# kernelconfig build directory
+/build/
+
 # stgit generated dirs
 patches-*
 
diff --git a/.scmversion b/.scmversion
new file mode 100644 (file)
index 0000000..e69de29
index c1601e5..695bd1e 100644 (file)
@@ -594,6 +594,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
                        a memory unit (amount[KMG]). See also
                        Documentation/kdump/kdump.txt for an example.
 
+       cros_shared_mem=[ARM]
+                       Format: <hex integer>
+                       Base address of the ChromeOS shared memory window,
+                       aligned at megabyte boundary, window size is fixed at
+                       1 megabyte.
+
        cs89x0_dma=     [HW,NET]
                        Format: <dma>
 
index 1d92a5a..0daa7b9 100644 (file)
@@ -113,27 +113,12 @@ void show_regs(struct pt_regs *regs)
 
 void show_regs_common(void)
 {
-       const char *vendor, *product, *board;
-
-       vendor = dmi_get_system_info(DMI_SYS_VENDOR);
-       if (!vendor)
-               vendor = "";
-       product = dmi_get_system_info(DMI_PRODUCT_NAME);
-       if (!product)
-               product = "";
-
-       /* Board Name is optional */
-       board = dmi_get_system_info(DMI_BOARD_NAME);
-
        printk(KERN_CONT "\n");
        printk(KERN_DEFAULT "Pid: %d, comm: %.20s %s %s %.*s",
                current->pid, current->comm, print_tainted(),
                init_utsname()->release,
                (int)strcspn(init_utsname()->version, " "),
                init_utsname()->version);
-       printk(KERN_CONT " %s %s", vendor, product);
-       if (board)
-               printk(KERN_CONT "/%s", board);
        printk(KERN_CONT "\n");
 }
 
index fc0a147..a444ad8 100644 (file)
@@ -956,12 +956,17 @@ void __init tsc_init(void)
 {
        u64 lpj;
        int cpu;
+       u64 initial_tsc;
 
        x86_init.timers.tsc_pre_init();
 
        if (!cpu_has_tsc)
                return;
 
+       rdtscll(initial_tsc);
+       printk(KERN_INFO "Initial TSC value: %llu\n",
+               (unsigned long long)initial_tsc);
+
        tsc_khz = x86_platform.calibrate_tsc();
        cpu_khz = tsc_khz;
 
@@ -970,6 +975,10 @@ void __init tsc_init(void)
                return;
        }
 
+       do_div(initial_tsc, cpu_khz / 1000);
+       printk(KERN_INFO "Initial usec timer %llu\n",
+               (unsigned long long)initial_tsc);
+
        printk("Detected %lu.%03lu MHz processor.\n",
                        (unsigned long)cpu_khz / 1000,
                        (unsigned long)cpu_khz % 1000);
index 92660ed..524cb95 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/io.h>
 #include <linux/reboot.h>
 #include <linux/bcd.h>
+#include <linux/debugfs.h>
 
 #include <asm/setup.h>
 #include <asm/efi.h>
@@ -91,6 +92,19 @@ static int __init setup_add_efi_memmap(char *arg)
 }
 early_param("add_efi_memmap", setup_add_efi_memmap);
 
+static int __init efi_debugfs_setup(void)
+{
+       static u64 efi_smbios_base;
+
+       efi_smbios_base = (u64) efi.smbios;
+
+       if (efi_smbios_base)
+               debugfs_create_u64("efi_smbios_base", 0444, NULL,
+                                                       &efi_smbios_base);
+
+       return 0;
+}
+late_initcall(efi_debugfs_setup);
 
 static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
 {
diff --git a/chromeos/config/armel/chromeos-tegra2.flavour.config b/chromeos/config/armel/chromeos-tegra2.flavour.config
new file mode 100644 (file)
index 0000000..d49de73
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Config options generated by splitconfig
+#
+CONFIG_ATH6KL_SDIO=m
+CONFIG_PL310_ERRATA_753970=y
diff --git a/chromeos/config/armel/chromiumos-arm.flavour.config b/chromeos/config/armel/chromiumos-arm.flavour.config
new file mode 100644 (file)
index 0000000..edf17f8
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_ATH6KL_SDIO is not set
+# CONFIG_PL310_ERRATA_753970 is not set
diff --git a/chromeos/config/armel/chromiumos-exynos5.flavour.config b/chromeos/config/armel/chromiumos-exynos5.flavour.config
new file mode 100644 (file)
index 0000000..d0607fe
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# Config options generated by splitconfig
+#
+CONFIG_ARM_ERRATA_754327=y
+CONFIG_ARM_ERRATA_764369=y
+CONFIG_PL310_ERRATA_753970=y
+CONFIG_SOC_CAMERA=m
+# CONFIG_SOC_CAMERA_IMX074 is not set
+# CONFIG_SOC_CAMERA_MT9M001 is not set
+# CONFIG_SOC_CAMERA_MT9M111 is not set
+# CONFIG_SOC_CAMERA_MT9M114 is not set
+# CONFIG_SOC_CAMERA_MT9T031 is not set
+# CONFIG_SOC_CAMERA_MT9T112 is not set
+# CONFIG_SOC_CAMERA_MT9V022 is not set
+# CONFIG_SOC_CAMERA_OV2640 is not set
+# CONFIG_SOC_CAMERA_OV5642 is not set
+# CONFIG_SOC_CAMERA_OV6650 is not set
+# CONFIG_SOC_CAMERA_OV772X is not set
+# CONFIG_SOC_CAMERA_OV9640 is not set
+CONFIG_SOC_CAMERA_OV9740=m
+# CONFIG_SOC_CAMERA_PLATFORM is not set
+# CONFIG_SOC_CAMERA_RJ54N1 is not set
+# CONFIG_SOC_CAMERA_TW9910 is not set
+CONFIG_VIDEOBUF2_CORE=m
+CONFIG_VIDEOBUF_GEN=m
+# CONFIG_VIDEO_SH_MOBILE_CEU is not set
+# CONFIG_VIDEO_SH_MOBILE_CSI2 is not set
diff --git a/chromeos/config/armel/common.config b/chromeos/config/armel/common.config
new file mode 100644 (file)
index 0000000..7511d6f
--- /dev/null
@@ -0,0 +1,451 @@
+#
+# Config options generated by splitconfig
+#
+CONFIG_AEABI=y
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_APM_EMULATION is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_BCMRING is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CNS3XXX is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_DOVE is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_EXYNOS is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_GEMINI is not set
+# CONFIG_ARCH_H720X is not set
+CONFIG_ARCH_HAS_CPUFREQ=y
+# CONFIG_ARCH_HIGHBANK is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_KIRKWOOD is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_LPC32XX is not set
+# CONFIG_ARCH_MMP is not set
+# CONFIG_ARCH_MSM is not set
+# CONFIG_ARCH_MV78XX0 is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_MXS is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NOMADIK is not set
+CONFIG_ARCH_NR_GPIO=1024
+# CONFIG_ARCH_OMAP is not set
+# CONFIG_ARCH_ORION5X is not set
+# CONFIG_ARCH_PHYS_ADDR_T_64BIT is not set
+# CONFIG_ARCH_PICOXCELL is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PRIMA2 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_REALVIEW is not set
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_S3C24XX is not set
+# CONFIG_ARCH_S3C64XX is not set
+# CONFIG_ARCH_S5P64X0 is not set
+# CONFIG_ARCH_S5PC100 is not set
+# CONFIG_ARCH_S5PV210 is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_SHMOBILE is not set
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_ARCH_TEGRA=y
+CONFIG_ARCH_TEGRA_2x_SOC=y
+# CONFIG_ARCH_TEGRA_3x_SOC is not set
+# CONFIG_ARCH_U300 is not set
+# CONFIG_ARCH_U8500 is not set
+# CONFIG_ARCH_USES_GETTIMEOFFSET is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_VEXPRESS is not set
+# CONFIG_ARCH_VT8500 is not set
+# CONFIG_ARCH_W90X900 is not set
+# CONFIG_ARCH_ZYNQ is not set
+CONFIG_ARM=y
+# CONFIG_ARM_APPENDED_DTB is not set
+CONFIG_ARM_CHROMEOS_FIRMWARE=y
+CONFIG_ARM_CPU_SUSPEND=y
+CONFIG_ARM_CPU_TOPOLOGY=y
+CONFIG_ARM_DMA_MEM_BUFFERABLE=y
+# CONFIG_ARM_ERRATA_430973 is not set
+# CONFIG_ARM_ERRATA_458693 is not set
+# CONFIG_ARM_ERRATA_460075 is not set
+CONFIG_ARM_ERRATA_720789=y
+CONFIG_ARM_ERRATA_742230=y
+# CONFIG_ARM_ERRATA_742231 is not set
+# CONFIG_ARM_ERRATA_743622 is not set
+CONFIG_ARM_ERRATA_751472=y
+# CONFIG_ARM_ERRATA_754322 is not set
+CONFIG_ARM_ERRATA_754327=y
+CONFIG_ARM_ERRATA_764369=y
+# CONFIG_ARM_EXYNOS4210_CPUFREQ is not set
+# CONFIG_ARM_EXYNOS4X12_CPUFREQ is not set
+# CONFIG_ARM_EXYNOS5250_CPUFREQ is not set
+CONFIG_ARM_GIC=y
+CONFIG_ARM_L1_CACHE_SHIFT=6
+CONFIG_ARM_L1_CACHE_SHIFT_6=y
+# CONFIG_ARM_LPAE is not set
+CONFIG_ARM_NR_BANKS=8
+CONFIG_ARM_PATCH_PHYS_VIRT=y
+CONFIG_ARM_PLATFORM_DEVICES=y
+CONFIG_ARM_THUMB=y
+CONFIG_ARM_THUMBEE=y
+CONFIG_ARM_UNWIND=y
+# CONFIG_ATA is not set
+CONFIG_ATH6KL=m
+CONFIG_ATH6KL_DEBUG=y
+# CONFIG_ATH6KL_USB is not set
+# CONFIG_ATH9K is not set
+# CONFIG_ATMEL_PWM is not set
+# CONFIG_AUTO_ZRELADDR is not set
+# CONFIG_AX88796 is not set
+# CONFIG_B44 is not set
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BPF_JIT is not set
+# CONFIG_BRCMFMAC is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_BT_ATH3K is not set
+# CONFIG_BT_HCIBCM203X is not set
+# CONFIG_BT_HCIBPA10X is not set
+CONFIG_BT_HCIBTSDIO=m
+CONFIG_BT_HCIUART=m
+CONFIG_BT_HCIUART_ATH3K=y
+# CONFIG_BT_HCIUART_BCSP is not set
+CONFIG_BT_HCIUART_H4=y
+CONFIG_BT_HCIUART_LL=y
+CONFIG_CACHE_L2X0=y
+CONFIG_CACHE_PL310=y
+CONFIG_CHARGER_GPIO=y
+# CONFIG_CHARGER_ISP1704 is not set
+# CONFIG_CHARGER_MANAGER is not set
+CONFIG_CHROMEOS_RAMOOPS_RAM_START=0x02000000
+CONFIG_CLKDEV_LOOKUP=y
+CONFIG_CLKSRC_MMIO=y
+CONFIG_CMDLINE="mem=448M@0M console=ttyS0,115200n8 earlyprintk init=/bin/ash"
+# CONFIG_CMDLINE_EXTEND is not set
+# CONFIG_CMDLINE_FORCE is not set
+CONFIG_CMDLINE_FROM_BOOTLOADER=y
+# CONFIG_CORDIC is not set
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+CONFIG_CPU_32v6K=y
+CONFIG_CPU_32v7=y
+CONFIG_CPU_ABRT_EV7=y
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_CPU_CACHE_V7=y
+CONFIG_CPU_CACHE_VIPT=y
+CONFIG_CPU_COPY_V6=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_HAS_ASID=y
+CONFIG_CPU_HAS_PMU=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_IDLE is not set
+CONFIG_CPU_PABRT_V7=y
+CONFIG_CPU_PM=y
+CONFIG_CPU_TLB_V7=y
+CONFIG_CPU_V7=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_CRC8 is not set
+# CONFIG_CRYPTO_CRYPTD is not set
+# CONFIG_CRYPTO_DEV_TEGRA_AES is not set
+# CONFIG_CS89x0 is not set
+# CONFIG_DEBUG_HIGHMEM is not set
+# CONFIG_DEBUG_ICEDCC is not set
+CONFIG_DEBUG_LL=y
+CONFIG_DEBUG_LL_UART_NONE=y
+# CONFIG_DEBUG_PINCTRL is not set
+# CONFIG_DEBUG_SEMIHOSTING is not set
+# CONFIG_DEBUG_USER is not set
+CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
+# CONFIG_DEPRECATED_PARAM_STRUCT is not set
+# CONFIG_DM9000 is not set
+# CONFIG_DMA_SHARED_BUFFER is not set
+# CONFIG_DRM is not set
+CONFIG_DTC=y
+# CONFIG_EEPROM_93CX6 is not set
+CONFIG_ENABLE_WARN_DEPRECATED=y
+# CONFIG_ENC28J60 is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+CONFIG_FLATMEM=y
+CONFIG_FLATMEM_MANUAL=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+CONFIG_FORCE_MAX_ZONEORDER=11
+# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+CONFIG_FRAME_WARN=1024
+# CONFIG_FTGMAC100 is not set
+# CONFIG_FTMAC100 is not set
+CONFIG_FUNCTION_GRAPH_TRACER=y
+CONFIG_HARDIRQS_SW_RESEND=y
+# CONFIG_HARDLOCKUP_DETECTOR is not set
+CONFIG_HAVE_AOUT=y
+CONFIG_HAVE_ARCH_PFN_VALID=y
+CONFIG_HAVE_ARM_SCU=y
+CONFIG_HAVE_ARM_TWD=y
+CONFIG_HAVE_BPF_JIT=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_HAVE_PROC_CPU=y
+CONFIG_HAVE_SMP=y
+# CONFIG_HID_MICROSOFT is not set
+# CONFIG_HID_PID is not set
+CONFIG_HIGHMEM=y
+# CONFIG_HIGHPTE is not set
+# CONFIG_HTC_EGPIO is not set
+# CONFIG_HVC_DCC is not set
+CONFIG_HW_PERF_EVENTS=y
+CONFIG_HZ=100
+# CONFIG_I2C_DESIGNWARE_PLATFORM is not set
+CONFIG_I2C_TEGRA=y
+CONFIG_INPUT_OF_MATRIX_KEYMAP=y
+# CONFIG_INPUT_SPARSEKMAP is not set
+CONFIG_IRQ_DOMAIN=y
+# CONFIG_IRQ_DOMAIN_DEBUG is not set
+# CONFIG_ISCSI_BOOT_SYSFS is not set
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_IWM is not set
+# CONFIG_IWMC3200TOP is not set
+# CONFIG_KEYBOARD_SAMSUNG is not set
+CONFIG_KEYBOARD_TEGRA=y
+# CONFIG_KS8851 is not set
+# CONFIG_KS8851_MLL is not set
+CONFIG_KTIME_SCALAR=y
+CONFIG_LBDAF=y
+# CONFIG_LEDS_REGULATOR is not set
+# CONFIG_LEDS_RENESAS_TPU is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_LIBERTAS_THINFIRM_USB is not set
+# CONFIG_LIBFC is not set
+# CONFIG_LIBFCOE is not set
+CONFIG_LOCAL_TIMERS=y
+# CONFIG_LOW_MEM_NOTIFY is not set
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
+CONFIG_MACH_HARMONY=y
+CONFIG_MACH_HAS_SND_SOC_TEGRA_WM8903=y
+CONFIG_MACH_KAEN=y
+# CONFIG_MACH_PAZ00 is not set
+CONFIG_MACH_SEABOARD=y
+# CONFIG_MACH_TEGRA_DT is not set
+# CONFIG_MACH_TRIMSLICE is not set
+# CONFIG_MACH_VENTANA is not set
+CONFIG_MACH_WARIO=y
+# CONFIG_MFD_ASIC3 is not set
+CONFIG_MFD_CORE=y
+# CONFIG_MFD_NVEC is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
+CONFIG_MFD_TPS6586X=y
+# CONFIG_MG_DISK is not set
+CONFIG_MIGHT_HAVE_CACHE_L2X0=y
+CONFIG_MMC=y
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_BOUNCE=y
+CONFIG_MMC_BLOCK_MINORS=16
+# CONFIG_MMC_CLKGATE is not set
+# CONFIG_MMC_DEBUG is not set
+# CONFIG_MMC_DW is not set
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_IO_ACCESSORS=y
+CONFIG_MMC_SDHCI_PLTFM=y
+# CONFIG_MMC_SDHCI_PXAV2 is not set
+# CONFIG_MMC_SDHCI_PXAV3 is not set
+CONFIG_MMC_SDHCI_TEGRA=y
+# CONFIG_MMC_TEST is not set
+CONFIG_MMC_UNSAFE_RESUME=y
+# CONFIG_MMC_USHC is not set
+# CONFIG_MMC_VUB300 is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_PS2 is not set
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
+CONFIG_MULTI_IRQ_HANDLER=y
+CONFIG_MWIFIEX=m
+CONFIG_MWIFIEX_SDIO=m
+CONFIG_NEED_DMA_MAP_STATE=y
+# CONFIG_NEON is not set
+CONFIG_NET_VENDOR_8390=y
+CONFIG_NET_VENDOR_BROADCOM=y
+CONFIG_NET_VENDOR_CHELSIO=y
+CONFIG_NET_VENDOR_CIRRUS=y
+CONFIG_NET_VENDOR_FARADAY=y
+CONFIG_NET_VENDOR_MARVELL=y
+CONFIG_NET_VENDOR_MICREL=y
+CONFIG_NET_VENDOR_MICROCHIP=y
+CONFIG_NET_VENDOR_NATSEMI=y
+CONFIG_NET_VENDOR_SEEQ=y
+CONFIG_NET_VENDOR_SMSC=y
+CONFIG_NET_VENDOR_STMICRO=y
+CONFIG_NF_CONNTRACK_PROCFS=y
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+CONFIG_NR_CPUS=2
+# CONFIG_OABI_COMPAT is not set
+CONFIG_OF=y
+CONFIG_OF_ADDRESS=y
+CONFIG_OF_DEVICE=y
+CONFIG_OF_EARLY_FLATTREE=y
+CONFIG_OF_FLATTREE=y
+CONFIG_OF_GPIO=y
+CONFIG_OF_I2C=y
+CONFIG_OF_IRQ=y
+CONFIG_OF_MDIO=y
+CONFIG_OF_NET=y
+# CONFIG_OF_SELFTEST is not set
+CONFIG_OF_SPI=y
+CONFIG_OLD_MCOUNT=y
+CONFIG_OUTER_CACHE=y
+CONFIG_OUTER_CACHE_SYNC=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PAGE_OFFSET=0xC0000000
+# CONFIG_PCI_SYSCALL is not set
+CONFIG_PERF_USE_VMALLOC=y
+# CONFIG_PHYS_ADDR_T_64BIT is not set
+CONFIG_PINCONF=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_TEGRA=y
+CONFIG_PINCTRL_TEGRA20=y
+CONFIG_PINMUX=y
+# CONFIG_PL310_ERRATA_588369 is not set
+CONFIG_PL310_ERRATA_727915=y
+CONFIG_PL310_ERRATA_769419=y
+# CONFIG_PLAT_SPEAR is not set
+CONFIG_PM_CLK=y
+CONFIG_PROC_DEVICETREE=y
+# CONFIG_RC_CORE is not set
+CONFIG_REGMAP=y
+CONFIG_REGMAP_I2C=y
+CONFIG_REGMAP_SPI=y
+CONFIG_REGULATOR=y
+# CONFIG_REGULATOR_AD5398 is not set
+# CONFIG_REGULATOR_DEBUG is not set
+# CONFIG_REGULATOR_DUMMY is not set
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+# CONFIG_REGULATOR_GPIO is not set
+# CONFIG_REGULATOR_ISL6271A is not set
+# CONFIG_REGULATOR_LP3971 is not set
+# CONFIG_REGULATOR_LP3972 is not set
+# CONFIG_REGULATOR_MAX1586 is not set
+# CONFIG_REGULATOR_MAX8649 is not set
+# CONFIG_REGULATOR_MAX8660 is not set
+# CONFIG_REGULATOR_MAX8952 is not set
+# CONFIG_REGULATOR_TPS62360 is not set
+# CONFIG_REGULATOR_TPS65023 is not set
+# CONFIG_REGULATOR_TPS6507X is not set
+# CONFIG_REGULATOR_TPS6524X is not set
+CONFIG_REGULATOR_TPS6586X=y
+# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+CONFIG_RFKILL_GPIO=m
+# CONFIG_RFKILL_REGULATOR is not set
+# CONFIG_RT2500USB is not set
+# CONFIG_RT2800USB is not set
+# CONFIG_RT73USB is not set
+# CONFIG_RTC_DRV_CMOS is not set
+# CONFIG_RTC_DRV_TEGRA is not set
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTL8187 is not set
+# CONFIG_RTL8192CU is not set
+# CONFIG_RTLLIB is not set
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+# CONFIG_SCHED_MC is not set
+# CONFIG_SCHED_SMT is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_DEBUG is not set
+CONFIG_SCSI_LOWLEVEL=y
+CONFIG_SCSI_SCAN_ASYNC=y
+# CONFIG_SDIO_UART is not set
+# CONFIG_SEEQ8005 is not set
+# CONFIG_SENSORS_LIS3_SPI is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+# CONFIG_SERIAL_8250_DW is not set
+# CONFIG_SERIAL_8250_EXTENDED is not set
+CONFIG_SERIAL_8250_NR_UARTS=4
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_SERIAL_OF_PLATFORM=y
+# CONFIG_SMC911X is not set
+CONFIG_SMC91X=m
+CONFIG_SMP_ON_UP=y
+# CONFIG_SMSC911X is not set
+# CONFIG_SND_ARM is not set
+CONFIG_SND_PCM=y
+CONFIG_SND_SOC=y
+# CONFIG_SND_SOC_ALL_CODECS is not set
+CONFIG_SND_SOC_I2C_AND_SPI=y
+CONFIG_SND_SOC_TEGRA=y
+# CONFIG_SND_SOC_TEGRA_ALC5632 is not set
+CONFIG_SND_SOC_TEGRA_I2S=y
+CONFIG_SND_SOC_TEGRA_SPDIF=m
+CONFIG_SND_SOC_TEGRA_WM8903=y
+CONFIG_SND_SOC_WM8903=y
+CONFIG_SND_TIMER=y
+# CONFIG_SPI_TEGRA is not set
+CONFIG_SQUASHFS=y
+# CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
+# CONFIG_SQUASHFS_EMBEDDED is not set
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_SQUASHFS_LZO=y
+# CONFIG_SQUASHFS_XATTR is not set
+# CONFIG_SQUASHFS_XZ is not set
+CONFIG_SQUASHFS_ZLIB=y
+# CONFIG_STMMAC_ETH is not set
+CONFIG_SWP_EMULATE=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+CONFIG_TCG_TIS_I2C=y
+# CONFIG_TEGRA_DEBUG_UARTA is not set
+CONFIG_TEGRA_DEBUG_UARTB=y
+# CONFIG_TEGRA_DEBUG_UARTC is not set
+# CONFIG_TEGRA_DEBUG_UARTD is not set
+# CONFIG_TEGRA_DEBUG_UARTE is not set
+# CONFIG_TEGRA_DEBUG_UART_NONE is not set
+# CONFIG_TEGRA_EMC_SCALING_ENABLE is not set
+# CONFIG_TEGRA_IOMMU_GART is not set
+# CONFIG_TEGRA_PCI is not set
+CONFIG_TEGRA_SYSTEM_DMA=y
+# CONFIG_THUMB2_KERNEL is not set
+# CONFIG_TOUCHSCREEN_W90X900 is not set
+# CONFIG_UACCESS_WITH_MEMCPY is not set
+# CONFIG_USB_ARCH_HAS_OHCI is not set
+# CONFIG_USB_ARCH_HAS_XHCI is not set
+CONFIG_USB_EHCI_TEGRA=y
+# CONFIG_USB_HSO is not set
+# CONFIG_USB_NET_DM9601 is not set
+# CONFIG_USB_NET_NET1080 is not set
+CONFIG_USB_OTG_UTILS=y
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_STORAGE_REALTEK is not set
+CONFIG_USB_ULPI=y
+CONFIG_USB_ULPI_VIEWPORT=y
+CONFIG_USE_OF=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_VFP=y
+CONFIG_VFPv3=y
+# CONFIG_VMSPLIT_1G is not set
+# CONFIG_VMSPLIT_2G is not set
+CONFIG_VMSPLIT_3G=y
+# CONFIG_WATCHDOG is not set
+CONFIG_XFRM_USER=m
+# CONFIG_XIP_KERNEL is not set
+CONFIG_XZ_DEC_ARM=y
+CONFIG_XZ_DEC_ARMTHUMB=y
+# CONFIG_XZ_DEC_X86 is not set
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_ZBOOT_ROM_TEXT=0x0
+# CONFIG_ZD1211RW is not set
+CONFIG_ZONE_DMA_FLAG=0
diff --git a/chromeos/config/base.config b/chromeos/config/base.config
new file mode 100644 (file)
index 0000000..f5e6aa6
--- /dev/null
@@ -0,0 +1,1897 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_ABX500_CORE is not set
+# CONFIG_ACCESSIBILITY is not set
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_AD2S1200 is not set
+# CONFIG_AD2S1210 is not set
+# CONFIG_AD2S90 is not set
+# CONFIG_AD5064 is not set
+# CONFIG_AD525X_DPOT is not set
+# CONFIG_AD5360 is not set
+# CONFIG_AD5380 is not set
+# CONFIG_AD5421 is not set
+# CONFIG_AD5446 is not set
+# CONFIG_AD5504 is not set
+# CONFIG_AD5624R_SPI is not set
+# CONFIG_AD5686 is not set
+# CONFIG_AD5764 is not set
+# CONFIG_AD5791 is not set
+# CONFIG_AD5930 is not set
+# CONFIG_AD5933 is not set
+# CONFIG_AD7150 is not set
+# CONFIG_AD7152 is not set
+# CONFIG_AD7192 is not set
+# CONFIG_AD7280 is not set
+# CONFIG_AD7291 is not set
+# CONFIG_AD7298 is not set
+# CONFIG_AD7476 is not set
+# CONFIG_AD7606 is not set
+# CONFIG_AD7746 is not set
+# CONFIG_AD7780 is not set
+# CONFIG_AD7793 is not set
+# CONFIG_AD7816 is not set
+# CONFIG_AD7887 is not set
+# CONFIG_AD799X is not set
+# CONFIG_AD9832 is not set
+# CONFIG_AD9834 is not set
+# CONFIG_AD9850 is not set
+# CONFIG_AD9852 is not set
+# CONFIG_AD9910 is not set
+# CONFIG_AD9951 is not set
+# CONFIG_ADE7753 is not set
+# CONFIG_ADE7754 is not set
+# CONFIG_ADE7758 is not set
+# CONFIG_ADE7759 is not set
+# CONFIG_ADE7854 is not set
+# CONFIG_ADFS_FS is not set
+# CONFIG_ADIS16060 is not set
+# CONFIG_ADIS16080 is not set
+# CONFIG_ADIS16130 is not set
+# CONFIG_ADIS16201 is not set
+# CONFIG_ADIS16203 is not set
+# CONFIG_ADIS16204 is not set
+# CONFIG_ADIS16209 is not set
+# CONFIG_ADIS16220 is not set
+# CONFIG_ADIS16240 is not set
+# CONFIG_ADIS16260 is not set
+# CONFIG_ADIS16400 is not set
+# CONFIG_ADT7310 is not set
+# CONFIG_ADT7316 is not set
+# CONFIG_ADT7410 is not set
+# CONFIG_ADXRS450 is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_AF_RXRPC is not set
+CONFIG_AIO=y
+# CONFIG_ALTERA_STAPL is not set
+# CONFIG_AMD_PHY is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ANDROID is not set
+CONFIG_ANON_INODES=y
+# CONFIG_APDS9802ALS is not set
+CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
+CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_ARPD is not set
+# CONFIG_ASUS_OLED is not set
+# CONFIG_AT76C50X_USB is not set
+# CONFIG_ATALK is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_ATA_OVER_ETH is not set
+# CONFIG_ATH9K_HTC is not set
+CONFIG_ATH_COMMON=m
+CONFIG_ATH_DEBUG=y
+# CONFIG_ATM is not set
+# CONFIG_ATOMIC64_SELFTEST is not set
+# CONFIG_AUDIT is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_AUXDISPLAY is not set
+CONFIG_AVERAGE=y
+# CONFIG_B43 is not set
+# CONFIG_B43LEGACY is not set
+# CONFIG_BACKLIGHT_ADP8860 is not set
+# CONFIG_BACKLIGHT_ADP8870 is not set
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_GENERIC=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+# CONFIG_BACKLIGHT_LP855X is not set
+# CONFIG_BACKTRACE_SELF_TEST is not set
+CONFIG_BASE_FULL=y
+CONFIG_BASE_SMALL=0
+# CONFIG_BATMAN_ADV is not set
+# CONFIG_BATTERY_BQ27x00 is not set
+# CONFIG_BATTERY_DS2780 is not set
+# CONFIG_BATTERY_DS2781 is not set
+# CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_MAX17040 is not set
+# CONFIG_BATTERY_MAX17042 is not set
+# CONFIG_BATTERY_SBS is not set
+# CONFIG_BCMA is not set
+CONFIG_BCMA_POSSIBLE=y
+# CONFIG_BCM_WIMAX is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+CONFIG_BINARY_PRINTF=y
+CONFIG_BINFMT_ELF=y
+# CONFIG_BINFMT_MISC is not set
+CONFIG_BITREVERSE=y
+# CONFIG_BLK_CGROUP is not set
+CONFIG_BLK_DEV=y
+CONFIG_BLK_DEV_BSG=y
+# CONFIG_BLK_DEV_BSGLIB is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_DM=y
+# CONFIG_BLK_DEV_DRBD is not set
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_BLK_DEV_INTEGRITY is not set
+CONFIG_BLK_DEV_IO_TRACE=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
+# CONFIG_BLK_DEV_MD is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BLK_DEV_RAM is not set
+# CONFIG_BLK_DEV_RBD is not set
+CONFIG_BLK_DEV_SD=y
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLOCK=y
+# CONFIG_BMP085 is not set
+# CONFIG_BONDING is not set
+# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
+CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y
+CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=1
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y
+CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1
+# CONFIG_BOOT_PRINTK_DELAY is not set
+CONFIG_BOUNCE=y
+CONFIG_BQL=y
+CONFIG_BRANCH_PROFILE_NONE=y
+# CONFIG_BRIDGE is not set
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+CONFIG_BT=m
+# CONFIG_BTRFS_FS is not set
+# CONFIG_BT_BNEP is not set
+CONFIG_BT_HCIBFUSB=m
+CONFIG_BT_HCIBTUSB=m
+CONFIG_BT_HCIVHCI=m
+CONFIG_BT_HIDP=m
+# CONFIG_BT_MRVL is not set
+CONFIG_BT_RFCOMM=m
+# CONFIG_BT_RFCOMM_TTY is not set
+CONFIG_BUG=y
+# CONFIG_C2PORT is not set
+# CONFIG_CAIF is not set
+# CONFIG_CAN is not set
+CONFIG_CAN_PM_TRACE=y
+# CONFIG_CARL9170 is not set
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_CC_STACKPROTECTOR=y
+# CONFIG_CDROM_PKTCDVD is not set
+# CONFIG_CEPH_LIB is not set
+CONFIG_CFG80211=m
+CONFIG_CFG80211_DEBUGFS=y
+CONFIG_CFG80211_DEFAULT_PS=y
+# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set
+# CONFIG_CFG80211_INTERNAL_REGDB is not set
+# CONFIG_CFG80211_REG_DEBUG is not set
+CONFIG_CFG80211_WEXT=y
+# CONFIG_CFS_BANDWIDTH is not set
+CONFIG_CGROUPS=y
+# CONFIG_CGROUP_CPUACCT is not set
+# CONFIG_CGROUP_DEBUG is not set
+# CONFIG_CGROUP_DEVICE is not set
+# CONFIG_CGROUP_FREEZER is not set
+# CONFIG_CGROUP_PERF is not set
+CONFIG_CGROUP_SCHED=y
+# CONFIG_CHARGER_LP8727 is not set
+# CONFIG_CHARGER_MAX8903 is not set
+# CONFIG_CHARGER_SMB347 is not set
+# CONFIG_CHECKPOINT_RESTORE is not set
+CONFIG_CHROMEOS=y
+CONFIG_CHROMEOS_RAMOOPS_DUMP_OOPS=0x1
+CONFIG_CHROMEOS_RAMOOPS_RAM_SIZE=0x00100000
+CONFIG_CHROMEOS_RAMOOPS_RECORD_SIZE=0x00020000
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_CHR_DEV_SCH is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CICADA_PHY is not set
+# CONFIG_CLEANCACHE is not set
+# CONFIG_COMPACTION is not set
+# CONFIG_COMPAT_BRK is not set
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_CONNECTOR=y
+CONFIG_CONSOLE_TRANSLATIONS=y
+CONFIG_CONTEXT_SWITCH_TRACER=y
+# CONFIG_CPUSETS is not set
+CONFIG_CPU_FREQ=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+CONFIG_CPU_FREQ_GOV_ONDEMAND=y
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
+CONFIG_CPU_RMAP=y
+# CONFIG_CRAMFS is not set
+CONFIG_CRC16=y
+CONFIG_CRC32=y
+# CONFIG_CRC32_BIT is not set
+# CONFIG_CRC32_SARWATE is not set
+# CONFIG_CRC32_SELFTEST is not set
+# CONFIG_CRC32_SLICEBY4 is not set
+CONFIG_CRC32_SLICEBY8=y
+CONFIG_CRC7=m
+CONFIG_CRC_CCITT=y
+CONFIG_CRC_ITU_T=m
+CONFIG_CRC_T10DIF=m
+CONFIG_CROSS_COMPILE=""
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_AEAD=y
+CONFIG_CRYPTO_AEAD2=y
+CONFIG_CRYPTO_AES=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_ALGAPI2=y
+# CONFIG_CRYPTO_ANSI_CPRNG is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_ARC4=y
+CONFIG_CRYPTO_AUTHENC=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_BLKCIPHER2=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_CAMELLIA is not set
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+CONFIG_CRYPTO_CBC=y
+# CONFIG_CRYPTO_CCM is not set
+CONFIG_CRYPTO_CRC32C=m
+# CONFIG_CRYPTO_CTR is not set
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_DEFLATE=m
+CONFIG_CRYPTO_DES=y
+CONFIG_CRYPTO_ECB=y
+# CONFIG_CRYPTO_FCRYPT is not set
+# CONFIG_CRYPTO_GCM is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+# CONFIG_CRYPTO_GHASH is not set
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_HMAC=y
+CONFIG_CRYPTO_HW=y
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_LRW is not set
+# CONFIG_CRYPTO_LZO is not set
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_MANAGER2=y
+CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_PCBC is not set
+CONFIG_CRYPTO_PCOMP2=y
+# CONFIG_CRYPTO_PCRYPT is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
+CONFIG_CRYPTO_RNG2=y
+# CONFIG_CRYPTO_SALSA20 is not set
+# CONFIG_CRYPTO_SEED is not set
+# CONFIG_CRYPTO_SEQIV is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_SHA1=y
+CONFIG_CRYPTO_SHA256=y
+CONFIG_CRYPTO_SHA512=m
+# CONFIG_CRYPTO_TEA is not set
+# CONFIG_CRYPTO_TEST is not set
+# CONFIG_CRYPTO_TGR192 is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_USER is not set
+# CONFIG_CRYPTO_USER_API_HASH is not set
+# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
+# CONFIG_CRYPTO_VMAC is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_XCBC is not set
+# CONFIG_CRYPTO_XTS is not set
+# CONFIG_CRYPTO_ZLIB is not set
+# CONFIG_CUSE is not set
+# CONFIG_DAVICOM_PHY is not set
+# CONFIG_DCB is not set
+# CONFIG_DEBUG_ATOMIC_SLEEP is not set
+# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+# CONFIG_DEBUG_CREDENTIALS is not set
+CONFIG_DEBUG_DEVRES=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
+CONFIG_DEBUG_FS=y
+CONFIG_DEBUG_GPIO=y
+# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_KERNEL=y
+# CONFIG_DEBUG_KMEMLEAK is not set
+# CONFIG_DEBUG_KOBJECT is not set
+# CONFIG_DEBUG_LIST is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_LOCK_ALLOC is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
+# CONFIG_DEBUG_MUTEXES is not set
+# CONFIG_DEBUG_NOTIFIERS is not set
+# CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
+# CONFIG_DEBUG_PER_CPU_MAPS is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_DEBUG_SECTION_MISMATCH is not set
+# CONFIG_DEBUG_SG is not set
+# CONFIG_DEBUG_SHIRQ is not set
+CONFIG_DEBUG_SPINLOCK=y
+# CONFIG_DEBUG_STACK_USAGE is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DECNET is not set
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DECOMPRESS_XZ=y
+CONFIG_DEFAULT_CFQ=y
+CONFIG_DEFAULT_CUBIC=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_HOSTNAME="(none)"
+CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_DEFAULT_MESSAGE_LOGLEVEL=5
+# CONFIG_DEFAULT_NOOP is not set
+# CONFIG_DEFAULT_RENO is not set
+CONFIG_DEFAULT_SECURITY=""
+# CONFIG_DEFAULT_SECURITY_CHROMIUMOS is not set
+CONFIG_DEFAULT_SECURITY_DAC=y
+# CONFIG_DEFAULT_SECURITY_YAMA is not set
+CONFIG_DEFAULT_TCP_CONG="cubic"
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+CONFIG_DETECT_HUNG_TASK=y
+# CONFIG_DEVKMEM is not set
+# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_DMADEVICES is not set
+# CONFIG_DMA_API_DEBUG is not set
+CONFIG_DM_BHT=y
+CONFIG_DM_CRYPT=y
+# CONFIG_DM_DEBUG is not set
+# CONFIG_DM_DELAY is not set
+# CONFIG_DM_FLAKEY is not set
+# CONFIG_DM_MIRROR is not set
+# CONFIG_DM_MULTIPATH is not set
+# CONFIG_DM_RAID is not set
+# CONFIG_DM_SNAPSHOT is not set
+# CONFIG_DM_THIN_PROVISIONING is not set
+# CONFIG_DM_UEVENT is not set
+CONFIG_DM_VERITY=y
+CONFIG_DM_VERITY_CHROMEOS=y
+# CONFIG_DM_ZERO is not set
+# CONFIG_DNET is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_DNS_RESOLVER is not set
+CONFIG_DQL=y
+# CONFIG_DS1682 is not set
+# CONFIG_DUMMY is not set
+CONFIG_DUMMY_CONSOLE=y
+# CONFIG_DVB_CORE is not set
+# CONFIG_DYNAMIC_DEBUG is not set
+CONFIG_DYNAMIC_FTRACE=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_ECHO is not set
+# CONFIG_ECONET is not set
+CONFIG_ECRYPT_FS=y
+# CONFIG_EEPROM_93XX46 is not set
+# CONFIG_EEPROM_AT24 is not set
+# CONFIG_EEPROM_AT25 is not set
+# CONFIG_EEPROM_LEGACY is not set
+# CONFIG_EEPROM_MAX6875 is not set
+CONFIG_EFI_PARTITION=y
+# CONFIG_EFS_FS is not set
+CONFIG_ELF_CORE=y
+CONFIG_EMBEDDED=y
+CONFIG_ENABLE_MUST_CHECK=y
+# CONFIG_ENCLOSURE_SERVICES is not set
+# CONFIG_ENCRYPTED_KEYS is not set
+CONFIG_EPOLL=y
+# CONFIG_EQUALIZER is not set
+CONFIG_ETHERNET=y
+# CONFIG_ETHOC is not set
+CONFIG_EVENTFD=y
+CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
+CONFIG_EVENT_TRACING=y
+# CONFIG_EVM is not set
+CONFIG_EXPERIMENTAL=y
+CONFIG_EXPERT=y
+CONFIG_EXT2_FS=y
+CONFIG_EXT2_FS_POSIX_ACL=y
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_EXT2_FS_XATTR=y
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_POSIX_ACL=y
+CONFIG_EXT3_FS_SECURITY=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT4_DEBUG is not set
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_FS_POSIX_ACL=y
+CONFIG_EXT4_FS_SECURITY=y
+CONFIG_EXT4_FS_XATTR=y
+# CONFIG_EXYNOS_VIDEO is not set
+# CONFIG_EZX_PCAP is not set
+CONFIG_FAIR_GROUP_SCHED=y
+# CONFIG_FANOTIFY is not set
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+CONFIG_FAT_FS=m
+# CONFIG_FAULT_INJECTION is not set
+CONFIG_FB=y
+# CONFIG_FB_BOOT_VESA_SUPPORT is not set
+# CONFIG_FB_BROADSHEET is not set
+# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
+# CONFIG_FB_DDC is not set
+# CONFIG_FB_FOREIGN_ENDIAN is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_METRONOME is not set
+CONFIG_FB_MODE_HELPERS=y
+# CONFIG_FB_S1D13XXX is not set
+# CONFIG_FB_SM7XX is not set
+# CONFIG_FB_SMSCUFX is not set
+# CONFIG_FB_SVGALIB is not set
+# CONFIG_FB_SYS_COPYAREA is not set
+# CONFIG_FB_SYS_FILLRECT is not set
+# CONFIG_FB_SYS_FOPS is not set
+# CONFIG_FB_SYS_IMAGEBLIT is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_TMIO is not set
+# CONFIG_FB_UDL is not set
+# CONFIG_FB_UVESA is not set
+# CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_WMT_GE_ROPS is not set
+# CONFIG_FHANDLE is not set
+CONFIG_FILE_LOCKING=y
+# CONFIG_FIRMWARE_EDID is not set
+CONFIG_FIRMWARE_IN_KERNEL=y
+# CONFIG_FIXED_PHY is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x16=y
+CONFIG_FONT_8x8=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FREEZER=y
+# CONFIG_FSCACHE is not set
+CONFIG_FSNOTIFY=y
+CONFIG_FS_MBCACHE=y
+CONFIG_FS_POSIX_ACL=y
+# CONFIG_FT1000 is not set
+CONFIG_FTRACE=y
+CONFIG_FTRACE_MCOUNT_RECORD=y
+# CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_FUNCTION_PROFILER is not set
+CONFIG_FUNCTION_TRACER=y
+CONFIG_FUSE_FS=m
+CONFIG_FUTEX=y
+CONFIG_FW_LOADER=y
+# CONFIG_GAMEPORT is not set
+# CONFIG_GCOV_KERNEL is not set
+CONFIG_GENERIC_ACL=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+# CONFIG_GENERIC_CPU_DEVICES is not set
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_IO=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_GENERIC_PCI_IOMAP=y
+CONFIG_GENERIC_TRACER=y
+# CONFIG_GFS2_FS is not set
+CONFIG_GPIOLIB=y
+# CONFIG_GPIO_74X164 is not set
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_GENERIC_PLATFORM is not set
+# CONFIG_GPIO_MAX7300 is not set
+# CONFIG_GPIO_MAX7301 is not set
+# CONFIG_GPIO_MAX732X is not set
+# CONFIG_GPIO_MC33880 is not set
+# CONFIG_GPIO_MCP23S08 is not set
+# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_PCF857X is not set
+# CONFIG_GPIO_SX150X is not set
+CONFIG_GPIO_SYSFS=y
+# CONFIG_HAMRADIO is not set
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAVE_ARCH_JUMP_LABEL=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
+CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_DMA_API_DEBUG=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
+CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
+CONFIG_HAVE_FUNCTION_TRACER=y
+CONFIG_HAVE_GENERIC_HARDIRQS=y
+CONFIG_HAVE_HW_BREAKPOINT=y
+CONFIG_HAVE_IRQ_WORK=y
+CONFIG_HAVE_KERNEL_GZIP=y
+CONFIG_HAVE_KERNEL_LZMA=y
+CONFIG_HAVE_KERNEL_LZO=y
+CONFIG_HAVE_KERNEL_XZ=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_MEMBLOCK=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
+# CONFIG_HEADERS_CHECK is not set
+CONFIG_HFSPLUS_FS=m
+# CONFIG_HFS_FS is not set
+CONFIG_HID=y
+CONFIG_HIDRAW=y
+# CONFIG_HID_A4TECH is not set
+# CONFIG_HID_ACRUX is not set
+CONFIG_HID_APPLE=m
+# CONFIG_HID_BATTERY_STRENGTH is not set
+# CONFIG_HID_BELKIN is not set
+# CONFIG_HID_CHERRY is not set
+# CONFIG_HID_CHICONY is not set
+# CONFIG_HID_CYPRESS is not set
+# CONFIG_HID_DRAGONRISE is not set
+# CONFIG_HID_ELECOM is not set
+# CONFIG_HID_EMS_FF is not set
+# CONFIG_HID_EZKEY is not set
+# CONFIG_HID_GREENASIA is not set
+# CONFIG_HID_GYRATION is not set
+# CONFIG_HID_HOLTEK is not set
+# CONFIG_HID_KENSINGTON is not set
+# CONFIG_HID_KEYTOUCH is not set
+# CONFIG_HID_KYE is not set
+# CONFIG_HID_LCPOWER is not set
+CONFIG_HID_LOGITECH=m
+CONFIG_HID_LOGITECH_DJ=m
+CONFIG_HID_MAGICMOUSE=m
+# CONFIG_HID_MONTEREY is not set
+CONFIG_HID_MULTITOUCH=m
+# CONFIG_HID_NTRIG is not set
+# CONFIG_HID_ORTEK is not set
+# CONFIG_HID_PANTHERLORD is not set
+# CONFIG_HID_PETALYNX is not set
+# CONFIG_HID_PICOLCD is not set
+CONFIG_HID_PRIMAX=m
+# CONFIG_HID_PRODIKEYS is not set
+# CONFIG_HID_ROCCAT is not set
+# CONFIG_HID_SAITEK is not set
+# CONFIG_HID_SAMSUNG is not set
+# CONFIG_HID_SMARTJOYPLUS is not set
+CONFIG_HID_SONY=m
+# CONFIG_HID_SPEEDLINK is not set
+# CONFIG_HID_SUNPLUS is not set
+CONFIG_HID_SUPPORT=y
+# CONFIG_HID_THRUSTMASTER is not set
+# CONFIG_HID_TIVO is not set
+# CONFIG_HID_TOPSEED is not set
+# CONFIG_HID_TWINHAN is not set
+# CONFIG_HID_UCLOGIC is not set
+# CONFIG_HID_WACOM is not set
+# CONFIG_HID_WALTOP is not set
+CONFIG_HID_WIIMOTE=m
+CONFIG_HID_WIIMOTE_EXT=y
+# CONFIG_HID_ZEROPLUS is not set
+# CONFIG_HID_ZYDACRON is not set
+CONFIG_HIGH_RES_TIMERS=y
+# CONFIG_HMC6352 is not set
+CONFIG_HOSTAP=m
+CONFIG_HOSTAP_FIRMWARE=y
+CONFIG_HOSTAP_FIRMWARE_NVRAM=y
+CONFIG_HOTPLUG=y
+CONFIG_HOTPLUG_CPU=y
+# CONFIG_HPFS_FS is not set
+# CONFIG_HSI is not set
+# CONFIG_HTC_I2CPLD is not set
+# CONFIG_HTC_PASIC3 is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_DEBUG_CHIP is not set
+# CONFIG_HWMON_VID is not set
+CONFIG_HW_CONSOLE=y
+CONFIG_HW_RANDOM=y
+# CONFIG_HW_RANDOM_TIMERIOMEM is not set
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_COMPAT=y
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DIOLAN_U2C is not set
+# CONFIG_I2C_GPIO is not set
+CONFIG_I2C_HELPER_AUTO=y
+# CONFIG_I2C_MUX is not set
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_PXA_PCI is not set
+# CONFIG_I2C_SIMTEC is not set
+CONFIG_I2C_STUB=m
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+# CONFIG_I2C_XILINX is not set
+# CONFIG_ICPLUS_PHY is not set
+# CONFIG_ICS932S401 is not set
+# CONFIG_IEEE802154 is not set
+CONFIG_IIO=m
+# CONFIG_IIO_BUFFER is not set
+# CONFIG_IIO_SIMPLE_DUMMY is not set
+# CONFIG_IIO_ST_HWMON is not set
+# CONFIG_IIO_TRIGGER is not set
+CONFIG_IKCONFIG=m
+CONFIG_IKCONFIG_PROC=y
+# CONFIG_IMA is not set
+CONFIG_INET=y
+CONFIG_INET6_AH=m
+CONFIG_INET6_ESP=m
+# CONFIG_INET6_IPCOMP is not set
+# CONFIG_INET6_TUNNEL is not set
+CONFIG_INET6_XFRM_MODE_BEET=m
+# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
+CONFIG_INET6_XFRM_MODE_TRANSPORT=m
+CONFIG_INET6_XFRM_MODE_TUNNEL=m
+# CONFIG_INET6_XFRM_TUNNEL is not set
+CONFIG_INET_AH=m
+# CONFIG_INET_DIAG is not set
+CONFIG_INET_ESP=m
+CONFIG_INET_IPCOMP=m
+CONFIG_INET_LRO=y
+CONFIG_INET_TUNNEL=m
+CONFIG_INET_XFRM_MODE_BEET=m
+CONFIG_INET_XFRM_MODE_TRANSPORT=m
+CONFIG_INET_XFRM_MODE_TUNNEL=m
+CONFIG_INET_XFRM_TUNNEL=m
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_ENV_ARG_LIMIT=32
+# CONFIG_INLINE_READ_LOCK is not set
+# CONFIG_INLINE_READ_LOCK_BH is not set
+# CONFIG_INLINE_READ_LOCK_IRQ is not set
+# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_READ_TRYLOCK is not set
+# CONFIG_INLINE_READ_UNLOCK is not set
+# CONFIG_INLINE_READ_UNLOCK_BH is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
+# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_SPIN_LOCK is not set
+# CONFIG_INLINE_SPIN_LOCK_BH is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_SPIN_TRYLOCK is not set
+# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
+# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
+# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
+# CONFIG_INLINE_WRITE_LOCK is not set
+# CONFIG_INLINE_WRITE_LOCK_BH is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
+# CONFIG_INLINE_WRITE_TRYLOCK is not set
+# CONFIG_INLINE_WRITE_UNLOCK is not set
+# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
+# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
+CONFIG_INOTIFY_USER=y
+CONFIG_INPUT=y
+# CONFIG_INPUT_AD714X is not set
+# CONFIG_INPUT_ADXL34X is not set
+# CONFIG_INPUT_ATI_REMOTE2 is not set
+# CONFIG_INPUT_BMA150 is not set
+# CONFIG_INPUT_CM109 is not set
+# CONFIG_INPUT_CMA3000 is not set
+# CONFIG_INPUT_EVBUG is not set
+CONFIG_INPUT_EVDEV=y
+CONFIG_INPUT_FF_MEMLESS=y
+# CONFIG_INPUT_GP2A is not set
+# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
+# CONFIG_INPUT_GPIO_TILT_POLLED is not set
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_JOYSTICK=y
+CONFIG_INPUT_KEYBOARD=y
+# CONFIG_INPUT_KEYSPAN_REMOTE is not set
+# CONFIG_INPUT_KXTJ9 is not set
+CONFIG_INPUT_MISC=y
+# CONFIG_INPUT_MMA8450 is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_MPU3050 is not set
+# CONFIG_INPUT_PCF8574 is not set
+CONFIG_INPUT_POLLDEV=y
+# CONFIG_INPUT_POWERMATE is not set
+# CONFIG_INPUT_TABLET is not set
+CONFIG_INPUT_TOUCHSCREEN=y
+CONFIG_INPUT_UINPUT=m
+# CONFIG_INPUT_YEALINK is not set
+CONFIG_IOMMU_SUPPORT=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IP6_NF_FILTER=m
+CONFIG_IP6_NF_IPTABLES=m
+CONFIG_IP6_NF_MANGLE=m
+CONFIG_IP6_NF_MATCH_IPV6HEADER=m
+# CONFIG_IP6_NF_RAW is not set
+CONFIG_IP6_NF_TARGET_REJECT=m
+CONFIG_IPC_NS=y
+# CONFIG_IPMI_HANDLER is not set
+CONFIG_IPV6=y
+# CONFIG_IPV6_MIP6 is not set
+# CONFIG_IPV6_MROUTE is not set
+# CONFIG_IPV6_MULTIPLE_TABLES is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_OPTIMISTIC_DAD is not set
+CONFIG_IPV6_PRIVACY=y
+# CONFIG_IPV6_ROUTER_PREF is not set
+CONFIG_IPV6_SIT=m
+# CONFIG_IPV6_SIT_6RD is not set
+# CONFIG_IPV6_TUNNEL is not set
+# CONFIG_IPX is not set
+CONFIG_IP_ADVANCED_ROUTER=y
+# CONFIG_IP_DCCP is not set
+# CONFIG_IP_FIB_TRIE_STATS is not set
+CONFIG_IP_MROUTE=y
+# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
+CONFIG_IP_MULTICAST=y
+# CONFIG_IP_MULTIPLE_TABLES is not set
+CONFIG_IP_NF_FILTER=y
+CONFIG_IP_NF_IPTABLES=y
+CONFIG_IP_NF_MANGLE=y
+# CONFIG_IP_NF_RAW is not set
+CONFIG_IP_NF_TARGET_REJECT=y
+CONFIG_IP_NF_TARGET_ULOG=y
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+# CONFIG_IP_PNP is not set
+CONFIG_IP_ROUTE_MULTIPATH=y
+CONFIG_IP_ROUTE_VERBOSE=y
+# CONFIG_IP_SCTP is not set
+# CONFIG_IP_SET is not set
+# CONFIG_IP_VS is not set
+# CONFIG_IRDA is not set
+# CONFIG_IRQSOFF_TRACER is not set
+CONFIG_IRQ_WORK=y
+# CONFIG_ISDN is not set
+# CONFIG_ISL29003 is not set
+# CONFIG_ISL29020 is not set
+CONFIG_ISO9660_FS=m
+CONFIG_JBD=y
+CONFIG_JBD2=y
+# CONFIG_JBD2_DEBUG is not set
+# CONFIG_JBD_DEBUG is not set
+# CONFIG_JFS_FS is not set
+CONFIG_JOLIET=y
+# CONFIG_JOYSTICK_A3D is not set
+# CONFIG_JOYSTICK_ADI is not set
+# CONFIG_JOYSTICK_ANALOG is not set
+# CONFIG_JOYSTICK_AS5011 is not set
+# CONFIG_JOYSTICK_COBRA is not set
+# CONFIG_JOYSTICK_GF2K is not set
+# CONFIG_JOYSTICK_GRIP is not set
+# CONFIG_JOYSTICK_GRIP_MP is not set
+# CONFIG_JOYSTICK_GUILLEMOT is not set
+CONFIG_JOYSTICK_IFORCE=m
+# CONFIG_JOYSTICK_IFORCE_232 is not set
+CONFIG_JOYSTICK_IFORCE_USB=y
+# CONFIG_JOYSTICK_INTERACT is not set
+# CONFIG_JOYSTICK_JOYDUMP is not set
+# CONFIG_JOYSTICK_MAGELLAN is not set
+# CONFIG_JOYSTICK_SIDEWINDER is not set
+# CONFIG_JOYSTICK_SPACEBALL is not set
+# CONFIG_JOYSTICK_SPACEORB is not set
+# CONFIG_JOYSTICK_STINGER is not set
+# CONFIG_JOYSTICK_TMDC is not set
+# CONFIG_JOYSTICK_TWIDJOY is not set
+# CONFIG_JOYSTICK_WARRIOR is not set
+CONFIG_JOYSTICK_XPAD=m
+CONFIG_JOYSTICK_XPAD_FF=y
+CONFIG_JOYSTICK_XPAD_LEDS=y
+# CONFIG_JOYSTICK_ZHENHUA is not set
+# CONFIG_JUMP_LABEL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KARMA_PARTITION is not set
+CONFIG_KERNEL_GZIP=y
+# CONFIG_KERNEL_LZMA is not set
+# CONFIG_KERNEL_LZO is not set
+# CONFIG_KERNEL_XZ is not set
+# CONFIG_KEXEC is not set
+# CONFIG_KEYBOARD_ADP5588 is not set
+# CONFIG_KEYBOARD_ADP5589 is not set
+CONFIG_KEYBOARD_ATKBD=y
+CONFIG_KEYBOARD_GPIO=y
+# CONFIG_KEYBOARD_GPIO_POLLED is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_LM8323 is not set
+# CONFIG_KEYBOARD_MATRIX is not set
+# CONFIG_KEYBOARD_MAX7359 is not set
+# CONFIG_KEYBOARD_MCS is not set
+# CONFIG_KEYBOARD_MPR121 is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_OMAP4 is not set
+# CONFIG_KEYBOARD_OPENCORES is not set
+# CONFIG_KEYBOARD_QT1070 is not set
+# CONFIG_KEYBOARD_QT2160 is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_TCA6416 is not set
+# CONFIG_KEYBOARD_TCA8418 is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+CONFIG_KEYS=y
+CONFIG_KEYS_DEBUG_PROC_KEYS=y
+# CONFIG_KGDB is not set
+# CONFIG_KPROBES is not set
+# CONFIG_KSM is not set
+# CONFIG_KXSD9 is not set
+# CONFIG_L2TP is not set
+# CONFIG_LAPB is not set
+# CONFIG_LCD_CLASS_DEVICE is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_LEDS_BD2802 is not set
+CONFIG_LEDS_CLASS=y
+# CONFIG_LEDS_DAC124S085 is not set
+# CONFIG_LEDS_GPIO is not set
+# CONFIG_LEDS_LM3530 is not set
+# CONFIG_LEDS_LP3944 is not set
+# CONFIG_LEDS_LP5521 is not set
+# CONFIG_LEDS_LP5523 is not set
+# CONFIG_LEDS_LT3593 is not set
+# CONFIG_LEDS_OT200 is not set
+# CONFIG_LEDS_PCA9532 is not set
+# CONFIG_LEDS_PCA955X is not set
+# CONFIG_LEDS_PCA9633 is not set
+# CONFIG_LEDS_TCA6507 is not set
+CONFIG_LEDS_TRIGGERS=y
+# CONFIG_LEDS_TRIGGER_BACKLIGHT is not set
+# CONFIG_LEDS_TRIGGER_DEFAULT_ON is not set
+# CONFIG_LEDS_TRIGGER_GPIO is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+# CONFIG_LEDS_TRIGGER_TIMER is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_LIB80211=m
+CONFIG_LIB80211_CRYPT_CCMP=m
+CONFIG_LIB80211_CRYPT_TKIP=m
+CONFIG_LIB80211_CRYPT_WEP=m
+# CONFIG_LIB80211_DEBUG is not set
+CONFIG_LIBCRC32C=m
+CONFIG_LIBERTAS_THINFIRM=m
+# CONFIG_LIBERTAS_THINFIRM_DEBUG is not set
+# CONFIG_LINE6_USB is not set
+# CONFIG_LIS3L02DQ is not set
+# CONFIG_LKDTM is not set
+# CONFIG_LLC2 is not set
+CONFIG_LOCALVERSION=""
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_LOCKDEP_SUPPORT=y
+CONFIG_LOCKUP_DETECTOR=y
+# CONFIG_LOCK_STAT is not set
+# CONFIG_LOGFS is not set
+# CONFIG_LOGIG940_FF is not set
+# CONFIG_LOGIRUMBLEPAD2_FF is not set
+# CONFIG_LOGITECH_FF is not set
+# CONFIG_LOGIWHEELS_FF is not set
+# CONFIG_LOGO is not set
+CONFIG_LOG_BUF_SHIFT=18
+# CONFIG_LSI_ET1011C_PHY is not set
+# CONFIG_LXT_PHY is not set
+CONFIG_MAC80211=m
+CONFIG_MAC80211_DEBUGFS=y
+# CONFIG_MAC80211_DEBUG_COUNTERS is not set
+CONFIG_MAC80211_DEBUG_MENU=y
+# CONFIG_MAC80211_DRIVER_API_TRACER is not set
+CONFIG_MAC80211_HAS_RC=y
+# CONFIG_MAC80211_HT_DEBUG is not set
+CONFIG_MAC80211_HWSIM=m
+# CONFIG_MAC80211_IBSS_DEBUG is not set
+CONFIG_MAC80211_LEDS=y
+# CONFIG_MAC80211_MESH is not set
+# CONFIG_MAC80211_NOINLINE is not set
+CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
+CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL=y
+CONFIG_MAC80211_RC_MINSTREL_HT=y
+# CONFIG_MAC80211_RC_PID is not set
+# CONFIG_MAC80211_TKIP_DEBUG is not set
+CONFIG_MAC80211_VERBOSE_DEBUG=y
+# CONFIG_MAC80211_VERBOSE_PS_DEBUG is not set
+# CONFIG_MAC80211_VERBOSE_TDLS_DEBUG is not set
+# CONFIG_MACVLAN is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_MARVELL_PHY is not set
+# CONFIG_MAX1363 is not set
+# CONFIG_MAX517 is not set
+CONFIG_MD=y
+# CONFIG_MDIO_BITBANG is not set
+# CONFIG_MEDIA_ATTACH is not set
+# CONFIG_MEDIA_CONTROLLER is not set
+CONFIG_MEDIA_SUPPORT=m
+CONFIG_MEDIA_TUNER=m
+# CONFIG_MEDIA_TUNER_CUSTOMISE is not set
+CONFIG_MEDIA_TUNER_MC44S803=m
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA18271=m
+CONFIG_MEDIA_TUNER_TDA827X=m
+CONFIG_MEDIA_TUNER_TDA8290=m
+CONFIG_MEDIA_TUNER_TDA9887=m
+CONFIG_MEDIA_TUNER_TEA5761=m
+CONFIG_MEDIA_TUNER_TEA5767=m
+CONFIG_MEDIA_TUNER_XC2028=m
+CONFIG_MEDIA_TUNER_XC4000=m
+CONFIG_MEDIA_TUNER_XC5000=m
+# CONFIG_MEMSTICK is not set
+# CONFIG_MFD_88PM860X is not set
+# CONFIG_MFD_AAT2870_CORE is not set
+# CONFIG_MFD_DA9052_I2C is not set
+# CONFIG_MFD_DA9052_SPI is not set
+# CONFIG_MFD_MAX8925 is not set
+# CONFIG_MFD_MAX8997 is not set
+# CONFIG_MFD_MAX8998 is not set
+# CONFIG_MFD_MC13XXX is not set
+# CONFIG_MFD_PCF50633 is not set
+# CONFIG_MFD_RC5T583 is not set
+# CONFIG_MFD_S5M_CORE is not set
+# CONFIG_MFD_SM501 is not set
+# CONFIG_MFD_STMPE is not set
+# CONFIG_MFD_TC3589X is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_TPS65090 is not set
+# CONFIG_MFD_TPS65217 is not set
+# CONFIG_MFD_TPS65910 is not set
+# CONFIG_MFD_TPS65912_I2C is not set
+# CONFIG_MFD_TPS65912_SPI is not set
+# CONFIG_MFD_WL1273_CORE is not set
+# CONFIG_MFD_WM831X_I2C is not set
+# CONFIG_MFD_WM831X_SPI is not set
+# CONFIG_MFD_WM8350_I2C is not set
+# CONFIG_MFD_WM8400 is not set
+# CONFIG_MFD_WM8994 is not set
+# CONFIG_MICREL_KS8995MA is not set
+# CONFIG_MICREL_PHY is not set
+CONFIG_MII=y
+# CONFIG_MINIX_FS is not set
+# CONFIG_MINIX_SUBPARTITION is not set
+CONFIG_MISC_FILESYSTEMS=y
+CONFIG_MMAP_NOEXEC_TAINT=0
+CONFIG_MMU=y
+CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MODULE_FORCE_UNLOAD=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MOUSE_BCM5974 is not set
+CONFIG_MOUSE_CYAPA=y
+# CONFIG_MOUSE_GPIO is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_SYNAPTICS_I2C is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MSDOS_FS is not set
+CONFIG_MSDOS_PARTITION=y
+# CONFIG_MTD is not set
+CONFIG_MUTEX_SPIN_ON_OWNER=y
+CONFIG_NAMESPACES=y
+# CONFIG_NATIONAL_PHY is not set
+CONFIG_NET=y
+# CONFIG_NETCONSOLE is not set
+CONFIG_NETDEVICES=y
+CONFIG_NETFILTER=y
+# CONFIG_NETFILTER_ADVANCED is not set
+# CONFIG_NETFILTER_DEBUG is not set
+CONFIG_NETFILTER_NETLINK=y
+CONFIG_NETFILTER_NETLINK_LOG=y
+CONFIG_NETFILTER_XTABLES=y
+CONFIG_NETFILTER_XT_MARK=m
+CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
+CONFIG_NETFILTER_XT_MATCH_POLICY=y
+CONFIG_NETFILTER_XT_MATCH_STATE=y
+# CONFIG_NETFILTER_XT_TARGET_LOG is not set
+CONFIG_NETFILTER_XT_TARGET_NFLOG=y
+CONFIG_NETFILTER_XT_TARGET_SECMARK=y
+CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
+# CONFIG_NETLABEL is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NETPRIO_CGROUP is not set
+# CONFIG_NETWORK_FILESYSTEMS is not set
+# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
+CONFIG_NETWORK_SECMARK=y
+# CONFIG_NET_9P is not set
+# CONFIG_NET_CALXEDA_XGMAC is not set
+# CONFIG_NET_CLS_ACT is not set
+# CONFIG_NET_CLS_BASIC is not set
+# CONFIG_NET_CLS_CGROUP is not set
+# CONFIG_NET_CLS_FLOW is not set
+# CONFIG_NET_CLS_FW is not set
+# CONFIG_NET_CLS_ROUTE4 is not set
+# CONFIG_NET_CLS_RSVP is not set
+# CONFIG_NET_CLS_RSVP6 is not set
+# CONFIG_NET_CLS_TCINDEX is not set
+# CONFIG_NET_CLS_U32 is not set
+CONFIG_NET_CORE=y
+# CONFIG_NET_DROP_MONITOR is not set
+# CONFIG_NET_DSA is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_IPGRE_DEMUX is not set
+# CONFIG_NET_IPIP is not set
+CONFIG_NET_KEY=m
+# CONFIG_NET_KEY_MIGRATE is not set
+CONFIG_NET_NS=y
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+CONFIG_NET_SCHED=y
+# CONFIG_NET_SCH_CBQ is not set
+# CONFIG_NET_SCH_CHOKE is not set
+# CONFIG_NET_SCH_DRR is not set
+# CONFIG_NET_SCH_DSMARK is not set
+CONFIG_NET_SCH_FIFO=y
+# CONFIG_NET_SCH_GRED is not set
+# CONFIG_NET_SCH_HFSC is not set
+# CONFIG_NET_SCH_HTB is not set
+# CONFIG_NET_SCH_MQPRIO is not set
+# CONFIG_NET_SCH_MULTIQ is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_SCH_PLUG is not set
+# CONFIG_NET_SCH_PRIO is not set
+# CONFIG_NET_SCH_QFQ is not set
+# CONFIG_NET_SCH_RED is not set
+# CONFIG_NET_SCH_SFB is not set
+# CONFIG_NET_SCH_SFQ is not set
+# CONFIG_NET_SCH_TBF is not set
+# CONFIG_NET_SCH_TEQL is not set
+# CONFIG_NET_TEAM is not set
+CONFIG_NET_VENDOR_I825XX=y
+CONFIG_NET_VENDOR_INTEL=y
+CONFIG_NEW_LEDS=y
+# CONFIG_NFC is not set
+CONFIG_NF_CONNTRACK=y
+# CONFIG_NF_CONNTRACK_FTP is not set
+CONFIG_NF_CONNTRACK_IPV4=y
+CONFIG_NF_CONNTRACK_IPV6=m
+# CONFIG_NF_CONNTRACK_IRC is not set
+# CONFIG_NF_CONNTRACK_NETBIOS_NS is not set
+# CONFIG_NF_CONNTRACK_SECMARK is not set
+# CONFIG_NF_CONNTRACK_SIP is not set
+CONFIG_NF_CT_NETLINK=y
+CONFIG_NF_DEFRAG_IPV4=y
+CONFIG_NF_DEFRAG_IPV6=m
+# CONFIG_NF_NAT is not set
+# CONFIG_NILFS2_FS is not set
+CONFIG_NL80211_TESTMODE=y
+CONFIG_NLATTR=y
+CONFIG_NLS=y
+CONFIG_NLS_ASCII=m
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+CONFIG_NLS_CODEPAGE_437=m
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+CONFIG_NLS_DEFAULT="utf8"
+CONFIG_NLS_ISO8859_1=m
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+CONFIG_NLS_UTF8=m
+CONFIG_NOP_TRACER=y
+# CONFIG_NOP_USB_XCEIV is not set
+CONFIG_NO_HZ=y
+# CONFIG_NTFS_FS is not set
+# CONFIG_N_GSM is not set
+# CONFIG_OMFS_FS is not set
+# CONFIG_OPENVSWITCH is not set
+# CONFIG_OPROFILE is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_P54_COMMON is not set
+CONFIG_PACKET=y
+# CONFIG_PARPORT is not set
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_PCCARD is not set
+# CONFIG_PDA_POWER is not set
+# CONFIG_PERF_COUNTERS is not set
+CONFIG_PERF_EVENTS=y
+# CONFIG_PHONE is not set
+# CONFIG_PHONET is not set
+CONFIG_PHYLIB=y
+CONFIG_PID_NS=y
+CONFIG_PM=y
+# CONFIG_PMBUS is not set
+# CONFIG_PMIC_ADP5520 is not set
+# CONFIG_PMIC_DA903X is not set
+# CONFIG_PM_ADVANCED_DEBUG is not set
+CONFIG_PM_DEBUG=y
+# CONFIG_PM_DEVFREQ is not set
+CONFIG_PM_RUNTIME=y
+CONFIG_PM_SLEEP=y
+CONFIG_PM_SLEEP_SMP=y
+# CONFIG_PM_TEST_SUSPEND is not set
+# CONFIG_POSIX_MQUEUE is not set
+CONFIG_POWER_SUPPLY=y
+# CONFIG_POWER_SUPPLY_DEBUG is not set
+CONFIG_PPP=m
+# CONFIG_PPPOE is not set
+CONFIG_PPP_ASYNC=m
+# CONFIG_PPP_BSDCOMP is not set
+# CONFIG_PPP_DEFLATE is not set
+# CONFIG_PPP_FILTER is not set
+# CONFIG_PPP_MPPE is not set
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_SYNC_TTY is not set
+# CONFIG_PPS is not set
+# CONFIG_PREEMPT is not set
+# CONFIG_PREEMPT_NONE is not set
+# CONFIG_PREEMPT_RCU is not set
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+CONFIG_PRINTK=y
+CONFIG_PRINTK_TIME=y
+# CONFIG_PRISM2_USB is not set
+CONFIG_PROC_EVENTS=y
+CONFIG_PROC_FS=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PROC_SYSCTL=y
+# CONFIG_PROFILE_ALL_BRANCHES is not set
+# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
+CONFIG_PROFILING=y
+# CONFIG_PROVE_LOCKING is not set
+CONFIG_PSTORE=y
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_QNX6FS_FS is not set
+# CONFIG_QSEMI_PHY is not set
+# CONFIG_QUOTA is not set
+# CONFIG_QUOTACTL is not set
+# CONFIG_R3964 is not set
+# CONFIG_R8712U is not set
+# CONFIG_RADIO_ADAPTERS is not set
+# CONFIG_RAID_ATTRS is not set
+CONFIG_RAMOOPS=y
+# CONFIG_RAW_DRIVER is not set
+# CONFIG_RCU_CPU_STALL_INFO is not set
+CONFIG_RCU_CPU_STALL_TIMEOUT=60
+CONFIG_RCU_FANOUT=32
+# CONFIG_RCU_FANOUT_EXACT is not set
+# CONFIG_RCU_FAST_NO_HZ is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+# CONFIG_RCU_TRACE is not set
+# CONFIG_RDS is not set
+# CONFIG_RD_BZIP2 is not set
+CONFIG_RD_GZIP=y
+# CONFIG_RD_LZMA is not set
+# CONFIG_RD_LZO is not set
+CONFIG_RD_XZ=y
+# CONFIG_REALTEK_PHY is not set
+# CONFIG_REISERFS_FS is not set
+CONFIG_RELAY=y
+# CONFIG_RESOURCE_COUNTERS is not set
+CONFIG_RFKILL=y
+# CONFIG_RFKILL_INPUT is not set
+CONFIG_RFKILL_LEDS=y
+CONFIG_RFS_ACCEL=y
+CONFIG_RING_BUFFER=y
+# CONFIG_RING_BUFFER_BENCHMARK is not set
+# CONFIG_ROMFS_FS is not set
+CONFIG_RPS=y
+CONFIG_RT2X00=m
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_DEBUG is not set
+# CONFIG_RTC_DRV_BQ32K is not set
+# CONFIG_RTC_DRV_BQ4802 is not set
+# CONFIG_RTC_DRV_DS1286 is not set
+# CONFIG_RTC_DRV_DS1305 is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1390 is not set
+# CONFIG_RTC_DRV_DS1511 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_DS3232 is not set
+# CONFIG_RTC_DRV_DS3234 is not set
+# CONFIG_RTC_DRV_EM3027 is not set
+# CONFIG_RTC_DRV_FM3130 is not set
+# CONFIG_RTC_DRV_ISL12022 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_M41T93 is not set
+# CONFIG_RTC_DRV_M41T94 is not set
+# CONFIG_RTC_DRV_M48T35 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_MAX6900 is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_MSM6242 is not set
+# CONFIG_RTC_DRV_PCF2123 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_R9701 is not set
+# CONFIG_RTC_DRV_RP5C01 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_RV3029C2 is not set
+# CONFIG_RTC_DRV_RX8025 is not set
+# CONFIG_RTC_DRV_RX8581 is not set
+# CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_LIB=y
+# CONFIG_RTS5139 is not set
+# CONFIG_RT_GROUP_SCHED is not set
+CONFIG_RT_MUTEXES=y
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_SAMPLES is not set
+CONFIG_SCHEDSTATS=y
+# CONFIG_SCHED_AUTOGROUP is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_SCHED_TRACER is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_DH is not set
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_LOGGING is not set
+CONFIG_SCSI_MOD=y
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_NETLINK is not set
+# CONFIG_SCSI_OSD_INITIATOR is not set
+CONFIG_SCSI_PROC_FS=y
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+CONFIG_SCSI_SPI_ATTRS=y
+# CONFIG_SCSI_SRP_ATTRS is not set
+# CONFIG_SCSI_TGT is not set
+CONFIG_SCSI_WAIT_SCAN=m
+CONFIG_SECCOMP=y
+CONFIG_SECCOMP_FILTER=y
+CONFIG_SECURITY=y
+CONFIG_SECURITYFS=y
+# CONFIG_SECURITY_APPARMOR is not set
+CONFIG_SECURITY_CHROMIUMOS=y
+# CONFIG_SECURITY_DMESG_RESTRICT is not set
+CONFIG_SECURITY_NETWORK=y
+# CONFIG_SECURITY_NETWORK_XFRM is not set
+CONFIG_SECURITY_PATH=y
+# CONFIG_SECURITY_TOMOYO is not set
+CONFIG_SECURITY_YAMA=y
+CONFIG_SELECT_MEMORY_MODEL=y
+# CONFIG_SENSORS_AD7314 is not set
+# CONFIG_SENSORS_AD7414 is not set
+# CONFIG_SENSORS_AD7418 is not set
+# CONFIG_SENSORS_ADCXX is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1029 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ADS1015 is not set
+# CONFIG_SENSORS_ADS7828 is not set
+# CONFIG_SENSORS_ADS7871 is not set
+# CONFIG_SENSORS_ADT7411 is not set
+# CONFIG_SENSORS_ADT7462 is not set
+# CONFIG_SENSORS_ADT7470 is not set
+# CONFIG_SENSORS_ADT7475 is not set
+# CONFIG_SENSORS_AK8975 is not set
+# CONFIG_SENSORS_AMC6821 is not set
+# CONFIG_SENSORS_APDS990X is not set
+# CONFIG_SENSORS_ASC7621 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_BH1770 is not set
+# CONFIG_SENSORS_BH1780 is not set
+# CONFIG_SENSORS_DME1737 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_DS620 is not set
+# CONFIG_SENSORS_EMC1403 is not set
+# CONFIG_SENSORS_EMC2103 is not set
+# CONFIG_SENSORS_EMC6W201 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_F71882FG is not set
+# CONFIG_SENSORS_F75375S is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_GPIO_FAN is not set
+# CONFIG_SENSORS_HMC5843 is not set
+CONFIG_SENSORS_ISL29018=m
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_JC42 is not set
+# CONFIG_SENSORS_LINEAGE is not set
+# CONFIG_SENSORS_LIS3LV02D is not set
+# CONFIG_SENSORS_LIS3_I2C is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+# CONFIG_SENSORS_LM73 is not set
+# CONFIG_SENSORS_LM75 is not set
+# CONFIG_SENSORS_LM77 is not set
+# CONFIG_SENSORS_LM78 is not set
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+# CONFIG_SENSORS_LM85 is not set
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_LM93 is not set
+# CONFIG_SENSORS_LM95241 is not set
+# CONFIG_SENSORS_LM95245 is not set
+# CONFIG_SENSORS_LTC4151 is not set
+# CONFIG_SENSORS_LTC4215 is not set
+# CONFIG_SENSORS_LTC4245 is not set
+# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_MCP3021 is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_PC87427 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_SCH5627 is not set
+# CONFIG_SENSORS_SCH5636 is not set
+# CONFIG_SENSORS_SCH56XX_COMMON is not set
+# CONFIG_SENSORS_SHT15 is not set
+# CONFIG_SENSORS_SHT21 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_THMC50 is not set
+# CONFIG_SENSORS_TMP102 is not set
+# CONFIG_SENSORS_TMP401 is not set
+# CONFIG_SENSORS_TMP421 is not set
+# CONFIG_SENSORS_TSL2550 is not set
+CONFIG_SENSORS_TSL2563=m
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83793 is not set
+# CONFIG_SENSORS_W83795 is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83L786NG is not set
+# CONFIG_SERIAL_ALTERA_JTAGUART is not set
+# CONFIG_SERIAL_ALTERA_UART is not set
+# CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_MAX3100 is not set
+# CONFIG_SERIAL_MAX3107 is not set
+# CONFIG_SERIAL_NONSTANDARD is not set
+# CONFIG_SERIAL_TIMBERDALE is not set
+# CONFIG_SERIAL_XILINX_PS_UART is not set
+CONFIG_SERIO=y
+# CONFIG_SERIO_ALTERA_PS2 is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_PS2MULT is not set
+CONFIG_SERIO_RAW=y
+CONFIG_SERIO_SERPORT=m
+# CONFIG_SGI_PARTITION is not set
+CONFIG_SHMEM=y
+CONFIG_SIGNALFD=y
+# CONFIG_SLAB is not set
+CONFIG_SLABINFO=y
+CONFIG_SLHC=m
+# CONFIG_SLIP is not set
+# CONFIG_SLOB is not set
+CONFIG_SLUB=y
+CONFIG_SLUB_DEBUG=y
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
+CONFIG_SMP=y
+# CONFIG_SMSC_PHY is not set
+CONFIG_SND=y
+# CONFIG_SND_ALOOP is not set
+# CONFIG_SND_DEBUG is not set
+CONFIG_SND_DRIVERS=y
+# CONFIG_SND_DUMMY is not set
+CONFIG_SND_DYNAMIC_MINORS=y
+# CONFIG_SND_EMU10K1_SEQ is not set
+CONFIG_SND_HRTIMER=m
+CONFIG_SND_JACK=y
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_MPU401 is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_OPL3_LIB_SEQ is not set
+# CONFIG_SND_OPL4_LIB_SEQ is not set
+# CONFIG_SND_PCM_OSS is not set
+# CONFIG_SND_RAWMIDI_SEQ is not set
+# CONFIG_SND_SBAWE_SEQ is not set
+CONFIG_SND_SEQUENCER=m
+# CONFIG_SND_SEQUENCER_OSS is not set
+CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_SPI is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_USB=y
+CONFIG_SND_USB_AUDIO=m
+# CONFIG_SND_VERBOSE_PRINTK is not set
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VIRMIDI is not set
+# CONFIG_SOLARIS_X86_PARTITION is not set
+CONFIG_SOUND=y
+# CONFIG_SOUND_OSS_CORE is not set
+# CONFIG_SOUND_PRIME is not set
+# CONFIG_SPARSE_RCU_POINTER is not set
+# CONFIG_SPEAKUP is not set
+CONFIG_SPI=y
+# CONFIG_SPI_ALTERA is not set
+CONFIG_SPI_BITBANG=m
+# CONFIG_SPI_DEBUG is not set
+# CONFIG_SPI_DESIGNWARE is not set
+# CONFIG_SPI_GPIO is not set
+CONFIG_SPI_MASTER=y
+# CONFIG_SPI_OC_TINY is not set
+# CONFIG_SPI_PXA2XX_PCI is not set
+CONFIG_SPI_SPIDEV=m
+# CONFIG_SPI_TLE62X0 is not set
+# CONFIG_SPI_XILINX is not set
+CONFIG_SPLIT_PTLOCK_CPUS=999999
+# CONFIG_SSB is not set
+CONFIG_SSB_POSSIBLE=y
+CONFIG_STACKTRACE=y
+CONFIG_STACKTRACE_SUPPORT=y
+# CONFIG_STACK_TRACER is not set
+CONFIG_STAGING=y
+# CONFIG_STAGING_MEDIA is not set
+CONFIG_STANDALONE=y
+# CONFIG_STE10XP is not set
+CONFIG_STOP_MACHINE=y
+CONFIG_STRICT_DEVMEM=y
+# CONFIG_STRIP_ASM_SYMS is not set
+# CONFIG_SUN_PARTITION is not set
+CONFIG_SUSPEND=y
+CONFIG_SUSPEND_FREEZER=y
+CONFIG_SWAP=y
+CONFIG_SYN_COOKIES=y
+CONFIG_SYSCTL=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_SYSFS=y
+# CONFIG_SYSFS_DEPRECATED is not set
+# CONFIG_SYSV68_PARTITION is not set
+CONFIG_SYSVIPC=y
+CONFIG_SYSVIPC_SYSCTL=y
+# CONFIG_SYSV_FS is not set
+# CONFIG_SYS_HYPERVISOR is not set
+# CONFIG_TARGET_CORE is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_TCG_ATMEL is not set
+CONFIG_TCG_TPM=y
+CONFIG_TCP_CONG_ADVANCED=y
+# CONFIG_TCP_CONG_BIC is not set
+CONFIG_TCP_CONG_CUBIC=y
+# CONFIG_TCP_CONG_HSTCP is not set
+# CONFIG_TCP_CONG_HTCP is not set
+# CONFIG_TCP_CONG_HYBLA is not set
+# CONFIG_TCP_CONG_ILLINOIS is not set
+# CONFIG_TCP_CONG_LP is not set
+# CONFIG_TCP_CONG_SCALABLE is not set
+# CONFIG_TCP_CONG_VEGAS is not set
+# CONFIG_TCP_CONG_VENO is not set
+# CONFIG_TCP_CONG_WESTWOOD is not set
+# CONFIG_TCP_CONG_YEAH is not set
+CONFIG_TCP_MD5SIG=y
+# CONFIG_TEST_KSTRTOX is not set
+# CONFIG_TEST_LIST_SORT is not set
+# CONFIG_TEST_POWER is not set
+CONFIG_THERMAL=y
+CONFIG_THERMAL_HWMON=y
+CONFIG_TICK_ONESHOT=y
+CONFIG_TIMERFD=y
+CONFIG_TIMER_STATS=y
+# CONFIG_TIPC is not set
+# CONFIG_TI_DAC7512 is not set
+# CONFIG_TI_ST is not set
+CONFIG_TMPFS=y
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
+# CONFIG_TOUCHSCREEN_AD7877 is not set
+# CONFIG_TOUCHSCREEN_AD7879 is not set
+# CONFIG_TOUCHSCREEN_ADS7846 is not set
+CONFIG_TOUCHSCREEN_ATMEL_MXT=m
+# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
+# CONFIG_TOUCHSCREEN_BU21013 is not set
+# CONFIG_TOUCHSCREEN_CLEARPAD_TM1217 is not set
+# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
+# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
+# CONFIG_TOUCHSCREEN_DYNAPRO is not set
+# CONFIG_TOUCHSCREEN_EETI is not set
+# CONFIG_TOUCHSCREEN_EGALAX is not set
+# CONFIG_TOUCHSCREEN_ELO is not set
+# CONFIG_TOUCHSCREEN_FUJITSU is not set
+# CONFIG_TOUCHSCREEN_GUNZE is not set
+# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
+# CONFIG_TOUCHSCREEN_ILI210X is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
+# CONFIG_TOUCHSCREEN_MAX11801 is not set
+# CONFIG_TOUCHSCREEN_MCS5000 is not set
+# CONFIG_TOUCHSCREEN_MK712 is not set
+# CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_PENMOUNT is not set
+# CONFIG_TOUCHSCREEN_PIXCIR is not set
+# CONFIG_TOUCHSCREEN_ST1232 is not set
+# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
+# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
+# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
+# CONFIG_TOUCHSCREEN_TPS6507X is not set
+# CONFIG_TOUCHSCREEN_TSC2005 is not set
+# CONFIG_TOUCHSCREEN_TSC2007 is not set
+# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
+# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
+# CONFIG_TPS6105X is not set
+# CONFIG_TPS65010 is not set
+# CONFIG_TPS6507X is not set
+CONFIG_TRACEPOINTS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+# CONFIG_TRACE_SINK is not set
+CONFIG_TRACING=y
+CONFIG_TRACING_SUPPORT=y
+# CONFIG_TRANZPORT is not set
+CONFIG_TREE_RCU=y
+# CONFIG_TREE_RCU_TRACE is not set
+# CONFIG_TRUSTED_KEYS is not set
+CONFIG_TSL2583=m
+# CONFIG_TTY_PRINTK is not set
+CONFIG_TUN=m
+# CONFIG_TWL4030_CORE is not set
+# CONFIG_TWL6040_CORE is not set
+CONFIG_UDF_FS=m
+CONFIG_UDF_NLS=y
+CONFIG_UEVENT_HELPER_PATH=""
+# CONFIG_UFS_FS is not set
+CONFIG_UID16=y
+# CONFIG_UIO is not set
+# CONFIG_ULTRIX_PARTITION is not set
+CONFIG_UNINLINE_SPIN_UNLOCK=y
+CONFIG_UNIX=y
+CONFIG_UNIX98_PTYS=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_UNIX_DIAG is not set
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_USB=y
+# CONFIG_USBIP_CORE is not set
+CONFIG_USB_ACM=y
+# CONFIG_USB_ADUTUX is not set
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+# CONFIG_USB_APPLEDISPLAY is not set
+CONFIG_USB_ARCH_HAS_EHCI=y
+CONFIG_USB_ARCH_HAS_HCD=y
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_CATC is not set
+CONFIG_USB_COMMON=y
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_DEBUG is not set
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_DEVICE_CLASS is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+CONFIG_USB_EHCI_HCD=y
+# CONFIG_USB_EHCI_HCD_PLATFORM is not set
+CONFIG_USB_EHCI_ROOT_HUB_TT=y
+CONFIG_USB_EHCI_TT_NEWSCHED=y
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_ENESTORAGE is not set
+# CONFIG_USB_ET61X251 is not set
+# CONFIG_USB_EZUSB is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_GADGET is not set
+# CONFIG_USB_GPIO_VBUS is not set
+# CONFIG_USB_GSPCA is not set
+CONFIG_USB_HID=y
+CONFIG_USB_HIDDEV=y
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_IOWARRIOR is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1362_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_LEGOTOWER is not set
+CONFIG_USB_LIBUSUAL=y
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+CONFIG_USB_MON=y
+CONFIG_USB_NET_AX8817X=m
+CONFIG_USB_NET_CDCETHER=m
+# CONFIG_USB_NET_CDC_EEM is not set
+CONFIG_USB_NET_CDC_NCM=m
+# CONFIG_USB_NET_CDC_SUBSET is not set
+# CONFIG_USB_NET_CX82310_ETH is not set
+# CONFIG_USB_NET_GL620A is not set
+# CONFIG_USB_NET_INT51X1 is not set
+# CONFIG_USB_NET_KALMIA is not set
+CONFIG_USB_NET_MCS7830=m
+# CONFIG_USB_NET_PLUSB is not set
+# CONFIG_USB_NET_QMI_WWAN is not set
+CONFIG_USB_NET_RNDIS_HOST=m
+CONFIG_USB_NET_RNDIS_WLAN=m
+CONFIG_USB_NET_SMSC75XX=m
+CONFIG_USB_NET_SMSC95XX=m
+# CONFIG_USB_NET_ZAURUS is not set
+# CONFIG_USB_OTG is not set
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_OXU210HP_HCD is not set
+CONFIG_USB_PEGASUS=m
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_PWC is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_S2255 is not set
+CONFIG_USB_SERIAL=y
+# CONFIG_USB_SERIAL_AIRCABLE is not set
+# CONFIG_USB_SERIAL_ARK3116 is not set
+# CONFIG_USB_SERIAL_BELKIN is not set
+# CONFIG_USB_SERIAL_CH341 is not set
+# CONFIG_USB_SERIAL_CONSOLE is not set
+# CONFIG_USB_SERIAL_CP210X is not set
+# CONFIG_USB_SERIAL_CYBERJACK is not set
+# CONFIG_USB_SERIAL_CYPRESS_M8 is not set
+# CONFIG_USB_SERIAL_DEBUG is not set
+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT is not set
+# CONFIG_USB_SERIAL_EDGEPORT_TI is not set
+# CONFIG_USB_SERIAL_EMPEG is not set
+# CONFIG_USB_SERIAL_F81232 is not set
+# CONFIG_USB_SERIAL_FTDI_SIO is not set
+# CONFIG_USB_SERIAL_FUNSOFT is not set
+# CONFIG_USB_SERIAL_GARMIN is not set
+CONFIG_USB_SERIAL_GENERIC=y
+# CONFIG_USB_SERIAL_HP4X is not set
+# CONFIG_USB_SERIAL_IPAQ is not set
+# CONFIG_USB_SERIAL_IPW is not set
+# CONFIG_USB_SERIAL_IR is not set
+# CONFIG_USB_SERIAL_IUU is not set
+# CONFIG_USB_SERIAL_KEYSPAN is not set
+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
+# CONFIG_USB_SERIAL_KLSI is not set
+# CONFIG_USB_SERIAL_KOBIL_SCT is not set
+# CONFIG_USB_SERIAL_MCT_U232 is not set
+# CONFIG_USB_SERIAL_METRO is not set
+# CONFIG_USB_SERIAL_MOS7720 is not set
+# CONFIG_USB_SERIAL_MOS7840 is not set
+# CONFIG_USB_SERIAL_MOTOROLA is not set
+# CONFIG_USB_SERIAL_NAVMAN is not set
+# CONFIG_USB_SERIAL_OMNINET is not set
+# CONFIG_USB_SERIAL_OPTICON is not set
+CONFIG_USB_SERIAL_OPTION=m
+# CONFIG_USB_SERIAL_OTI6858 is not set
+# CONFIG_USB_SERIAL_PL2303 is not set
+# CONFIG_USB_SERIAL_QCAUX is not set
+CONFIG_USB_SERIAL_QUALCOMM=m
+# CONFIG_USB_SERIAL_QUATECH2 is not set
+# CONFIG_USB_SERIAL_QUATECH_USB2 is not set
+# CONFIG_USB_SERIAL_SAFE is not set
+# CONFIG_USB_SERIAL_SIEMENS_MPI is not set
+CONFIG_USB_SERIAL_SIERRAWIRELESS=m
+# CONFIG_USB_SERIAL_SPCP8X5 is not set
+# CONFIG_USB_SERIAL_SSU100 is not set
+# CONFIG_USB_SERIAL_SYMBOL is not set
+# CONFIG_USB_SERIAL_TI is not set
+# CONFIG_USB_SERIAL_VISOR is not set
+# CONFIG_USB_SERIAL_VIVOPAY_SERIAL is not set
+# CONFIG_USB_SERIAL_WHITEHEAT is not set
+CONFIG_USB_SERIAL_WWAN=m
+# CONFIG_USB_SERIAL_XIRCOM is not set
+# CONFIG_USB_SERIAL_ZIO is not set
+# CONFIG_USB_SEVSEG is not set
+# CONFIG_USB_SIERRA_NET is not set
+# CONFIG_USB_SISUSBVGA is not set
+# CONFIG_USB_SL811_HCD is not set
+# CONFIG_USB_SN9C102 is not set
+# CONFIG_USB_STKWEBCAM is not set
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_ENE_UB6250 is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+CONFIG_USB_SUPPORT=y
+CONFIG_USB_SUSPEND=y
+# CONFIG_USB_SWITCH_FSA9480 is not set
+# CONFIG_USB_TEST is not set
+# CONFIG_USB_TMC is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_UAS is not set
+CONFIG_USB_USBNET=m
+CONFIG_USB_VIDEO_CLASS=m
+# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set
+# CONFIG_USB_VL600 is not set
+# CONFIG_USB_WDM is not set
+# CONFIG_USB_WPAN_HCD is not set
+# CONFIG_USB_WUSB_CBAF is not set
+# CONFIG_USB_YUREX is not set
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_USB_ZR364XX is not set
+CONFIG_USER_NS=y
+CONFIG_USE_GENERIC_SMP_HELPERS=y
+CONFIG_UTS_NS=y
+# CONFIG_V4L_MEM2MEM_DRIVERS is not set
+# CONFIG_V4L_PLATFORM_DRIVERS is not set
+CONFIG_V4L_USB_DRIVERS=y
+CONFIG_VETH=m
+CONFIG_VFAT_FS=m
+# CONFIG_VGASTATE is not set
+CONFIG_VIDEOBUF2_CORE=m
+CONFIG_VIDEOBUF2_MEMOPS=m
+CONFIG_VIDEOBUF2_VMALLOC=m
+# CONFIG_VIDEO_ADV7170 is not set
+# CONFIG_VIDEO_ADV7175 is not set
+# CONFIG_VIDEO_ADV7180 is not set
+# CONFIG_VIDEO_ADV7183 is not set
+# CONFIG_VIDEO_ADV7343 is not set
+# CONFIG_VIDEO_ADV_DEBUG is not set
+# CONFIG_VIDEO_AK881X is not set
+# CONFIG_VIDEO_BT819 is not set
+# CONFIG_VIDEO_BT856 is not set
+# CONFIG_VIDEO_BT866 is not set
+CONFIG_VIDEO_CAPTURE_DRIVERS=y
+# CONFIG_VIDEO_CPIA2 is not set
+# CONFIG_VIDEO_CS5345 is not set
+# CONFIG_VIDEO_CS53L32A is not set
+# CONFIG_VIDEO_CX2341X is not set
+# CONFIG_VIDEO_CX25840 is not set
+CONFIG_VIDEO_DEV=m
+# CONFIG_VIDEO_EM28XX is not set
+# CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
+# CONFIG_VIDEO_HDPVR is not set
+# CONFIG_VIDEO_HELPER_CHIPS_AUTO is not set
+# CONFIG_VIDEO_KS0127 is not set
+# CONFIG_VIDEO_M52790 is not set
+CONFIG_VIDEO_MEDIA=m
+# CONFIG_VIDEO_MSP3400 is not set
+# CONFIG_VIDEO_MT9V011 is not set
+CONFIG_VIDEO_OUTPUT_CONTROL=y
+# CONFIG_VIDEO_OV7670 is not set
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_SAA6588 is not set
+# CONFIG_VIDEO_SAA7110 is not set
+# CONFIG_VIDEO_SAA711X is not set
+# CONFIG_VIDEO_SAA7127 is not set
+# CONFIG_VIDEO_SAA717X is not set
+# CONFIG_VIDEO_SAA7185 is not set
+# CONFIG_VIDEO_SAA7191 is not set
+# CONFIG_VIDEO_SR030PC30 is not set
+# CONFIG_VIDEO_TCM825X is not set
+# CONFIG_VIDEO_TDA7432 is not set
+# CONFIG_VIDEO_TDA9840 is not set
+# CONFIG_VIDEO_TEA6415C is not set
+# CONFIG_VIDEO_TEA6420 is not set
+# CONFIG_VIDEO_THS7303 is not set
+# CONFIG_VIDEO_TLV320AIC23B is not set
+# CONFIG_VIDEO_TVAUDIO is not set
+# CONFIG_VIDEO_TVP514X is not set
+# CONFIG_VIDEO_TVP5150 is not set
+# CONFIG_VIDEO_TVP7002 is not set
+# CONFIG_VIDEO_UPD64031A is not set
+# CONFIG_VIDEO_UPD64083 is not set
+# CONFIG_VIDEO_USBVISION is not set
+CONFIG_VIDEO_V4L2=m
+CONFIG_VIDEO_V4L2_COMMON=m
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_VP27SMPX is not set
+# CONFIG_VIDEO_VPX3220 is not set
+# CONFIG_VIDEO_VS6624 is not set
+# CONFIG_VIDEO_WM8739 is not set
+# CONFIG_VIDEO_WM8775 is not set
+# CONFIG_VIRTIO_BALLOON is not set
+# CONFIG_VIRTIO_MMIO is not set
+# CONFIG_VIRT_DRIVERS is not set
+CONFIG_VIRT_TO_BUS=y
+# CONFIG_VITESSE_PHY is not set
+# CONFIG_VLAN_8021Q is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_VT=y
+# CONFIG_VT6656 is not set
+CONFIG_VT_CONSOLE=y
+CONFIG_VT_CONSOLE_SLEEP=y
+CONFIG_VT_HW_CONSOLE_BINDING=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_W1 is not set
+# CONFIG_W35UND is not set
+# CONFIG_WAN is not set
+# CONFIG_WAN_ROUTER is not set
+CONFIG_WEXT_CORE=y
+CONFIG_WEXT_PRIV=y
+CONFIG_WEXT_PROC=y
+CONFIG_WEXT_SPY=y
+# CONFIG_WIMAX is not set
+CONFIG_WIRELESS=y
+CONFIG_WIRELESS_EXT=y
+# CONFIG_WIRELESS_EXT_SYSFS is not set
+# CONFIG_WL1251 is not set
+# CONFIG_WL12XX_MENU is not set
+CONFIG_WLAN=y
+# CONFIG_X25 is not set
+CONFIG_XFRM=y
+CONFIG_XFRM_IPCOMP=m
+# CONFIG_XFRM_MIGRATE is not set
+# CONFIG_XFRM_STATISTICS is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_XFS_FS is not set
+CONFIG_XPS=y
+CONFIG_XZ_DEC=y
+CONFIG_XZ_DEC_BCJ=y
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_SPARC is not set
+# CONFIG_XZ_DEC_TEST is not set
+CONFIG_ZISOFS=y
+CONFIG_ZLIB_DEFLATE=m
+CONFIG_ZLIB_INFLATE=y
diff --git a/chromeos/config/i386/chromeos-pinetrail-i386.flavour.config b/chromeos/config/i386/chromeos-pinetrail-i386.flavour.config
new file mode 100644 (file)
index 0000000..f3cd1a7
--- /dev/null
@@ -0,0 +1,57 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+CONFIG_ACPI_WMI=m
+# CONFIG_BRCMFMAC is not set
+# CONFIG_BROADCOM_PHY is not set
+# CONFIG_CORDIC is not set
+# CONFIG_CRC8 is not set
+CONFIG_DMAR_TABLE=y
+# CONFIG_DRM_GMA500 is not set
+# CONFIG_DRM_NOUVEAU is not set
+# CONFIG_DRM_RADEON is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_HAVE_INTEL_TXT=y
+CONFIG_INTEL_IOMMU=y
+CONFIG_INTEL_IOMMU_DEFAULT_ON=y
+CONFIG_INTEL_IOMMU_FLOPPY_WA=y
+# CONFIG_INTEL_TXT is not set
+CONFIG_IOMMU_API=y
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+# CONFIG_IWL3945 is not set
+# CONFIG_IWL4965 is not set
+# CONFIG_IWLWIFI is not set
+# CONFIG_LIBERTAS is not set
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
+# CONFIG_MWIFIEX is not set
+# CONFIG_MXM_WMI is not set
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NF_CONNTRACK_PROCFS=y
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+# CONFIG_RT2500USB is not set
+# CONFIG_RT2800USB is not set
+# CONFIG_RT73USB is not set
+# CONFIG_RTL8187 is not set
+# CONFIG_RTL8192CU is not set
+# CONFIG_RTL8192DE is not set
+# CONFIG_RTL8192SE is not set
+# CONFIG_RTLLIB is not set
+CONFIG_RTLWIFI_DEBUG=y
+# CONFIG_USB_RTL8150 is not set
+CONFIG_V4L_PCI_DRIVERS=y
+# CONFIG_VIDEO_BT848 is not set
+# CONFIG_VIDEO_CX88 is not set
+# CONFIG_VIDEO_HEXIUM_GEMINI is not set
+# CONFIG_VIDEO_HEXIUM_ORION is not set
+# CONFIG_VIDEO_IVTV is not set
+# CONFIG_VIDEO_MXB is not set
+# CONFIG_VIDEO_SAA7134 is not set
+# CONFIG_VIDEO_ZORAN is not set
+# CONFIG_X86_POWERNOW_K6 is not set
+# CONFIG_X86_POWERNOW_K7 is not set
+# CONFIG_X86_POWERNOW_K8 is not set
+# CONFIG_ZD1211RW is not set
diff --git a/chromeos/config/i386/chromiumos-i386.flavour.config b/chromeos/config/i386/chromiumos-i386.flavour.config
new file mode 100644 (file)
index 0000000..fc163ca
--- /dev/null
@@ -0,0 +1,91 @@
+#
+# Config options generated by splitconfig
+#
+CONFIG_8139CP=m
+CONFIG_8139TOO=m
+# CONFIG_8139TOO_8129 is not set
+CONFIG_8139TOO_PIO=y
+# CONFIG_8139TOO_TUNE_TWISTER is not set
+# CONFIG_8139_OLD_RX_RESET is not set
+CONFIG_ACPI_WMI=y
+# CONFIG_BRCMDBG is not set
+CONFIG_BRCMFMAC=m
+CONFIG_BRCMFMAC_USB=y
+CONFIG_BRCMUTIL=m
+CONFIG_BROADCOM_PHY=y
+CONFIG_CORDIC=m
+CONFIG_CRC8=m
+CONFIG_DRM_GMA3600=y
+CONFIG_DRM_GMA500=y
+CONFIG_DRM_GMA600=y
+CONFIG_DRM_NOUVEAU=y
+CONFIG_DRM_NOUVEAU_BACKLIGHT=y
+# CONFIG_DRM_NOUVEAU_DEBUG is not set
+CONFIG_DRM_RADEON=y
+CONFIG_DRM_RADEON_KMS=y
+CONFIG_DRM_TTM=y
+CONFIG_EXTRA_FIRMWARE="radeon/PALM_me.bin radeon/PALM_pfp.bin radeon/SUMO_rlc.bin"
+CONFIG_EXTRA_FIRMWARE_DIR="firmware"
+CONFIG_FB_BACKLIGHT=y
+# CONFIG_INTEL_IOMMU is not set
+CONFIG_IPW2100=m
+# CONFIG_IPW2100_DEBUG is not set
+CONFIG_IPW2100_MONITOR=y
+CONFIG_IPW2200=m
+# CONFIG_IPW2200_DEBUG is not set
+CONFIG_IPW2200_MONITOR=y
+CONFIG_IPW2200_PROMISCUOUS=y
+# CONFIG_IPW2200_QOS is not set
+CONFIG_IPW2200_RADIOTAP=y
+CONFIG_IWL3945=m
+CONFIG_IWL4965=m
+CONFIG_IWLEGACY=m
+# CONFIG_IWLEGACY_DEBUG is not set
+# CONFIG_IWLEGACY_DEBUGFS is not set
+CONFIG_IWLWIFI=m
+# CONFIG_IWLWIFI_DEBUG is not set
+# CONFIG_IWLWIFI_DEBUGFS is not set
+CONFIG_IWLWIFI_DEVICE_TESTMODE=y
+# CONFIG_IWLWIFI_DEVICE_TRACING is not set
+# CONFIG_IWLWIFI_EXPERIMENTAL_MFP is not set
+# CONFIG_IWLWIFI_P2P is not set
+CONFIG_LIBERTAS=m
+# CONFIG_LIBERTAS_DEBUG is not set
+# CONFIG_LIBERTAS_MESH is not set
+# CONFIG_LIBERTAS_SPI is not set
+# CONFIG_LIBERTAS_USB is not set
+CONFIG_LIBIPW=m
+# CONFIG_LIBIPW_DEBUG is not set
+CONFIG_MOUSE_SYNAPTICS_USB=m
+CONFIG_MWIFIEX=m
+CONFIG_MWIFIEX_PCIE=m
+CONFIG_MXM_WMI=y
+# CONFIG_NEED_DMA_MAP_STATE is not set
+# CONFIG_NF_CONNTRACK_PROCFS is not set
+CONFIG_RT2500USB=m
+CONFIG_RT2800USB=m
+CONFIG_RT2800USB_RT33XX=y
+CONFIG_RT2800USB_RT35XX=y
+# CONFIG_RT2800USB_RT53XX is not set
+# CONFIG_RT2800USB_UNKNOWN is not set
+CONFIG_RT2X00_LIB_USB=m
+CONFIG_RT73USB=m
+CONFIG_RTL8187=m
+CONFIG_RTL8187_LEDS=y
+CONFIG_RTL8192CU=m
+CONFIG_RTL8192DE=m
+# CONFIG_RTL8192E is not set
+CONFIG_RTL8192SE=m
+CONFIG_RTLLIB=m
+CONFIG_RTLLIB_CRYPTO_CCMP=m
+CONFIG_RTLLIB_CRYPTO_TKIP=m
+CONFIG_RTLLIB_CRYPTO_WEP=m
+# CONFIG_RTLWIFI_DEBUG is not set
+CONFIG_USB_RTL8150=m
+# CONFIG_V4L_PCI_DRIVERS is not set
+CONFIG_X86_POWERNOW_K6=y
+CONFIG_X86_POWERNOW_K7=y
+CONFIG_X86_POWERNOW_K7_ACPI=y
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_ZD1211RW=m
+# CONFIG_ZD1211RW_DEBUG is not set
diff --git a/chromeos/config/i386/common.config b/chromeos/config/i386/common.config
new file mode 100644 (file)
index 0000000..b20ba2a
--- /dev/null
@@ -0,0 +1,978 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_64BIT is not set
+# CONFIG_ACERHDF is not set
+# CONFIG_ACER_WMI is not set
+CONFIG_ACPI=y
+CONFIG_ACPI_AC=y
+# CONFIG_ACPI_APEI is not set
+CONFIG_ACPI_BATTERY=y
+# CONFIG_ACPI_BGRT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_CHROMEOS=y
+# CONFIG_ACPI_CMPC is not set
+CONFIG_ACPI_CONTAINER=y
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+# CONFIG_ACPI_CUSTOM_METHOD is not set
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_DOCK=y
+# CONFIG_ACPI_EC_DEBUGFS is not set
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_HED is not set
+CONFIG_ACPI_HOTPLUG_CPU=y
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_ACPI_PROCESSOR=y
+# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
+CONFIG_ACPI_PROCFS=y
+# CONFIG_ACPI_PROCFS_POWER is not set
+CONFIG_ACPI_PROC_EVENT=y
+# CONFIG_ACPI_QUICKSTART is not set
+# CONFIG_ACPI_SBS is not set
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_VIDEO=y
+# CONFIG_ADM8211 is not set
+CONFIG_AGP=y
+# CONFIG_AGP_ALI is not set
+# CONFIG_AGP_AMD is not set
+# CONFIG_AGP_AMD64 is not set
+# CONFIG_AGP_ATI is not set
+# CONFIG_AGP_EFFICEON is not set
+CONFIG_AGP_INTEL=y
+# CONFIG_AGP_NVIDIA is not set
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_SWORKS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AIRO is not set
+# CONFIG_ALIX is not set
+CONFIG_AMD_NB=y
+# CONFIG_AMILO_RFKILL is not set
+# CONFIG_APM is not set
+# CONFIG_APPLE_GMUX is not set
+# CONFIG_APPLICOM is not set
+CONFIG_ARCH_CPU_PROBE_RELEASE=y
+CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
+CONFIG_ARCH_DISCARD_MEMBLOCK=y
+# CONFIG_ARCH_DMA_ADDR_T_64BIT is not set
+CONFIG_ARCH_FLATMEM_ENABLE=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_CPU_AUTOPROBE=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx"
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
+CONFIG_ARCH_RANDOM=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+# CONFIG_ARCNET is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_ASUS_WMI is not set
+CONFIG_ATA=y
+CONFIG_ATA_ACPI=y
+CONFIG_ATA_BMDMA=y
+CONFIG_ATA_GENERIC=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_PIIX=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATH5K=m
+# CONFIG_ATH5K_DEBUG is not set
+CONFIG_ATH5K_PCI=y
+# CONFIG_ATH5K_TRACER is not set
+# CONFIG_ATH6KL is not set
+CONFIG_ATH9K=m
+# CONFIG_ATH9K_AHB is not set
+CONFIG_ATH9K_BTCOEX_SUPPORT=y
+CONFIG_ATH9K_COMMON=m
+CONFIG_ATH9K_DEBUGFS=y
+# CONFIG_ATH9K_DFS_CERTIFIED is not set
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K_MAC_DEBUG=y
+CONFIG_ATH9K_PCI=y
+CONFIG_ATH9K_RATE_CONTROL=y
+# CONFIG_ATMEL is not set
+# CONFIG_AUDIT_ARCH is not set
+# CONFIG_BACKLIGHT_APPLE is not set
+# CONFIG_BACKLIGHT_PROGEAR is not set
+# CONFIG_BACKLIGHT_SAHARA is not set
+# CONFIG_BINFMT_AOUT is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_NVME is not set
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BT_ATH3K=m
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+# CONFIG_BT_HCIUART is not set
+# CONFIG_CB710_CORE is not set
+# CONFIG_CHARGER_GPIO is not set
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_CHROMEOS_LAPTOP=y
+CONFIG_CHROMEOS_RAMOOPS_RAM_START=0x00f00000
+CONFIG_CLKBLD_I8253=y
+CONFIG_CLKEVT_I8253=y
+CONFIG_CLKSRC_I8253=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_COMEDI is not set
+# CONFIG_COMPAL_LAPTOP is not set
+# CONFIG_COMPAT_VDSO is not set
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_CYRIX_32=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_TRANSMETA_32=y
+CONFIG_CPU_SUP_UMC_32=y
+CONFIG_CRYPTO_AES_586=y
+CONFIG_CRYPTO_AES_NI_INTEL=m
+# CONFIG_CRYPTO_CRC32C_INTEL is not set
+CONFIG_CRYPTO_CRYPTD=m
+# CONFIG_CRYPTO_DEV_GEODE is not set
+# CONFIG_CRYPTO_DEV_HIFN_795X is not set
+# CONFIG_CRYPTO_DEV_PADLOCK is not set
+# CONFIG_CRYPTO_SALSA20_586 is not set
+# CONFIG_CRYPTO_SERPENT_SSE2_586 is not set
+# CONFIG_CRYPTO_TWOFISH_586 is not set
+# CONFIG_CRYSTALHD is not set
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_DCDBAS is not set
+CONFIG_DEBUG_BOOT_PARAMS=y
+# CONFIG_DEBUG_NMI_SELFTEST is not set
+# CONFIG_DEBUG_NX_TEST is not set
+CONFIG_DEBUG_RODATA=y
+# CONFIG_DEBUG_RODATA_TEST is not set
+CONFIG_DEBUG_SET_MODULE_RONX=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=1
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+# CONFIG_DELL_RBU is not set
+CONFIG_DELL_WMI=m
+# CONFIG_DELL_WMI_AIO is not set
+CONFIG_DEVPORT=y
+CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DMI=y
+CONFIG_DMIID=y
+# CONFIG_DMI_SYSFS is not set
+CONFIG_DOUBLEFAULT=y
+CONFIG_DRM=y
+# CONFIG_DRM_I2C_CH7006 is not set
+# CONFIG_DRM_I2C_SIL164 is not set
+# CONFIG_DRM_I810 is not set
+CONFIG_DRM_I915=y
+CONFIG_DRM_I915_KMS=y
+CONFIG_DRM_KMS_HELPER=y
+# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
+# CONFIG_DRM_MGA is not set
+# CONFIG_DRM_R128 is not set
+# CONFIG_DRM_SAVAGE is not set
+# CONFIG_DRM_SIS is not set
+# CONFIG_DRM_TDFX is not set
+# CONFIG_DRM_UDL is not set
+# CONFIG_DRM_VIA is not set
+# CONFIG_DRM_VMWGFX is not set
+# CONFIG_DX_SEP is not set
+CONFIG_E100=m
+CONFIG_E1000=m
+CONFIG_E1000E=m
+CONFIG_EARLY_PRINTK_DBGP=y
+# CONFIG_EDAC is not set
+# CONFIG_EDD is not set
+# CONFIG_EEEPC_LAPTOP is not set
+CONFIG_EEPROM_93CX6=m
+CONFIG_EFI=y
+# CONFIG_EFI_STUB is not set
+# CONFIG_EFI_VARS is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ET131X is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_CARMINE is not set
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_EFI is not set
+# CONFIG_FB_GEODE is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_I740 is not set
+# CONFIG_FB_I810 is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_LE80578 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_N411 is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VESA is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_VIA is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_XGI is not set
+# CONFIG_FDDI is not set
+# CONFIG_FEALNX is not set
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+CONFIG_FIRMWARE_MEMMAP=y
+CONFIG_FIX_EARLYCON_MEM=y
+# CONFIG_FLATMEM_MANUAL is not set
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAME_WARN=2048
+CONFIG_FTRACE_NMI_ENTER=y
+CONFIG_FTRACE_SYSCALLS=y
+# CONFIG_FUJITSU_LAPTOP is not set
+# CONFIG_FUJITSU_TABLET is not set
+# CONFIG_FUSION is not set
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_PENDING_IRQ=y
+# CONFIG_GENERIC_TIME_VSYSCALL is not set
+# CONFIG_GEOS is not set
+CONFIG_GOOGLE_FIRMWARE=y
+CONFIG_GOOGLE_MEMCONSOLE=m
+# CONFIG_GOOGLE_SMI is not set
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_IT8761E is not set
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_ML_IOH is not set
+CONFIG_GPIO_NM10=m
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_RDC321X is not set
+# CONFIG_GPIO_SCH is not set
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_HANGCHECK_TIMER is not set
+CONFIG_HARDLOCKUP_DETECTOR=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+CONFIG_HAVE_AOUT=y
+CONFIG_HAVE_ARCH_KMEMCHECK=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_ATOMIC_IOMAP=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_FTRACE_NMI_ENTER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KVM=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_TEXT_POKE_SMP=y
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+# CONFIG_HERMES is not set
+# CONFIG_HIBERNATION is not set
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_PID=y
+# CONFIG_HIGHMEM4G is not set
+# CONFIG_HIGHMEM64G is not set
+# CONFIG_HIPPI is not set
+CONFIG_HOSTAP_PCI=m
+CONFIG_HOSTAP_PLX=m
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_ACPI is not set
+# CONFIG_HOTPLUG_PCI_COMPAQ is not set
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+# CONFIG_HOTPLUG_PCI_IBM is not set
+CONFIG_HOTPLUG_PCI_PCIE=y
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+CONFIG_HPET=y
+CONFIG_HPET_EMULATE_RTC=y
+# CONFIG_HPET_MMAP is not set
+CONFIG_HPET_TIMER=y
+# CONFIG_HP_ACCEL is not set
+# CONFIG_HP_ILO is not set
+CONFIG_HP_WMI=m
+CONFIG_HT_IRQ=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HW_RANDOM_AMD is not set
+# CONFIG_HW_RANDOM_GEODE is not set
+CONFIG_HW_RANDOM_INTEL=y
+# CONFIG_HW_RANDOM_VIA is not set
+# CONFIG_HW_RANDOM_VIRTIO is not set
+# CONFIG_HYPERV is not set
+CONFIG_HZ=1000
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_1000=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_EG20T is not set
+CONFIG_I2C_I801=y
+# CONFIG_I2C_INTEL_MID is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_NFORCE2 is not set
+CONFIG_I2C_PIIX4=m
+# CONFIG_I2C_SCMI is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2O is not set
+# CONFIG_I8K is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_IBM_RTL is not set
+# CONFIG_IDE is not set
+# CONFIG_IDEAPAD_LAPTOP is not set
+# CONFIG_IDE_PHISON is not set
+# CONFIG_IGB is not set
+CONFIG_IGBVF=m
+CONFIG_ILLEGAL_POINTER_VALUE=0
+# CONFIG_INFINIBAND is not set
+# CONFIG_INPUT_APANEL is not set
+# CONFIG_INPUT_ATLAS_BTNS is not set
+CONFIG_INPUT_SPARSEKMAP=m
+# CONFIG_INPUT_WISTRON_BTNS is not set
+CONFIG_INSTRUCTION_DECODER=y
+# CONFIG_INTEL_IDLE is not set
+# CONFIG_INTEL_IPS is not set
+CONFIG_INTEL_MENLOW=m
+# CONFIG_INTEL_MID_PTI is not set
+# CONFIG_INTEL_OAKTRAIL is not set
+# CONFIG_IOMMU_HELPER is not set
+# CONFIG_IOMMU_STRESS is not set
+# CONFIG_IO_DELAY_0X80 is not set
+CONFIG_IO_DELAY_0XED=y
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IP1000 is not set
+CONFIG_IRQ_FORCED_THREADING=y
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+# CONFIG_IR_ENE is not set
+# CONFIG_IR_FINTEK is not set
+# CONFIG_IR_GPIO_CIR is not set
+# CONFIG_IR_IMON is not set
+# CONFIG_IR_ITE_CIR is not set
+# CONFIG_IR_JVC_DECODER is not set
+# CONFIG_IR_LIRC_CODEC is not set
+# CONFIG_IR_MCEUSB is not set
+CONFIG_IR_MCE_KBD_DECODER=m
+# CONFIG_IR_NEC_DECODER is not set
+# CONFIG_IR_NUVOTON is not set
+# CONFIG_IR_RC5_DECODER is not set
+# CONFIG_IR_RC5_SZ_DECODER is not set
+# CONFIG_IR_RC6_DECODER is not set
+# CONFIG_IR_REDRAT3 is not set
+CONFIG_IR_SANYO_DECODER=m
+# CONFIG_IR_SONY_DECODER is not set
+# CONFIG_IR_STREAMZAP is not set
+# CONFIG_IR_WINBOND_CIR is not set
+# CONFIG_ISA is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISCSI_IBFT_FIND is not set
+# CONFIG_IXGB is not set
+# CONFIG_IXGBE is not set
+# CONFIG_IXGBEVF is not set
+CONFIG_JME=m
+# CONFIG_KERNEL_BZIP2 is not set
+CONFIG_KTIME_SCALAR=y
+# CONFIG_KVM is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_LBDAF=y
+# CONFIG_LEDS_CLEVO_MAIL is not set
+# CONFIG_LEDS_DELL_NETBOOKS is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LGUEST is not set
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_LIRC=m
+CONFIG_LOW_MEM_NOTIFY=y
+CONFIG_LPC_SCH=m
+CONFIG_LZO_COMPRESS=m
+CONFIG_LZO_DECOMPRESS=m
+# CONFIG_M386 is not set
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M586TSC is not set
+CONFIG_M686=y
+# CONFIG_MACINTOSH_DRIVERS is not set
+# CONFIG_MATH_EMULATION is not set
+# CONFIG_MATOM is not set
+# CONFIG_MCA is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MELAN is not set
+# CONFIG_MEMTEST is not set
+CONFIG_MFD_CORE=m
+# CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_VX855 is not set
+# CONFIG_MGEODEGX1 is not set
+# CONFIG_MGEODE_LX is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_AMD=y
+CONFIG_MICROCODE_INTEL=y
+CONFIG_MICROCODE_OLD_INTERFACE=y
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MMC is not set
+# CONFIG_MMIOTRACE is not set
+CONFIG_MOUSE_APPLETOUCH=m
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MPENTIUM4 is not set
+# CONFIG_MPENTIUMII is not set
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MSI_LAPTOP is not set
+# CONFIG_MSI_WMI is not set
+CONFIG_MTRR=y
+# CONFIG_MTRR_SANITIZER is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_MVIAC7 is not set
+# CONFIG_MWAVE is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MWINCHIPC6 is not set
+# CONFIG_MWL8K is not set
+CONFIG_NEED_NODE_MEMMAP_SIZE=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+# CONFIG_NET5501 is not set
+# CONFIG_NET_FC is not set
+# CONFIG_NET_PACKET_ENGINE is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_ADAPTEC is not set
+# CONFIG_NET_VENDOR_ALTEON is not set
+# CONFIG_NET_VENDOR_AMD is not set
+# CONFIG_NET_VENDOR_ATHEROS is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_NET_VENDOR_BROCADE is not set
+# CONFIG_NET_VENDOR_CHELSIO is not set
+# CONFIG_NET_VENDOR_CISCO is not set
+# CONFIG_NET_VENDOR_DEC is not set
+# CONFIG_NET_VENDOR_DLINK is not set
+# CONFIG_NET_VENDOR_EMULEX is not set
+# CONFIG_NET_VENDOR_EXAR is not set
+# CONFIG_NET_VENDOR_HP is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MELLANOX is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_MYRI is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_NVIDIA is not set
+# CONFIG_NET_VENDOR_OKI is not set
+# CONFIG_NET_VENDOR_QLOGIC is not set
+# CONFIG_NET_VENDOR_RDC is not set
+CONFIG_NET_VENDOR_REALTEK=y
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SILAN is not set
+# CONFIG_NET_VENDOR_SIS is not set
+# CONFIG_NET_VENDOR_SMSC is not set
+# CONFIG_NET_VENDOR_STMICRO is not set
+# CONFIG_NET_VENDOR_SUN is not set
+# CONFIG_NET_VENDOR_TEHUTI is not set
+# CONFIG_NET_VENDOR_TI is not set
+# CONFIG_NET_VENDOR_VIA is not set
+CONFIG_NOHIGHMEM=y
+# CONFIG_NOZOMI is not set
+CONFIG_NO_BOOTMEM=y
+CONFIG_NR_CPUS=4
+# CONFIG_NSC_GPIO is not set
+CONFIG_NVRAM=y
+CONFIG_OPROFILE_NMI_TIMER=y
+CONFIG_OPTIMIZE_INLINING=y
+CONFIG_OUTPUT_FORMAT="elf32-i386"
+CONFIG_PAGE_OFFSET=0x80000000
+# CONFIG_PANASONIC_LAPTOP is not set
+# CONFIG_PARAVIRT_GUEST is not set
+# CONFIG_PATA_ACPI is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_ATP867X is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5535 is not set
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SCH is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PC8736x_GPIO is not set
+# CONFIG_PCH_PHUB is not set
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+# CONFIG_PCIEAER_INJECT is not set
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_PCIEASPM_DEFAULT=y
+# CONFIG_PCIEASPM_PERFORMANCE is not set
+# CONFIG_PCIEASPM_POWERSAVE is not set
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIE_ECRC is not set
+CONFIG_PCIE_PME=y
+CONFIG_PCI_BIOS=y
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+# CONFIG_PCI_DEBUG is not set
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_GOANY=y
+# CONFIG_PCI_GOBIOS is not set
+# CONFIG_PCI_GODIRECT is not set
+# CONFIG_PCI_GOMMCONFIG is not set
+CONFIG_PCI_IOAPIC=y
+# CONFIG_PCI_IOV is not set
+CONFIG_PCI_LABEL=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_PASID is not set
+# CONFIG_PCI_PRI is not set
+CONFIG_PCI_QUIRKS=y
+# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCSPKR_PLATFORM is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_PHANTOM is not set
+CONFIG_PHYSICAL_ALIGN=0x200000
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PM_TRACE=y
+CONFIG_PM_TRACE_RTC=y
+CONFIG_PNP=y
+CONFIG_PNPACPI=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+# CONFIG_PRISM54 is not set
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_PROC_KCORE=y
+CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
+CONFIG_R8169=m
+# CONFIG_R8187SE is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_RC_ATI_REMOTE is not set
+CONFIG_RC_CORE=m
+# CONFIG_RC_LOOPBACK is not set
+CONFIG_RC_MAP=m
+CONFIG_REALTEK_AUTOPM=y
+# CONFIG_REGULATOR is not set
+# CONFIG_RELOCATABLE is not set
+# CONFIG_RT2400PCI is not set
+# CONFIG_RT2500PCI is not set
+CONFIG_RT2800PCI=m
+CONFIG_RT2800PCI_RT33XX=y
+CONFIG_RT2800PCI_RT35XX=y
+CONFIG_RT2800PCI_RT53XX=y
+CONFIG_RT2800_LIB=m
+# CONFIG_RT2X00_DEBUG is not set
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2X00_LIB_CRYPTO=y
+# CONFIG_RT2X00_LIB_DEBUGFS is not set
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_LEDS=y
+CONFIG_RT2X00_LIB_PCI=m
+# CONFIG_RT61PCI is not set
+CONFIG_RTC_DRV_CMOS=m
+# CONFIG_RTC_HCTOSYS is not set
+# CONFIG_RTL8180 is not set
+CONFIG_RTL8192CE=m
+CONFIG_RTL8192C_COMMON=m
+# CONFIG_RTL8192U is not set
+CONFIG_RTLWIFI=m
+# CONFIG_RTS_PSTOR is not set
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+# CONFIG_SAMSUNG_LAPTOP is not set
+# CONFIG_SAMSUNG_Q10 is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_AHCI_PLATFORM is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PMP is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+CONFIG_SCHED_HRTICK=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_SCHED_SMT=y
+CONFIG_SCSI_CONSTANTS=y
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+# CONFIG_SCx200 is not set
+# CONFIG_SCx200_ACB is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATK0110 is not set
+CONFIG_SENSORS_CORETEMP=y
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SERIAL_8250 is not set
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_MFD_HSU is not set
+# CONFIG_SERIAL_PCH_UART is not set
+CONFIG_SERIO_CT82C710=m
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_PCIPS2=m
+# CONFIG_SFC is not set
+# CONFIG_SFI is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_SLICOSS is not set
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_ASIHPI is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AW2 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS5530 is not set
+# CONFIG_SND_CS5535AUDIO is not set
+# CONFIG_SND_CTXFI is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+CONFIG_SND_DMA_SGBUF=y
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_GINA24 is not set
+CONFIG_SND_HDA_CODEC_ANALOG=y
+CONFIG_SND_HDA_CODEC_CA0110=y
+CONFIG_SND_HDA_CODEC_CA0132=y
+CONFIG_SND_HDA_CODEC_CIRRUS=y
+CONFIG_SND_HDA_CODEC_CMEDIA=y
+CONFIG_SND_HDA_CODEC_CONEXANT=y
+CONFIG_SND_HDA_CODEC_HDMI=y
+CONFIG_SND_HDA_CODEC_REALTEK=y
+CONFIG_SND_HDA_CODEC_SI3054=y
+CONFIG_SND_HDA_CODEC_SIGMATEL=y
+CONFIG_SND_HDA_CODEC_VIA=y
+CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS=y
+CONFIG_SND_HDA_GENERIC=y
+CONFIG_SND_HDA_HWDEP=y
+# CONFIG_SND_HDA_INPUT_BEEP is not set
+CONFIG_SND_HDA_INPUT_JACK=y
+CONFIG_SND_HDA_INTEL=m
+# CONFIG_SND_HDA_PATCH_LOADER is not set
+CONFIG_SND_HDA_POWER_SAVE=y
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=5
+CONFIG_SND_HDA_PREALLOC_SIZE=64
+# CONFIG_SND_HDA_RECONFIG is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+CONFIG_SND_HWDEP=m
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGODJ is not set
+# CONFIG_SND_INDIGODJX is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGOIOX is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+CONFIG_SND_KCTL_JACK=y
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_LOLA is not set
+# CONFIG_SND_LX6464ES is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_OXYGEN is not set
+CONFIG_SND_PCI=y
+CONFIG_SND_PCM=m
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RIPTIDE is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SIS7019 is not set
+# CONFIG_SND_SOC is not set
+# CONFIG_SND_SONICVIBES is not set
+CONFIG_SND_TIMER=m
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VIRTUOSO is not set
+CONFIG_SND_VMASTER=y
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SONYPI is not set
+# CONFIG_SONY_LAPTOP is not set
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM_STATIC=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_SPI_PXA2XX is not set
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_STUB_POULSBO is not set
+# CONFIG_TC1100_WMI is not set
+# CONFIG_TCG_INFINEON is not set
+# CONFIG_TCG_NSC is not set
+CONFIG_TCG_TIS=y
+# CONFIG_TCG_TIS_I2C is not set
+# CONFIG_TELCLOCK is not set
+# CONFIG_THINKPAD_ACPI is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_TOSHIBA is not set
+# CONFIG_TOSHIBA_BT_RFKILL is not set
+# CONFIG_TR is not set
+# CONFIG_TRANSPARENT_HUGEPAGE is not set
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_XHCI=y
+# CONFIG_USB_HSO is not set
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_NET1080=m
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_HCD_PLATFORM is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+CONFIG_USB_STORAGE_REALTEK=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_XHCI_HCD=m
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+# CONFIG_UWB is not set
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_VGA_ARB is not set
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGA_SWITCHEROO is not set
+# CONFIG_VHOST_NET is not set
+# CONFIG_VIDEO_CX231XX is not set
+# CONFIG_VIDEO_IR_I2C is not set
+# CONFIG_VIDEO_TM6000 is not set
+CONFIG_VIRTIO=m
+CONFIG_VIRTIO_BLK=m
+# CONFIG_VIRTIO_CONSOLE is not set
+CONFIG_VIRTIO_NET=m
+CONFIG_VIRTIO_PCI=m
+CONFIG_VIRTIO_RING=m
+CONFIG_VIRTUALIZATION=y
+# CONFIG_VM86 is not set
+# CONFIG_VME_BUS is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_VMSPLIT_2G=y
+# CONFIG_VMSPLIT_3G is not set
+# CONFIG_VMWARE_BALLOON is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_VT6655 is not set
+# CONFIG_WATCHDOG is not set
+CONFIG_X86=y
+CONFIG_X86_32=y
+# CONFIG_X86_32_IRIS is not set
+# CONFIG_X86_32_NON_STANDARD is not set
+CONFIG_X86_32_SMP=y
+# CONFIG_X86_64 is not set
+CONFIG_X86_ACPI_CPUFREQ=y
+# CONFIG_X86_ANCIENT_MCE is not set
+# CONFIG_X86_BIGSMP is not set
+CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
+CONFIG_X86_BSWAP=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_CMPXCHG64=y
+# CONFIG_X86_CPUFREQ_NFORCE2 is not set
+CONFIG_X86_CPUID=y
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_X86_EXTENDED_PLATFORM=y
+# CONFIG_X86_E_POWERSAVER is not set
+# CONFIG_X86_GENERIC is not set
+# CONFIG_X86_GX_SUSPMOD is not set
+CONFIG_X86_HT=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=5
+CONFIG_X86_INVLPG=y
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_L1_CACHE_SHIFT=5
+CONFIG_X86_LOCAL_APIC=y
+# CONFIG_X86_LONGHAUL is not set
+# CONFIG_X86_LONGRUN is not set
+CONFIG_X86_MCE=y
+# CONFIG_X86_MCE_AMD is not set
+# CONFIG_X86_MCE_INJECT is not set
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_THRESHOLD=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=5
+CONFIG_X86_MPPARSE=y
+CONFIG_X86_MSR=y
+# CONFIG_X86_P4_CLOCKMOD is not set
+CONFIG_X86_PAE=y
+CONFIG_X86_PAT=y
+# CONFIG_X86_PCC_CPUFREQ is not set
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_X86_PM_TIMER=y
+CONFIG_X86_POPAD_OK=y
+# CONFIG_X86_PPRO_FENCE is not set
+# CONFIG_X86_PTDUMP is not set
+# CONFIG_X86_RDC321X is not set
+# CONFIG_X86_REBOOTFIXUPS is not set
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_RESERVE_LOW=64
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_ICH is not set
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+# CONFIG_X86_SPEEDSTEP_SMI is not set
+CONFIG_X86_THERMAL_VECTOR=y
+CONFIG_X86_TSC=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_X86_VERBOSE_BOOTUP=y
+# CONFIG_X86_WANT_INTEL_MID is not set
+CONFIG_X86_WP_WORKS_OK=y
+CONFIG_X86_XADD=y
+CONFIG_XFRM_USER=y
+# CONFIG_XO15_EBOOK is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+CONFIG_XZ_DEC_X86=y
+# CONFIG_ZNET is not set
+CONFIG_ZONE_DMA=y
+# CONFIG_ZONE_DMA32 is not set
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_ZRAM=m
+# CONFIG_ZRAM_DEBUG is not set
+CONFIG_ZSMALLOC=m
diff --git a/chromeos/config/x86_64/chromeos-intel-pineview.flavour.config b/chromeos/config/x86_64/chromeos-intel-pineview.flavour.config
new file mode 100644 (file)
index 0000000..47be822
--- /dev/null
@@ -0,0 +1,14 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_BRCMFMAC is not set
+# CONFIG_DRM_GMA500 is not set
+# CONFIG_MOUSE_SYNAPTICS_USB is not set
+# CONFIG_RT2800PCI_RT33XX is not set
+# CONFIG_RT2800PCI_RT35XX is not set
+# CONFIG_RT2800PCI_RT53XX is not set
+# CONFIG_RTL8187 is not set
+# CONFIG_RTL8192CU is not set
+# CONFIG_RTL8192DE is not set
+# CONFIG_RTL8192SE is not set
+# CONFIG_RTLLIB is not set
diff --git a/chromeos/config/x86_64/chromiumos-x86_64.flavour.config b/chromeos/config/x86_64/chromiumos-x86_64.flavour.config
new file mode 100644 (file)
index 0000000..23e20d1
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_BRCMDBG is not set
+CONFIG_BRCMFMAC=m
+CONFIG_BRCMFMAC_USB=y
+CONFIG_BRCMUTIL=m
+CONFIG_DRM_GMA3600=y
+CONFIG_DRM_GMA500=y
+CONFIG_DRM_GMA600=y
+CONFIG_DRM_TTM=y
+CONFIG_MOUSE_SYNAPTICS_USB=m
+CONFIG_RT2800PCI_RT33XX=y
+CONFIG_RT2800PCI_RT35XX=y
+CONFIG_RT2800PCI_RT53XX=y
+CONFIG_RTL8187=m
+CONFIG_RTL8187_LEDS=y
+CONFIG_RTL8192CU=m
+CONFIG_RTL8192DE=m
+# CONFIG_RTL8192E is not set
+CONFIG_RTL8192SE=m
+CONFIG_RTLLIB=m
+CONFIG_RTLLIB_CRYPTO_CCMP=m
+CONFIG_RTLLIB_CRYPTO_TKIP=m
+CONFIG_RTLLIB_CRYPTO_WEP=m
diff --git a/chromeos/config/x86_64/common.config b/chromeos/config/x86_64/common.config
new file mode 100644 (file)
index 0000000..f8125e4
--- /dev/null
@@ -0,0 +1,1002 @@
+#
+# Config options generated by splitconfig
+#
+# CONFIG_60XX_WDT is not set
+CONFIG_64BIT=y
+# CONFIG_8139CP is not set
+# CONFIG_8139TOO is not set
+# CONFIG_ACERHDF is not set
+# CONFIG_ACER_WMI is not set
+CONFIG_ACPI=y
+CONFIG_ACPI_AC=y
+# CONFIG_ACPI_APEI is not set
+CONFIG_ACPI_BATTERY=y
+# CONFIG_ACPI_BGRT is not set
+CONFIG_ACPI_BLACKLIST_YEAR=0
+CONFIG_ACPI_BUTTON=y
+CONFIG_ACPI_CHROMEOS=y
+# CONFIG_ACPI_CMPC is not set
+CONFIG_ACPI_CONTAINER=y
+# CONFIG_ACPI_CUSTOM_DSDT is not set
+# CONFIG_ACPI_CUSTOM_METHOD is not set
+# CONFIG_ACPI_DEBUG is not set
+CONFIG_ACPI_DOCK=y
+# CONFIG_ACPI_EC_DEBUGFS is not set
+CONFIG_ACPI_FAN=y
+# CONFIG_ACPI_HED is not set
+CONFIG_ACPI_HOTPLUG_CPU=y
+# CONFIG_ACPI_PCI_SLOT is not set
+CONFIG_ACPI_PROCESSOR=y
+# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
+CONFIG_ACPI_PROCFS=y
+# CONFIG_ACPI_PROCFS_POWER is not set
+CONFIG_ACPI_PROC_EVENT=y
+# CONFIG_ACPI_QUICKSTART is not set
+# CONFIG_ACPI_SBS is not set
+CONFIG_ACPI_SLEEP=y
+CONFIG_ACPI_THERMAL=y
+# CONFIG_ACPI_TOSHIBA is not set
+CONFIG_ACPI_VIDEO=y
+CONFIG_ACPI_WMI=m
+# CONFIG_ACQUIRE_WDT is not set
+# CONFIG_ADM8211 is not set
+# CONFIG_ADVANTECH_WDT is not set
+CONFIG_AGP=y
+# CONFIG_AGP_AMD64 is not set
+CONFIG_AGP_INTEL=y
+# CONFIG_AGP_SIS is not set
+# CONFIG_AGP_VIA is not set
+# CONFIG_AIRO is not set
+# CONFIG_ALIM1535_WDT is not set
+# CONFIG_ALIM7101_WDT is not set
+# CONFIG_AMD_IOMMU is not set
+CONFIG_AMD_NB=y
+# CONFIG_AMILO_RFKILL is not set
+# CONFIG_APPLE_GMUX is not set
+# CONFIG_APPLICOM is not set
+CONFIG_ARCH_CLOCKSOURCE_DATA=y
+CONFIG_ARCH_CPU_PROBE_RELEASE=y
+CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
+CONFIG_ARCH_DISCARD_MEMBLOCK=y
+CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_CPU_AUTOPROBE=y
+CONFIG_ARCH_HAS_CPU_RELAX=y
+CONFIG_ARCH_HAS_DEFAULT_IDLE=y
+CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
+CONFIG_ARCH_MAY_HAVE_PC_FDC=y
+CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
+CONFIG_ARCH_PROC_KCORE_TEXT=y
+CONFIG_ARCH_RANDOM=y
+CONFIG_ARCH_SELECT_MEMORY_MODEL=y
+CONFIG_ARCH_SPARSEMEM_DEFAULT=y
+CONFIG_ARCH_SPARSEMEM_ENABLE=y
+CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_ARCH_SUPPORTS_MSI=y
+CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
+CONFIG_ARCH_USES_PG_UNCACHED=y
+CONFIG_ARCH_WANT_FRAME_POINTERS=y
+CONFIG_ARCH_WANT_OLD_COMPAT_IPC=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
+# CONFIG_ARCNET is not set
+# CONFIG_ASUS_LAPTOP is not set
+# CONFIG_ASUS_WMI is not set
+CONFIG_ATA=y
+CONFIG_ATA_ACPI=y
+CONFIG_ATA_BMDMA=y
+CONFIG_ATA_GENERIC=y
+# CONFIG_ATA_NONSTANDARD is not set
+CONFIG_ATA_PIIX=y
+CONFIG_ATA_SFF=y
+CONFIG_ATA_VERBOSE_ERROR=y
+CONFIG_ATH5K=m
+# CONFIG_ATH5K_DEBUG is not set
+CONFIG_ATH5K_PCI=y
+# CONFIG_ATH5K_TRACER is not set
+# CONFIG_ATH6KL is not set
+CONFIG_ATH9K=m
+# CONFIG_ATH9K_AHB is not set
+CONFIG_ATH9K_BTCOEX_SUPPORT=y
+CONFIG_ATH9K_COMMON=m
+CONFIG_ATH9K_DEBUGFS=y
+# CONFIG_ATH9K_DFS_CERTIFIED is not set
+CONFIG_ATH9K_HW=m
+CONFIG_ATH9K_MAC_DEBUG=y
+CONFIG_ATH9K_PCI=y
+CONFIG_ATH9K_RATE_CONTROL=y
+# CONFIG_ATMEL is not set
+CONFIG_AUDIT_ARCH=y
+# CONFIG_BACKLIGHT_APPLE is not set
+# CONFIG_BACKLIGHT_PROGEAR is not set
+# CONFIG_BACKLIGHT_SAHARA is not set
+# CONFIG_BLK_CPQ_CISS_DA is not set
+# CONFIG_BLK_CPQ_DA is not set
+# CONFIG_BLK_DEV_DAC960 is not set
+# CONFIG_BLK_DEV_FD is not set
+# CONFIG_BLK_DEV_HD is not set
+# CONFIG_BLK_DEV_NVME is not set
+# CONFIG_BLK_DEV_PCIESSD_MTIP32XX is not set
+# CONFIG_BLK_DEV_SX8 is not set
+# CONFIG_BLK_DEV_UMEM is not set
+CONFIG_BLOCK_COMPAT=y
+# CONFIG_BPF_JIT is not set
+# CONFIG_BROADCOM_PHY is not set
+CONFIG_BT_ATH3K=m
+CONFIG_BT_HCIBCM203X=m
+CONFIG_BT_HCIBPA10X=m
+# CONFIG_BT_HCIUART is not set
+# CONFIG_CALGARY_IOMMU is not set
+# CONFIG_CB710_CORE is not set
+# CONFIG_CHARGER_GPIO is not set
+CONFIG_CHECK_SIGNATURE=y
+CONFIG_CHROMEOS_LAPTOP=y
+CONFIG_CHROMEOS_RAMOOPS_RAM_START=0x00f00000
+CONFIG_CLKBLD_I8253=y
+CONFIG_CLKEVT_I8253=y
+CONFIG_CLOCKSOURCE_WATCHDOG=y
+# CONFIG_CMDLINE_BOOL is not set
+# CONFIG_COMEDI is not set
+# CONFIG_COMPAL_LAPTOP is not set
+CONFIG_COMPAT=y
+CONFIG_COMPAT_BINFMT_ELF=y
+CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
+CONFIG_COMPAT_NETLINK_MESSAGES=y
+# CONFIG_COMPAT_VDSO is not set
+# CONFIG_CORDIC is not set
+CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
+# CONFIG_CPA_DEBUG is not set
+# CONFIG_CPU5_WDT is not set
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_IDLE=y
+CONFIG_CPU_IDLE_GOV_LADDER=y
+CONFIG_CPU_IDLE_GOV_MENU=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_INTEL=y
+# CONFIG_CRASH_DUMP is not set
+# CONFIG_CRC8 is not set
+CONFIG_CRYPTO_AES_NI_INTEL=m
+CONFIG_CRYPTO_AES_X86_64=m
+# CONFIG_CRYPTO_BLOWFISH_X86_64 is not set
+# CONFIG_CRYPTO_CAMELLIA_X86_64 is not set
+# CONFIG_CRYPTO_CRC32C_INTEL is not set
+CONFIG_CRYPTO_CRYPTD=m
+# CONFIG_CRYPTO_DEV_PADLOCK is not set
+# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set
+# CONFIG_CRYPTO_SALSA20_X86_64 is not set
+# CONFIG_CRYPTO_SERPENT_SSE2_X86_64 is not set
+# CONFIG_CRYPTO_SHA1_SSSE3 is not set
+# CONFIG_CRYPTO_TWOFISH_X86_64 is not set
+# CONFIG_CRYPTO_TWOFISH_X86_64_3WAY is not set
+# CONFIG_CRYSTALHD is not set
+CONFIG_DCACHE_WORD_ACCESS=y
+# CONFIG_DCDBAS is not set
+CONFIG_DEBUG_BOOT_PARAMS=y
+# CONFIG_DEBUG_NMI_SELFTEST is not set
+# CONFIG_DEBUG_NX_TEST is not set
+CONFIG_DEBUG_RODATA=y
+# CONFIG_DEBUG_RODATA_TEST is not set
+CONFIG_DEBUG_SET_MODULE_RONX=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set
+# CONFIG_DEBUG_VIRTUAL is not set
+CONFIG_DEFAULT_IO_DELAY_TYPE=1
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+# CONFIG_DELL_RBU is not set
+CONFIG_DELL_WMI=m
+# CONFIG_DELL_WMI_AIO is not set
+CONFIG_DEVPORT=y
+CONFIG_DIRECT_GBPAGES=y
+CONFIG_DMA_SHARED_BUFFER=y
+CONFIG_DMI=y
+CONFIG_DMIID=y
+# CONFIG_DMI_SYSFS is not set
+CONFIG_DRM=y
+# CONFIG_DRM_I2C_CH7006 is not set
+# CONFIG_DRM_I2C_SIL164 is not set
+# CONFIG_DRM_I810 is not set
+CONFIG_DRM_I915=y
+CONFIG_DRM_I915_KMS=y
+CONFIG_DRM_KMS_HELPER=y
+# CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
+# CONFIG_DRM_MGA is not set
+# CONFIG_DRM_NOUVEAU is not set
+# CONFIG_DRM_R128 is not set
+# CONFIG_DRM_RADEON is not set
+# CONFIG_DRM_SAVAGE is not set
+# CONFIG_DRM_SIS is not set
+# CONFIG_DRM_TDFX is not set
+# CONFIG_DRM_UDL is not set
+# CONFIG_DRM_VIA is not set
+# CONFIG_DRM_VMWGFX is not set
+# CONFIG_DX_SEP is not set
+CONFIG_E100=m
+CONFIG_E1000=m
+CONFIG_E1000E=m
+CONFIG_EARLY_PRINTK_DBGP=y
+# CONFIG_EDAC is not set
+# CONFIG_EDD is not set
+# CONFIG_EEEPC_LAPTOP is not set
+CONFIG_EEPROM_93CX6=m
+CONFIG_EFI=y
+# CONFIG_EFI_STUB is not set
+# CONFIG_EFI_VARS is not set
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ET131X is not set
+# CONFIG_EUROTECH_WDT is not set
+CONFIG_EXTRA_FIRMWARE=""
+# CONFIG_F71808E_WDT is not set
+# CONFIG_FB_3DFX is not set
+# CONFIG_FB_ARC is not set
+# CONFIG_FB_ARK is not set
+# CONFIG_FB_ASILIANT is not set
+# CONFIG_FB_ATY is not set
+# CONFIG_FB_ATY128 is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_CARMINE is not set
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_CIRRUS is not set
+# CONFIG_FB_CYBER2000 is not set
+# CONFIG_FB_EFI is not set
+# CONFIG_FB_GEODE is not set
+# CONFIG_FB_HGA is not set
+# CONFIG_FB_I740 is not set
+# CONFIG_FB_IMSTT is not set
+# CONFIG_FB_KYRO is not set
+# CONFIG_FB_LE80578 is not set
+# CONFIG_FB_MATROX is not set
+# CONFIG_FB_MB862XX is not set
+# CONFIG_FB_N411 is not set
+# CONFIG_FB_NEOMAGIC is not set
+# CONFIG_FB_NVIDIA is not set
+# CONFIG_FB_PM2 is not set
+# CONFIG_FB_PM3 is not set
+# CONFIG_FB_RADEON is not set
+# CONFIG_FB_RIVA is not set
+# CONFIG_FB_S3 is not set
+# CONFIG_FB_SAVAGE is not set
+# CONFIG_FB_SIS is not set
+# CONFIG_FB_TRIDENT is not set
+# CONFIG_FB_VESA is not set
+# CONFIG_FB_VGA16 is not set
+# CONFIG_FB_VIA is not set
+# CONFIG_FB_VOODOO1 is not set
+# CONFIG_FB_VT8623 is not set
+# CONFIG_FB_XGI is not set
+# CONFIG_FDDI is not set
+# CONFIG_FEALNX is not set
+# CONFIG_FIREWIRE is not set
+# CONFIG_FIREWIRE_NOSY is not set
+CONFIG_FIRMWARE_MEMMAP=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
+CONFIG_FRAME_WARN=2048
+CONFIG_FTRACE_NMI_ENTER=y
+CONFIG_FTRACE_SYSCALLS=y
+# CONFIG_FUJITSU_LAPTOP is not set
+# CONFIG_FUJITSU_TABLET is not set
+CONFIG_FUNCTION_GRAPH_TRACER=y
+# CONFIG_FUSION is not set
+CONFIG_GART_IOMMU=y
+CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
+CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_CPU=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_IOMAP=y
+CONFIG_GENERIC_ISA_DMA=y
+CONFIG_GENERIC_PENDING_IRQ=y
+CONFIG_GENERIC_TIME_VSYSCALL=y
+CONFIG_GOOGLE_FIRMWARE=y
+CONFIG_GOOGLE_MEMCONSOLE=m
+# CONFIG_GOOGLE_SMI is not set
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_GPIO_IT8761E is not set
+# CONFIG_GPIO_LANGWELL is not set
+# CONFIG_GPIO_ML_IOH is not set
+CONFIG_GPIO_NM10=m
+# CONFIG_GPIO_PCH is not set
+# CONFIG_GPIO_RDC321X is not set
+# CONFIG_GPIO_SCH is not set
+# CONFIG_GPIO_VX855 is not set
+# CONFIG_HANGCHECK_TIMER is not set
+CONFIG_HARDLOCKUP_DETECTOR=y
+CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
+# CONFIG_HAVE_AOUT is not set
+CONFIG_HAVE_ARCH_KMEMCHECK=y
+CONFIG_HAVE_ARCH_TRACEHOOK=y
+CONFIG_HAVE_BPF_JIT=y
+CONFIG_HAVE_CMPXCHG_DOUBLE=y
+CONFIG_HAVE_CMPXCHG_LOCAL=y
+CONFIG_HAVE_DMA_ATTRS=y
+CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
+CONFIG_HAVE_FTRACE_NMI_ENTER=y
+CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
+CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_IOREMAP_PROT=y
+CONFIG_HAVE_KERNEL_BZIP2=y
+CONFIG_HAVE_KVM=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_HAVE_MEMBLOCK_NODE_MAP=y
+CONFIG_HAVE_MEMORY_PRESENT=y
+CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
+CONFIG_HAVE_MMIOTRACE_SUPPORT=y
+CONFIG_HAVE_OPTPROBES=y
+CONFIG_HAVE_PCSPKR_PLATFORM=y
+CONFIG_HAVE_PERF_EVENTS_NMI=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
+CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
+CONFIG_HAVE_TEXT_POKE_SMP=y
+CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
+CONFIG_HAVE_USER_RETURN_NOTIFIER=y
+# CONFIG_HERMES is not set
+# CONFIG_HIBERNATION is not set
+CONFIG_HID_MICROSOFT=m
+CONFIG_HID_PID=y
+# CONFIG_HIPPI is not set
+CONFIG_HOSTAP_PCI=m
+CONFIG_HOSTAP_PLX=m
+CONFIG_HOTPLUG_PCI=y
+# CONFIG_HOTPLUG_PCI_ACPI is not set
+# CONFIG_HOTPLUG_PCI_CPCI is not set
+# CONFIG_HOTPLUG_PCI_FAKE is not set
+CONFIG_HOTPLUG_PCI_PCIE=y
+# CONFIG_HOTPLUG_PCI_SHPC is not set
+CONFIG_HPET=y
+CONFIG_HPET_EMULATE_RTC=y
+# CONFIG_HPET_MMAP is not set
+CONFIG_HPET_TIMER=y
+# CONFIG_HP_ACCEL is not set
+# CONFIG_HP_ILO is not set
+# CONFIG_HP_WATCHDOG is not set
+CONFIG_HP_WMI=m
+CONFIG_HT_IRQ=y
+# CONFIG_HUGETLBFS is not set
+# CONFIG_HW_RANDOM_AMD is not set
+CONFIG_HW_RANDOM_INTEL=y
+# CONFIG_HW_RANDOM_VIA is not set
+# CONFIG_HW_RANDOM_VIRTIO is not set
+# CONFIG_HYPERV is not set
+CONFIG_HZ=1000
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_1000=y
+# CONFIG_HZ_250 is not set
+# CONFIG_HZ_300 is not set
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALI1535 is not set
+# CONFIG_I2C_ALI1563 is not set
+# CONFIG_I2C_ALI15X3 is not set
+# CONFIG_I2C_AMD756 is not set
+# CONFIG_I2C_AMD8111 is not set
+# CONFIG_I2C_DESIGNWARE_PCI is not set
+# CONFIG_I2C_EG20T is not set
+CONFIG_I2C_I801=y
+# CONFIG_I2C_INTEL_MID is not set
+# CONFIG_I2C_ISCH is not set
+# CONFIG_I2C_NFORCE2 is not set
+CONFIG_I2C_PIIX4=m
+# CONFIG_I2C_SCMI is not set
+# CONFIG_I2C_SIS5595 is not set
+# CONFIG_I2C_SIS630 is not set
+# CONFIG_I2C_SIS96X is not set
+# CONFIG_I2C_VIA is not set
+# CONFIG_I2C_VIAPRO is not set
+# CONFIG_I2O is not set
+# CONFIG_I6300ESB_WDT is not set
+# CONFIG_I7300_IDLE is not set
+# CONFIG_I8K is not set
+# CONFIG_IA32_AOUT is not set
+CONFIG_IA32_EMULATION=y
+# CONFIG_IB700_WDT is not set
+# CONFIG_IBMASR is not set
+# CONFIG_IBM_ASM is not set
+# CONFIG_IBM_RTL is not set
+# CONFIG_IDE is not set
+# CONFIG_IDEAPAD_LAPTOP is not set
+# CONFIG_IDE_PHISON is not set
+# CONFIG_IGB is not set
+CONFIG_IGBVF=m
+CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
+# CONFIG_INFINIBAND is not set
+# CONFIG_INPUT_APANEL is not set
+# CONFIG_INPUT_ATLAS_BTNS is not set
+CONFIG_INPUT_SPARSEKMAP=m
+CONFIG_INSTRUCTION_DECODER=y
+# CONFIG_INTEL_IDLE is not set
+# CONFIG_INTEL_IOMMU is not set
+# CONFIG_INTEL_IPS is not set
+# CONFIG_INTEL_MEI is not set
+CONFIG_INTEL_MENLOW=m
+# CONFIG_INTEL_MID_PTI is not set
+# CONFIG_INTEL_OAKTRAIL is not set
+# CONFIG_IOMMU_DEBUG is not set
+CONFIG_IOMMU_HELPER=y
+# CONFIG_IOMMU_STRESS is not set
+# CONFIG_IO_DELAY_0X80 is not set
+CONFIG_IO_DELAY_0XED=y
+# CONFIG_IO_DELAY_NONE is not set
+CONFIG_IO_DELAY_TYPE_0X80=0
+CONFIG_IO_DELAY_TYPE_0XED=1
+CONFIG_IO_DELAY_TYPE_NONE=3
+CONFIG_IO_DELAY_TYPE_UDELAY=2
+# CONFIG_IO_DELAY_UDELAY is not set
+# CONFIG_IP1000 is not set
+# CONFIG_IPW2100 is not set
+# CONFIG_IPW2200 is not set
+CONFIG_IRQ_FORCED_THREADING=y
+# CONFIG_IRQ_REMAP is not set
+# CONFIG_IRQ_TIME_ACCOUNTING is not set
+# CONFIG_IR_ENE is not set
+# CONFIG_IR_FINTEK is not set
+# CONFIG_IR_GPIO_CIR is not set
+# CONFIG_IR_IMON is not set
+# CONFIG_IR_ITE_CIR is not set
+# CONFIG_IR_JVC_DECODER is not set
+# CONFIG_IR_LIRC_CODEC is not set
+# CONFIG_IR_MCEUSB is not set
+CONFIG_IR_MCE_KBD_DECODER=m
+# CONFIG_IR_NEC_DECODER is not set
+# CONFIG_IR_NUVOTON is not set
+# CONFIG_IR_RC5_DECODER is not set
+# CONFIG_IR_RC5_SZ_DECODER is not set
+# CONFIG_IR_RC6_DECODER is not set
+# CONFIG_IR_REDRAT3 is not set
+CONFIG_IR_SANYO_DECODER=m
+# CONFIG_IR_SONY_DECODER is not set
+# CONFIG_IR_STREAMZAP is not set
+# CONFIG_IR_WINBOND_CIR is not set
+CONFIG_ISA_DMA_API=y
+# CONFIG_ISCSI_IBFT_FIND is not set
+# CONFIG_IT8712F_WDT is not set
+# CONFIG_IT87_WDT is not set
+# CONFIG_ITCO_WDT is not set
+CONFIG_IWL3945=m
+CONFIG_IWL4965=m
+CONFIG_IWLEGACY=m
+# CONFIG_IWLEGACY_DEBUG is not set
+# CONFIG_IWLEGACY_DEBUGFS is not set
+CONFIG_IWLWIFI=m
+# CONFIG_IWLWIFI_DEBUG is not set
+# CONFIG_IWLWIFI_DEBUGFS is not set
+CONFIG_IWLWIFI_DEVICE_TESTMODE=y
+# CONFIG_IWLWIFI_DEVICE_TRACING is not set
+# CONFIG_IWLWIFI_EXPERIMENTAL_MFP is not set
+# CONFIG_IWLWIFI_P2P is not set
+# CONFIG_IXGB is not set
+# CONFIG_IXGBE is not set
+# CONFIG_IXGBEVF is not set
+CONFIG_JME=m
+# CONFIG_KERNEL_BZIP2 is not set
+CONFIG_KEYS_COMPAT=y
+# CONFIG_KTIME_SCALAR is not set
+# CONFIG_KVM is not set
+# CONFIG_LATENCYTOP is not set
+# CONFIG_LEDS_CLEVO_MAIL is not set
+# CONFIG_LEDS_DELL_NETBOOKS is not set
+# CONFIG_LEDS_INTEL_SS4200 is not set
+# CONFIG_LIBERTAS is not set
+CONFIG_LIBERTAS_THINFIRM_USB=m
+CONFIG_LIRC=m
+CONFIG_LOW_MEM_NOTIFY=y
+CONFIG_LPC_SCH=m
+CONFIG_LZO_COMPRESS=m
+CONFIG_LZO_DECOMPRESS=m
+# CONFIG_MACHZ_WDT is not set
+# CONFIG_MACINTOSH_DRIVERS is not set
+# CONFIG_MATOM is not set
+# CONFIG_MAXSMP is not set
+# CONFIG_MCORE2 is not set
+# CONFIG_MEMORY_FAILURE is not set
+# CONFIG_MEMORY_HOTPLUG is not set
+# CONFIG_MEMTEST is not set
+CONFIG_MFD_CORE=m
+# CONFIG_MFD_CS5535 is not set
+# CONFIG_MFD_JANZ_CMODIO is not set
+# CONFIG_MFD_RDC321X is not set
+# CONFIG_MFD_TIMBERDALE is not set
+# CONFIG_MFD_TPS6586X is not set
+# CONFIG_MFD_VX855 is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_AMD=y
+CONFIG_MICROCODE_INTEL=y
+CONFIG_MICROCODE_OLD_INTERFACE=y
+# CONFIG_MK8 is not set
+# CONFIG_MMC is not set
+# CONFIG_MMIOTRACE is not set
+CONFIG_MOUSE_APPLETOUCH=m
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_ELANTECH=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+# CONFIG_MOUSE_PS2_SENTELIC is not set
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MPSC is not set
+# CONFIG_MSI_LAPTOP is not set
+# CONFIG_MSI_WMI is not set
+CONFIG_MTRR=y
+# CONFIG_MTRR_SANITIZER is not set
+# CONFIG_MWAVE is not set
+# CONFIG_MWIFIEX is not set
+# CONFIG_MWL8K is not set
+# CONFIG_MXM_WMI is not set
+CONFIG_NEED_DMA_MAP_STATE=y
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_NEED_SG_DMA_LENGTH=y
+# CONFIG_NET_FC is not set
+# CONFIG_NET_PACKET_ENGINE is not set
+# CONFIG_NET_SB1000 is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_ADAPTEC is not set
+# CONFIG_NET_VENDOR_ALTEON is not set
+# CONFIG_NET_VENDOR_AMD is not set
+# CONFIG_NET_VENDOR_ATHEROS is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_NET_VENDOR_BROCADE is not set
+# CONFIG_NET_VENDOR_CHELSIO is not set
+# CONFIG_NET_VENDOR_CISCO is not set
+# CONFIG_NET_VENDOR_DEC is not set
+# CONFIG_NET_VENDOR_DLINK is not set
+# CONFIG_NET_VENDOR_EMULEX is not set
+# CONFIG_NET_VENDOR_EXAR is not set
+# CONFIG_NET_VENDOR_HP is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MELLANOX is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_MYRI is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_NVIDIA is not set
+# CONFIG_NET_VENDOR_OKI is not set
+# CONFIG_NET_VENDOR_QLOGIC is not set
+# CONFIG_NET_VENDOR_RDC is not set
+CONFIG_NET_VENDOR_REALTEK=y
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SILAN is not set
+# CONFIG_NET_VENDOR_SIS is not set
+# CONFIG_NET_VENDOR_SMSC is not set
+# CONFIG_NET_VENDOR_STMICRO is not set
+# CONFIG_NET_VENDOR_SUN is not set
+# CONFIG_NET_VENDOR_TEHUTI is not set
+# CONFIG_NET_VENDOR_TI is not set
+# CONFIG_NET_VENDOR_VIA is not set
+CONFIG_NF_CONNTRACK_PROCFS=y
+CONFIG_NF_CONNTRACK_PROC_COMPAT=y
+# CONFIG_NOZOMI is not set
+CONFIG_NO_BOOTMEM=y
+CONFIG_NR_CPUS=4
+# CONFIG_NUMA is not set
+CONFIG_NVRAM=y
+# CONFIG_NV_TCO is not set
+CONFIG_OPROFILE_NMI_TIMER=y
+CONFIG_OPTIMIZE_INLINING=y
+CONFIG_OUTPUT_FORMAT="elf64-x86-64"
+CONFIG_PAGEFLAGS_EXTENDED=y
+# CONFIG_PANASONIC_LAPTOP is not set
+# CONFIG_PARAVIRT_GUEST is not set
+# CONFIG_PATA_ACPI is not set
+# CONFIG_PATA_ALI is not set
+# CONFIG_PATA_AMD is not set
+# CONFIG_PATA_ARTOP is not set
+# CONFIG_PATA_ATIIXP is not set
+# CONFIG_PATA_ATP867X is not set
+# CONFIG_PATA_CMD640_PCI is not set
+# CONFIG_PATA_CMD64X is not set
+# CONFIG_PATA_CS5520 is not set
+# CONFIG_PATA_CS5530 is not set
+# CONFIG_PATA_CS5536 is not set
+# CONFIG_PATA_CYPRESS is not set
+# CONFIG_PATA_EFAR is not set
+# CONFIG_PATA_HPT366 is not set
+# CONFIG_PATA_HPT37X is not set
+# CONFIG_PATA_HPT3X2N is not set
+# CONFIG_PATA_HPT3X3 is not set
+# CONFIG_PATA_IT8213 is not set
+# CONFIG_PATA_IT821X is not set
+# CONFIG_PATA_JMICRON is not set
+# CONFIG_PATA_LEGACY is not set
+# CONFIG_PATA_MARVELL is not set
+# CONFIG_PATA_MPIIX is not set
+# CONFIG_PATA_NETCELL is not set
+# CONFIG_PATA_NINJA32 is not set
+# CONFIG_PATA_NS87410 is not set
+# CONFIG_PATA_NS87415 is not set
+# CONFIG_PATA_OLDPIIX is not set
+# CONFIG_PATA_OPTI is not set
+# CONFIG_PATA_OPTIDMA is not set
+# CONFIG_PATA_PDC2027X is not set
+# CONFIG_PATA_PDC_OLD is not set
+# CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_RADISYS is not set
+# CONFIG_PATA_RDC is not set
+# CONFIG_PATA_RZ1000 is not set
+# CONFIG_PATA_SC1200 is not set
+# CONFIG_PATA_SCH is not set
+# CONFIG_PATA_SERVERWORKS is not set
+# CONFIG_PATA_SIL680 is not set
+# CONFIG_PATA_SIS is not set
+# CONFIG_PATA_TOSHIBA is not set
+# CONFIG_PATA_TRIFLEX is not set
+# CONFIG_PATA_VIA is not set
+# CONFIG_PATA_WINBOND is not set
+# CONFIG_PC87413_WDT is not set
+# CONFIG_PCH_PHUB is not set
+CONFIG_PCI=y
+CONFIG_PCIEAER=y
+# CONFIG_PCIEAER_INJECT is not set
+CONFIG_PCIEASPM=y
+# CONFIG_PCIEASPM_DEBUG is not set
+CONFIG_PCIEASPM_DEFAULT=y
+# CONFIG_PCIEASPM_PERFORMANCE is not set
+# CONFIG_PCIEASPM_POWERSAVE is not set
+CONFIG_PCIEPORTBUS=y
+# CONFIG_PCIE_ECRC is not set
+CONFIG_PCIE_PME=y
+# CONFIG_PCIPCWATCHDOG is not set
+# CONFIG_PCI_CNB20LE_QUIRK is not set
+# CONFIG_PCI_DEBUG is not set
+CONFIG_PCI_DIRECT=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_PCI_IOAPIC=y
+# CONFIG_PCI_IOV is not set
+CONFIG_PCI_LABEL=y
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_MSI=y
+# CONFIG_PCI_PASID is not set
+# CONFIG_PCI_PRI is not set
+CONFIG_PCI_QUIRKS=y
+# CONFIG_PCI_REALLOC_ENABLE_AUTO is not set
+# CONFIG_PCI_STUB is not set
+# CONFIG_PCSPKR_PLATFORM is not set
+# CONFIG_PDC_ADMA is not set
+# CONFIG_PHANTOM is not set
+CONFIG_PHYSICAL_ALIGN=0x1000000
+CONFIG_PHYSICAL_START=0x1000000
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PM_TRACE=y
+CONFIG_PM_TRACE_RTC=y
+CONFIG_PNP=y
+CONFIG_PNPACPI=y
+CONFIG_PNP_DEBUG_MESSAGES=y
+# CONFIG_PRISM54 is not set
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_PROC_KCORE=y
+CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
+CONFIG_R8169=m
+# CONFIG_R8187SE is not set
+# CONFIG_RAPIDIO is not set
+# CONFIG_RC_ATI_REMOTE is not set
+CONFIG_RC_CORE=m
+# CONFIG_RC_LOOPBACK is not set
+CONFIG_RC_MAP=m
+CONFIG_REALTEK_AUTOPM=y
+# CONFIG_REGULATOR is not set
+# CONFIG_RELOCATABLE is not set
+# CONFIG_RT2400PCI is not set
+# CONFIG_RT2500PCI is not set
+# CONFIG_RT2500USB is not set
+CONFIG_RT2800PCI=m
+# CONFIG_RT2800USB is not set
+CONFIG_RT2800_LIB=m
+# CONFIG_RT2X00_DEBUG is not set
+CONFIG_RT2X00_LIB=m
+CONFIG_RT2X00_LIB_CRYPTO=y
+# CONFIG_RT2X00_LIB_DEBUGFS is not set
+CONFIG_RT2X00_LIB_FIRMWARE=y
+CONFIG_RT2X00_LIB_LEDS=y
+CONFIG_RT2X00_LIB_PCI=m
+# CONFIG_RT61PCI is not set
+# CONFIG_RT73USB is not set
+CONFIG_RTC_DRV_CMOS=m
+# CONFIG_RTC_HCTOSYS is not set
+# CONFIG_RTL8180 is not set
+CONFIG_RTL8192CE=m
+CONFIG_RTL8192C_COMMON=m
+# CONFIG_RTL8192U is not set
+CONFIG_RTLWIFI=m
+# CONFIG_RTLWIFI_DEBUG is not set
+# CONFIG_RTS_PSTOR is not set
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+# CONFIG_SAMSUNG_LAPTOP is not set
+# CONFIG_SAMSUNG_Q10 is not set
+# CONFIG_SATA_ACARD_AHCI is not set
+CONFIG_SATA_AHCI=y
+# CONFIG_SATA_AHCI_PLATFORM is not set
+# CONFIG_SATA_INIC162X is not set
+# CONFIG_SATA_MV is not set
+# CONFIG_SATA_NV is not set
+# CONFIG_SATA_PMP is not set
+# CONFIG_SATA_PROMISE is not set
+# CONFIG_SATA_QSTOR is not set
+# CONFIG_SATA_SIL is not set
+# CONFIG_SATA_SIL24 is not set
+# CONFIG_SATA_SIS is not set
+# CONFIG_SATA_SVW is not set
+# CONFIG_SATA_SX4 is not set
+# CONFIG_SATA_ULI is not set
+# CONFIG_SATA_VIA is not set
+# CONFIG_SATA_VITESSE is not set
+# CONFIG_SBC8360_WDT is not set
+# CONFIG_SBC_EPX_C3_WATCHDOG is not set
+# CONFIG_SBC_FITPC2_WATCHDOG is not set
+# CONFIG_SC1200_WDT is not set
+# CONFIG_SC520_WDT is not set
+CONFIG_SCHED_HRTICK=y
+CONFIG_SCHED_MC=y
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+CONFIG_SCHED_SMT=y
+CONFIG_SCSI_CONSTANTS=y
+# CONFIG_SCSI_LOWLEVEL is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ABITUGURU3 is not set
+# CONFIG_SENSORS_ACPI_POWER is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATK0110 is not set
+CONFIG_SENSORS_CORETEMP=y
+# CONFIG_SENSORS_FAM15H_POWER is not set
+# CONFIG_SENSORS_FSCHMD is not set
+# CONFIG_SENSORS_HDAPS is not set
+# CONFIG_SENSORS_I5K_AMB is not set
+# CONFIG_SENSORS_K10TEMP is not set
+# CONFIG_SENSORS_K8TEMP is not set
+# CONFIG_SENSORS_SIS5595 is not set
+# CONFIG_SENSORS_VIA686A is not set
+# CONFIG_SENSORS_VIA_CPUTEMP is not set
+# CONFIG_SENSORS_VT8231 is not set
+# CONFIG_SERIAL_8250 is not set
+# CONFIG_SERIAL_JSM is not set
+# CONFIG_SERIAL_MFD_HSU is not set
+# CONFIG_SERIAL_PCH_UART is not set
+CONFIG_SERIO_CT82C710=m
+CONFIG_SERIO_I8042=y
+CONFIG_SERIO_PCIPS2=m
+# CONFIG_SFC is not set
+# CONFIG_SFI is not set
+# CONFIG_SGI_IOC4 is not set
+# CONFIG_SLICOSS is not set
+# CONFIG_SMSC37B787_WDT is not set
+# CONFIG_SMSC_SCH311X_WDT is not set
+# CONFIG_SND_AD1889 is not set
+# CONFIG_SND_ALI5451 is not set
+# CONFIG_SND_ALS300 is not set
+# CONFIG_SND_ALS4000 is not set
+# CONFIG_SND_ASIHPI is not set
+# CONFIG_SND_ATIIXP is not set
+# CONFIG_SND_ATIIXP_MODEM is not set
+# CONFIG_SND_AU8810 is not set
+# CONFIG_SND_AU8820 is not set
+# CONFIG_SND_AU8830 is not set
+# CONFIG_SND_AW2 is not set
+# CONFIG_SND_AZT3328 is not set
+# CONFIG_SND_BT87X is not set
+# CONFIG_SND_CA0106 is not set
+# CONFIG_SND_CMIPCI is not set
+# CONFIG_SND_CS4281 is not set
+# CONFIG_SND_CS46XX is not set
+# CONFIG_SND_CS5530 is not set
+# CONFIG_SND_CS5535AUDIO is not set
+# CONFIG_SND_CTXFI is not set
+# CONFIG_SND_DARLA20 is not set
+# CONFIG_SND_DARLA24 is not set
+CONFIG_SND_DMA_SGBUF=y
+# CONFIG_SND_ECHO3G is not set
+# CONFIG_SND_EMU10K1 is not set
+# CONFIG_SND_EMU10K1X is not set
+# CONFIG_SND_ENS1370 is not set
+# CONFIG_SND_ENS1371 is not set
+# CONFIG_SND_ES1938 is not set
+# CONFIG_SND_ES1968 is not set
+# CONFIG_SND_FM801 is not set
+# CONFIG_SND_GINA20 is not set
+# CONFIG_SND_GINA24 is not set
+CONFIG_SND_HDA_CODEC_ANALOG=y
+CONFIG_SND_HDA_CODEC_CA0110=y
+CONFIG_SND_HDA_CODEC_CA0132=y
+CONFIG_SND_HDA_CODEC_CIRRUS=y
+CONFIG_SND_HDA_CODEC_CMEDIA=y
+CONFIG_SND_HDA_CODEC_CONEXANT=y
+CONFIG_SND_HDA_CODEC_HDMI=y
+CONFIG_SND_HDA_CODEC_REALTEK=y
+CONFIG_SND_HDA_CODEC_SI3054=y
+CONFIG_SND_HDA_CODEC_SIGMATEL=y
+CONFIG_SND_HDA_CODEC_VIA=y
+CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS=y
+CONFIG_SND_HDA_GENERIC=y
+CONFIG_SND_HDA_HWDEP=y
+# CONFIG_SND_HDA_INPUT_BEEP is not set
+CONFIG_SND_HDA_INPUT_JACK=y
+CONFIG_SND_HDA_INTEL=m
+# CONFIG_SND_HDA_PATCH_LOADER is not set
+CONFIG_SND_HDA_POWER_SAVE=y
+CONFIG_SND_HDA_POWER_SAVE_DEFAULT=5
+CONFIG_SND_HDA_PREALLOC_SIZE=64
+# CONFIG_SND_HDA_RECONFIG is not set
+# CONFIG_SND_HDSP is not set
+# CONFIG_SND_HDSPM is not set
+CONFIG_SND_HWDEP=m
+# CONFIG_SND_ICE1712 is not set
+# CONFIG_SND_ICE1724 is not set
+# CONFIG_SND_INDIGO is not set
+# CONFIG_SND_INDIGODJ is not set
+# CONFIG_SND_INDIGODJX is not set
+# CONFIG_SND_INDIGOIO is not set
+# CONFIG_SND_INDIGOIOX is not set
+# CONFIG_SND_INTEL8X0 is not set
+# CONFIG_SND_INTEL8X0M is not set
+CONFIG_SND_KCTL_JACK=y
+# CONFIG_SND_KORG1212 is not set
+# CONFIG_SND_LAYLA20 is not set
+# CONFIG_SND_LAYLA24 is not set
+# CONFIG_SND_LOLA is not set
+# CONFIG_SND_LX6464ES is not set
+# CONFIG_SND_MAESTRO3 is not set
+# CONFIG_SND_MIA is not set
+# CONFIG_SND_MIXART is not set
+# CONFIG_SND_MONA is not set
+# CONFIG_SND_NM256 is not set
+# CONFIG_SND_OXYGEN is not set
+CONFIG_SND_PCI=y
+CONFIG_SND_PCM=m
+# CONFIG_SND_PCXHR is not set
+# CONFIG_SND_RIPTIDE is not set
+# CONFIG_SND_RME32 is not set
+# CONFIG_SND_RME96 is not set
+# CONFIG_SND_RME9652 is not set
+# CONFIG_SND_SOC is not set
+# CONFIG_SND_SONICVIBES is not set
+CONFIG_SND_TIMER=m
+# CONFIG_SND_TRIDENT is not set
+# CONFIG_SND_VIA82XX is not set
+# CONFIG_SND_VIA82XX_MODEM is not set
+# CONFIG_SND_VIRTUOSO is not set
+CONFIG_SND_VMASTER=y
+# CONFIG_SND_VX222 is not set
+# CONFIG_SND_YMFPCI is not set
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_SONY_LAPTOP is not set
+# CONFIG_SP5100_TCO is not set
+CONFIG_SPARSEMEM=y
+CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
+CONFIG_SPARSEMEM_EXTREME=y
+CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SPARSEMEM_VMEMMAP=y
+CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
+CONFIG_SPARSE_IRQ=y
+# CONFIG_SPI_TOPCLIFF_PCH is not set
+# CONFIG_SQUASHFS is not set
+# CONFIG_STUB_POULSBO is not set
+CONFIG_SWIOTLB=y
+CONFIG_SYSVIPC_COMPAT=y
+# CONFIG_TCG_INFINEON is not set
+# CONFIG_TCG_NSC is not set
+CONFIG_TCG_TIS=y
+# CONFIG_TCG_TIS_I2C is not set
+# CONFIG_TELCLOCK is not set
+# CONFIG_THINKPAD_ACPI is not set
+# CONFIG_TIFM_CORE is not set
+# CONFIG_TOPSTAR_LAPTOP is not set
+# CONFIG_TOSHIBA_BT_RFKILL is not set
+# CONFIG_TR is not set
+# CONFIG_TRANSPARENT_HUGEPAGE is not set
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_USB_ARCH_HAS_OHCI=y
+CONFIG_USB_ARCH_HAS_XHCI=y
+CONFIG_USB_HSO=y
+CONFIG_USB_NET_DM9601=m
+CONFIG_USB_NET_NET1080=m
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_HCD_PLATFORM is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_RTL8150 is not set
+CONFIG_USB_STORAGE_REALTEK=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_USB_XHCI_HCD=m
+# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
+CONFIG_USER_STACKTRACE_SUPPORT=y
+# CONFIG_UWB is not set
+# CONFIG_V4L_PCI_DRIVERS is not set
+# CONFIG_VGACON_SOFT_SCROLLBACK is not set
+# CONFIG_VGA_ARB is not set
+CONFIG_VGA_CONSOLE=y
+# CONFIG_VGA_SWITCHEROO is not set
+# CONFIG_VHOST_NET is not set
+# CONFIG_VIA_WDT is not set
+# CONFIG_VIDEO_CX231XX is not set
+# CONFIG_VIDEO_IR_I2C is not set
+# CONFIG_VIDEO_TM6000 is not set
+CONFIG_VIRTIO=m
+CONFIG_VIRTIO_BLK=m
+# CONFIG_VIRTIO_CONSOLE is not set
+CONFIG_VIRTIO_NET=m
+CONFIG_VIRTIO_PCI=m
+CONFIG_VIRTIO_RING=m
+CONFIG_VIRTUALIZATION=y
+# CONFIG_VME_BUS is not set
+# CONFIG_VMWARE_BALLOON is not set
+# CONFIG_VMXNET3 is not set
+# CONFIG_VT6655 is not set
+# CONFIG_W83627HF_WDT is not set
+# CONFIG_W83697HF_WDT is not set
+# CONFIG_W83697UG_WDT is not set
+# CONFIG_W83877F_WDT is not set
+# CONFIG_W83977F_WDT is not set
+# CONFIG_WAFER_WDT is not set
+CONFIG_WATCHDOG=y
+CONFIG_WATCHDOG_CORE=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+# CONFIG_WDTPCI is not set
+CONFIG_X86=y
+# CONFIG_X86_32 is not set
+CONFIG_X86_64=y
+CONFIG_X86_64_SMP=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
+CONFIG_X86_CHECK_BIOS_CORRUPTION=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_CPUID=y
+CONFIG_X86_DEBUGCTLMSR=y
+CONFIG_X86_EXTENDED_PLATFORM=y
+CONFIG_X86_HT=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_IO_APIC=y
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_LOCAL_APIC=y
+CONFIG_X86_MCE=y
+# CONFIG_X86_MCE_AMD is not set
+# CONFIG_X86_MCE_INJECT is not set
+CONFIG_X86_MCE_INTEL=y
+CONFIG_X86_MCE_THRESHOLD=y
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_MPPARSE=y
+CONFIG_X86_MSR=y
+# CONFIG_X86_P4_CLOCKMOD is not set
+CONFIG_X86_PAT=y
+# CONFIG_X86_PCC_CPUFREQ is not set
+CONFIG_X86_PLATFORM_DEVICES=y
+CONFIG_X86_PM_TIMER=y
+# CONFIG_X86_POWERNOW_K8 is not set
+# CONFIG_X86_PTDUMP is not set
+CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
+CONFIG_X86_RESERVE_LOW=64
+# CONFIG_X86_SPEEDSTEP_CENTRINO is not set
+# CONFIG_X86_SPEEDSTEP_LIB is not set
+CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
+CONFIG_X86_THERMAL_VECTOR=y
+CONFIG_X86_TSC=y
+CONFIG_X86_VERBOSE_BOOTUP=y
+# CONFIG_X86_VSMP is not set
+CONFIG_X86_WP_WORKS_OK=y
+# CONFIG_X86_X32 is not set
+CONFIG_X86_XADD=y
+CONFIG_XFRM_USER=y
+# CONFIG_XO15_EBOOK is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+CONFIG_XZ_DEC_X86=y
+# CONFIG_ZD1211RW is not set
+# CONFIG_ZNET is not set
+CONFIG_ZONE_DMA=y
+CONFIG_ZONE_DMA32=y
+CONFIG_ZONE_DMA_FLAG=1
+CONFIG_ZRAM=m
+# CONFIG_ZRAM_DEBUG is not set
+CONFIG_ZSMALLOC=m
diff --git a/chromeos/drivers/Kconfig b/chromeos/drivers/Kconfig
new file mode 100644 (file)
index 0000000..bef6468
--- /dev/null
@@ -0,0 +1,3 @@
+menu "Chromeos Supplied Third-Party Device Drivers"
+
+endmenu
diff --git a/chromeos/drivers/Makefile b/chromeos/drivers/Makefile
new file mode 100644 (file)
index 0000000..3dc43ae
--- /dev/null
@@ -0,0 +1,6 @@
+#
+# Makefile for Chromeos Supplied Third-Party device drivers
+#
+
+# This is a stupid trick to get kbuild to create chromeos/built-in.o
+obj- += foo.o
diff --git a/chromeos/scripts/kernelconfig b/chromeos/scripts/kernelconfig
new file mode 100755 (executable)
index 0000000..c441535
--- /dev/null
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+# Script to merge all configs and run 'make silentoldconfig' on it to wade out bad juju.
+# Then split the configs into distro-commmon and flavour-specific parts
+
+# We have to be in the top level kernel source directory
+if [ ! -f MAINTAINERS ] || [ ! -f Makefile ]; then
+       echo "This does not appear to be the kernel source directory." 1>&2
+       exit 1
+fi
+
+mode=${1:?"Usage: $0 [oldconfig|editconfig]"}
+case "$mode" in
+    oldconfig)  ;; # All is good
+    editconfig) ;; # All is good
+    genconfig)  ;; # All is good
+    *) echo "$0 called with invalid mode" 1>&2
+       exit 1 ;;
+esac
+kerneldir="`pwd`"
+confdir="$kerneldir/chromeos/config"
+archs="x86_64 i386 armel"
+bindir="`pwd`/chromeos/scripts"
+base_conf="$confdir/base.config"
+tmpdir=`mktemp -d`
+
+if [ "$mode" = "genconfig" ]; then
+       keep=1
+       mode="oldconfig"
+       test -d CONFIGS || mkdir CONFIGS
+fi
+
+test -d build || mkdir build
+
+for arch in $archs; do
+       # Map debian archs to kernel archs
+       case "$arch" in
+               amd64)  kernarch="x86_64"       ;;
+               lpia)   kernarch="x86" ;;
+               sparc)  kernarch="sparc64"      ;;
+               armel)  kernarch="arm" ;;
+               *)      kernarch="$arch"        ;;
+       esac
+
+       echo ""
+       echo "***************************************"
+       echo "* Processing $arch ($kernarch) ... "
+       archconfdir=$confdir/$arch
+       flavourconfigs=$(cd $archconfdir && ls *.flavour.config)
+
+       # Merge configs
+       # We merge base.config + common.config + <flavour>.flavour.config
+
+       for config in $flavourconfigs; do
+               fullconf="$tmpdir/$arch-$config-full"
+               cp $base_conf "$fullconf"
+               cat $archconfdir/common.config >> "$fullconf"
+               cat $archconfdir/$config >> "$fullconf"
+       done
+
+       for config in $flavourconfigs; do
+               fullconf="$tmpdir/$arch-$config-full"
+               mv "$fullconf" build/.config
+               # Call oldconfig or menuconfig
+               case "$mode" in
+                   oldconfig)
+                       # Weed out incorrect config parameters
+                       echo "* Run silentoldconfig on $arch/$config ..."
+                       make O=`pwd`/build ARCH=$kernarch silentoldconfig ;;
+                   editconfig)
+                       # Interactively edit config parameters
+                       echo "* $arch/$config: press <Enter> to edit, S to skip"
+                       read -s -n 1
+                       if [ $REPLY = 's' -o $REPLY = 'S' ]; then
+                           echo "* Skip: running silentoldconfig"
+                           make O=`pwd`/build ARCH=$kernarch silentoldconfig
+                       else
+                           echo "* Running menuconfig"
+                           make O=`pwd`/build ARCH=$kernarch menuconfig
+                       fi ;;
+                   *)  # Bad!
+                       exit 1 ;;
+               esac
+               cat build/.config > $archconfdir/$config
+               if [ "$keep" = "1" ]; then
+                       mv build/.config CONFIGS/$arch-$config
+               fi
+       done
+
+       echo "Running splitconfig for $arch"
+       echo
+
+       # Can we make this more robust by avoiding $tmpdir completely?
+       # This approach was used for now because I didn't want to change
+       # splitconfig
+       (cd $archconfdir; rm common.config; $bindir/splitconfig; \
+           mv common.config $tmpdir/$arch.config)
+done
+
+# Now run splitconfig on all the <arch>.common.config copied to
+# $tmpdir
+(cd $tmpdir; $bindir/splitconfig)
+mv $tmpdir/common.config $base_conf
+for arch in $archs; do
+       mv $tmpdir/$arch.config $confdir/$arch/common.config
+done
+
+rm -rf $tmpdir
diff --git a/chromeos/scripts/prepareconfig b/chromeos/scripts/prepareconfig
new file mode 100755 (executable)
index 0000000..3fe15a1
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+family=chromeos
+
+flavourconf=$(find ${family}/config -name $1.flavour.config)
+if [ ! -f "${flavourconf}" ]; then
+    echo "Found no flavour configuration for '$1'." 1>&2
+    exit 1
+fi
+
+outputfile="${2:-.config}"
+
+archconfdir=$(dirname ${flavourconf})
+arch=$(basename ${archconfdir})
+
+# Generate .config
+cat "${family}/config/base.config" \
+    "${archconfdir}/common.config" \
+    "${flavourconf}" > "${outputfile}"
diff --git a/chromeos/scripts/splitconfig b/chromeos/scripts/splitconfig
new file mode 100755 (executable)
index 0000000..98e8efa
--- /dev/null
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+
+import os
+import re
+import sys
+
+allconfigs = {}
+
+# Parse config files
+for config in os.listdir("."):
+    # Only config.*
+    if not config.endswith(".config"):
+        continue
+
+    allconfigs[config] = set()
+
+    for line in open(config):
+        m = re.match("#*\s*CONFIG_(\w+)[\s=](.*)$", line)
+        if not m:
+            continue
+        option, value = m.groups()
+        allconfigs[config].add((option, value))
+
+# Split out common config options
+common = allconfigs.values()[0].copy()
+for config in allconfigs.keys():
+    common &= allconfigs[config]
+for config in allconfigs.keys():
+    allconfigs[config] -= common
+allconfigs["common.config"] = common
+
+# Generate new splitconfigs
+for config in allconfigs.keys():
+    f = open(config, "w")
+    command = os.path.basename(sys.argv[0])
+    print >>f, "#\n# Config options generated by %s\n#" % command
+    for option, value in sorted(list(allconfigs[config])):
+        if value == "is not set":
+            print >>f, "# CONFIG_%s %s" % (option, value)
+        else:
+            print >>f, "CONFIG_%s=%s" % (option, value)
+
+    f.close()
index d236aef..7b5d637 100644 (file)
@@ -140,4 +140,6 @@ source "drivers/virt/Kconfig"
 
 source "drivers/devfreq/Kconfig"
 
+source "chromeos/drivers/Kconfig"
+
 endmenu
index 77cee5a..56f32a6 100644 (file)
@@ -70,6 +70,7 @@ acpi_status acpi_enable(void)
        ACPI_FUNCTION_TRACE(acpi_enable);
 
        /* ACPI tables must be present */
+       pr_info("acpi_enable!\n");
 
        if (!acpi_tb_tables_loaded()) {
                return_ACPI_STATUS(AE_NO_ACPI_TABLES);
@@ -127,6 +128,9 @@ acpi_status acpi_disable(void)
 
        ACPI_FUNCTION_TRACE(acpi_disable);
 
+       pr_info("acpi_disable!\n");
+       dump_stack();
+
        if (acpi_hw_get_mode() == ACPI_SYS_MODE_LEGACY) {
                ACPI_DEBUG_PRINT((ACPI_DB_INIT,
                                  "System is already in legacy (non-ACPI) mode\n"));
index d0b9ed5..0a2e558 100644 (file)
@@ -100,6 +100,8 @@ acpi_status acpi_hw_set_mode(u32 mode)
                                            (u32) acpi_gbl_FADT.acpi_enable, 8);
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "Attempting to enable ACPI mode\n"));
+               pr_info("ACPI mode enable smi_command = 0x%x val = 0x%x\n",
+                       acpi_gbl_FADT.smi_command, acpi_gbl_FADT.acpi_enable);
                break;
 
        case ACPI_SYS_MODE_LEGACY:
@@ -113,6 +115,9 @@ acpi_status acpi_hw_set_mode(u32 mode)
                                            8);
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "Attempting to enable Legacy (non-ACPI) mode\n"));
+               pr_info("ACPI mode disable smi_command = 0x%x val = 0x%x\n",
+                       acpi_gbl_FADT.smi_command, acpi_gbl_FADT.acpi_disable);
+               dump_stack();
                break;
 
        default:
index 7aff631..551a005 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/pci-acpi.h>
 #include <linux/pci-aspm.h>
 #include <linux/acpi.h>
+#include <linux/dmi.h>
 #include <linux/slab.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
@@ -449,6 +450,26 @@ out:
 }
 EXPORT_SYMBOL(acpi_pci_osc_control_set);
 
+const struct dmi_system_id acpi_pci_retain_aspm[] = {
+       {
+               .callback = NULL,
+               .ident = "IEC Mario",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "IEC"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Mario"),
+               },
+       },
+       {
+               .callback = NULL,
+               .ident = "SAMSUNG Alex",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Alex"),
+               },
+       },
+       { }
+};
+
 static int __devinit acpi_pci_root_add(struct acpi_device *device)
 {
        unsigned long long segment, bus;
@@ -601,7 +622,8 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
                                 * We have ASPM control, but the FADT indicates
                                 * that it's unsupported. Clear it.
                                 */
-                               pcie_clear_aspm(root->bus);
+                               if (!dmi_check_system(acpi_pci_retain_aspm))
+                                       pcie_clear_aspm(root->bus);
                        }
                } else {
                        dev_info(root->bus->bridge,
index eb6fd23..4f54f23 100644 (file)
@@ -274,6 +274,7 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
        acpi_status status = AE_OK;
        u32 acpi_state = acpi_target_sleep_state;
        int error;
+       u64 tsc;
 
        ACPI_FLUSH_CPU_CACHE();
 
@@ -287,6 +288,9 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
                error = acpi_suspend_lowlevel();
                if (error)
                        return error;
+               rdtscll(tsc);
+               printk(KERN_INFO "TSC at resume: %llu\n",
+                               (unsigned long long)tsc);
                pr_info(PREFIX "Low-level resume complete\n");
                break;
        }
index 23763a1..efac172 100644 (file)
@@ -3522,12 +3522,6 @@ int sata_link_resume(struct ata_link *link, const unsigned long *params,
                scontrol = (scontrol & 0x0f0) | 0x300;
                if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol)))
                        return rc;
-               /*
-                * Some PHYs react badly if SStatus is pounded
-                * immediately after resuming.  Delay 200ms before
-                * debouncing.
-                */
-               ata_msleep(link->ap, 200);
 
                /* is SControl restored correctly? */
                if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
index ee94686..fab778d 100644 (file)
@@ -588,6 +588,7 @@ source "drivers/s390/char/Kconfig"
 config RAMOOPS
        tristate "Log panic/oops to a RAM buffer"
        depends on HAS_IOMEM
+       depends on PSTORE
        default n
        help
          This enables panic and oops messages to be logged to a circular
index d6e9d08..126a8d9 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/splice.h>
 #include <linux/pfn.h>
 #include <linux/export.h>
+#include <linux/low-mem-notify.h>
 
 #include <asm/uaccess.h>
 #include <asm/io.h>
@@ -867,6 +868,9 @@ static const struct memdev {
 #ifdef CONFIG_CRASH_DUMP
        [12] = { "oldmem", 0, &oldmem_fops, NULL },
 #endif
+#ifdef CONFIG_LOW_MEM_NOTIFY
+       [13] = { "chromeos-low-mem", 0666, &low_mem_notify_fops, NULL },
+#endif
 };
 
 static int memory_open(struct inode *inode, struct file *filp)
index 2a5e45d..14feb04 100644 (file)
@@ -2,6 +2,7 @@
  * RAM Oops/Panic logger
  *
  * Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
+ * Copyright (C) 2011 Kees Cook <keescook@chromium.org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -24,7 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/err.h>
 #include <linux/module.h>
-#include <linux/kmsg_dump.h>
+#include <linux/pstore.h>
 #include <linux/time.h>
 #include <linux/io.h>
 #include <linux/ioport.h>
 #define RAMOOPS_KERNMSG_HDR "===="
 #define MIN_MEM_SIZE 4096UL
 
-static ulong record_size = MIN_MEM_SIZE;
-module_param(record_size, ulong, 0400);
-MODULE_PARM_DESC(record_size,
-               "size of each dump done on oops/panic");
+static int ramoops_pstore_open(struct pstore_info *psi);
+static int ramoops_pstore_close(struct pstore_info *psi);
+static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+                                  struct timespec *time,
+                                  char **buf,
+                                  struct pstore_info *psi);
+static int ramoops_pstore_write(enum pstore_type_id type,
+                               enum kmsg_dump_reason reason, u64 *id,
+                               unsigned int part,
+                               size_t size, struct pstore_info *psi);
+static int ramoops_pstore_erase(enum pstore_type_id type, u64 id,
+                               struct pstore_info *psi);
+
+struct ramoops_context {
+       void *virt_addr;
+       phys_addr_t phys_addr;
+       unsigned long size;
+       size_t record_size;
+       unsigned int count;
+       unsigned int max_count;
+       unsigned int read_count;
+       struct pstore_info pstore;
+};
 
-static ulong mem_address;
-module_param(mem_address, ulong, 0400);
-MODULE_PARM_DESC(mem_address,
-               "start of reserved RAM used to store oops/panic logs");
+static struct ramoops_context oops_cxt = {
+       .pstore = {
+               .owner  = THIS_MODULE,
+               .name   = "ramoops",
+               .open   = ramoops_pstore_open,
+               .close  = ramoops_pstore_close,
+               .read   = ramoops_pstore_read,
+               .write  = ramoops_pstore_write,
+               .erase  = ramoops_pstore_erase,
+       },
+};
 
-static ulong mem_size;
-module_param(mem_size, ulong, 0400);
-MODULE_PARM_DESC(mem_size,
-               "size of reserved RAM used to store oops/panic logs");
+static int ramoops_pstore_open(struct pstore_info *psi)
+{
+       struct ramoops_context *cxt = &oops_cxt;
 
-static int dump_oops = 1;
-module_param(dump_oops, int, 0600);
-MODULE_PARM_DESC(dump_oops,
-               "set to 1 to dump oopses, 0 to only dump panics (default 1)");
+       cxt->read_count = 0;
+       return 0;
+}
 
-static struct ramoops_context {
-       struct kmsg_dumper dump;
-       void *virt_addr;
-       phys_addr_t phys_addr;
-       unsigned long size;
-       unsigned long record_size;
-       int dump_oops;
-       int count;
-       int max_count;
-} oops_cxt;
-
-static struct platform_device *dummy;
-static struct ramoops_platform_data *dummy_data;
-
-static void ramoops_do_dump(struct kmsg_dumper *dumper,
-               enum kmsg_dump_reason reason, const char *s1, unsigned long l1,
-               const char *s2, unsigned long l2)
+static int ramoops_pstore_close(struct pstore_info *psi)
 {
-       struct ramoops_context *cxt = container_of(dumper,
-                       struct ramoops_context, dump);
-       unsigned long s1_start, s2_start;
-       unsigned long l1_cpy, l2_cpy;
-       int res, hdr_size;
-       char *buf, *buf_orig;
+       return 0;
+}
+
+static ssize_t ramoops_pstore_read(u64 *id, enum pstore_type_id *type,
+                                  struct timespec *time,
+                                  char **buf,
+                                  struct pstore_info *psi)
+{
+       ssize_t size;
+       char *rambuf;
+       struct ramoops_context *cxt = &oops_cxt;
+
+       if (cxt->read_count >= cxt->max_count)
+               return -EINVAL;
+       *id = cxt->read_count++;
+       /* Only supports dmesg output so far. */
+       *type = PSTORE_TYPE_DMESG;
+       /* TODO(kees): Bogus time for the moment. */
+       time->tv_sec = 0;
+       time->tv_nsec = 0;
+
+       rambuf = cxt->virt_addr + (*id * cxt->record_size);
+       size = strnlen(rambuf, cxt->record_size);
+       *buf = kmalloc(size, GFP_KERNEL);
+       if (*buf == NULL)
+               return -ENOMEM;
+       memcpy(*buf, rambuf, size);
+
+       return size;
+}
+
+static int ramoops_pstore_write(enum pstore_type_id type,
+                               enum kmsg_dump_reason reason,
+                               u64 *id,
+                               unsigned int part,
+                               size_t size, struct pstore_info *psi)
+{
+       char *buf;
+       size_t res;
        struct timeval timestamp;
+       struct ramoops_context *cxt = &oops_cxt;
+       size_t available = cxt->record_size;
+
+       /* Only store dmesg dumps. */
+       if (type != PSTORE_TYPE_DMESG)
+               return -EINVAL;
 
+       /* Only store crash dumps. */
        if (reason != KMSG_DUMP_OOPS &&
            reason != KMSG_DUMP_PANIC)
-               return;
+               return -EINVAL;
 
-       /* Only dump oopses if dump_oops is set */
-       if (reason == KMSG_DUMP_OOPS && !cxt->dump_oops)
-               return;
+       /* Explicitly only take the first part of any new crash.
+        * If our buffer is larger than kmsg_bytes, this can never happen,
+        * and if our buffer is smaller than kmsg_bytes, we don't want the
+        * report split across multiple records. */
+       if (part != 1)
+               return -ENOSPC;
 
        buf = cxt->virt_addr + (cxt->count * cxt->record_size);
-       buf_orig = buf;
 
-       memset(buf, '\0', cxt->record_size);
        res = sprintf(buf, "%s", RAMOOPS_KERNMSG_HDR);
        buf += res;
+       available -= res;
+
        do_gettimeofday(&timestamp);
        res = sprintf(buf, "%lu.%lu\n", (long)timestamp.tv_sec, (long)timestamp.tv_usec);
        buf += res;
+       available -= res;
 
-       hdr_size = buf - buf_orig;
-       l2_cpy = min(l2, cxt->record_size - hdr_size);
-       l1_cpy = min(l1, cxt->record_size - hdr_size - l2_cpy);
+       if (size > available)
+               size = available;
 
-       s2_start = l2 - l2_cpy;
-       s1_start = l1 - l1_cpy;
-
-       memcpy(buf, s1 + s1_start, l1_cpy);
-       memcpy(buf + l1_cpy, s2 + s2_start, l2_cpy);
+       memcpy(buf, cxt->pstore.buf, size);
+       memset(buf + size, '\0', available - size);
 
        cxt->count = (cxt->count + 1) % cxt->max_count;
+
+       return 0;
+}
+
+static int ramoops_pstore_erase(enum pstore_type_id type, u64 id,
+                               struct pstore_info *psi)
+{
+       char *buf;
+       struct ramoops_context *cxt = &oops_cxt;
+
+       if (id >= cxt->max_count)
+               return -EINVAL;
+
+       buf = cxt->virt_addr + (id * cxt->record_size);
+       memset(buf, '\0', cxt->record_size);
+
+       return 0;
 }
 
 static int __init ramoops_probe(struct platform_device *pdev)
@@ -118,6 +184,12 @@ static int __init ramoops_probe(struct platform_device *pdev)
        struct ramoops_context *cxt = &oops_cxt;
        int err = -EINVAL;
 
+       /* Only a single ramoops area allowed at a time, so fail extra
+        * probes.
+        */
+       if (cxt->max_count)
+               goto fail3;
+
        if (!pdata->mem_size || !pdata->record_size) {
                pr_err("The memory size and the record size must be "
                        "non-zero\n");
@@ -145,7 +217,14 @@ static int __init ramoops_probe(struct platform_device *pdev)
        cxt->size = pdata->mem_size;
        cxt->phys_addr = pdata->mem_address;
        cxt->record_size = pdata->record_size;
-       cxt->dump_oops = pdata->dump_oops;
+
+       cxt->pstore.bufsize = cxt->record_size;
+       cxt->pstore.buf = kmalloc(cxt->pstore.bufsize, GFP_KERNEL);
+       spin_lock_init(&cxt->pstore.buf_lock);
+       if (!cxt->pstore.buf) {
+               pr_err("cannot allocate pstore buffer\n");
+               goto fail4;
+       }
 
        if (!request_mem_region(cxt->phys_addr, cxt->size, "ramoops")) {
                pr_err("request mem region failed\n");
@@ -159,29 +238,23 @@ static int __init ramoops_probe(struct platform_device *pdev)
                goto fail2;
        }
 
-       cxt->dump.dump = ramoops_do_dump;
-       err = kmsg_dump_register(&cxt->dump);
+       err = pstore_register(&cxt->pstore);
        if (err) {
-               pr_err("registering kmsg dumper failed\n");
+               pr_err("registering with pstore failed\n");
                goto fail1;
        }
 
-       /*
-        * Update the module parameter variables as well so they are visible
-        * through /sys/module/ramoops/parameters/
-        */
-       mem_size = pdata->mem_size;
-       mem_address = pdata->mem_address;
-       record_size = pdata->record_size;
-       dump_oops = pdata->dump_oops;
-
        return 0;
 
 fail1:
        iounmap(cxt->virt_addr);
 fail2:
        release_mem_region(cxt->phys_addr, cxt->size);
+       cxt->max_count = 0;
 fail3:
+       kfree(cxt->pstore.buf);
+fail4:
+       cxt->pstore.bufsize = 0;
        return err;
 }
 
@@ -189,11 +262,20 @@ static int __exit ramoops_remove(struct platform_device *pdev)
 {
        struct ramoops_context *cxt = &oops_cxt;
 
-       if (kmsg_dump_unregister(&cxt->dump) < 0)
-               pr_warn("could not unregister kmsg_dumper\n");
+       /* TODO(kees): It shouldn't be possible to remove ramoops since
+        * pstore doesn't support unregistering yet. When it does, remove
+        * this early return and add the unregister where noted below.
+        */
+       return -EBUSY;
 
        iounmap(cxt->virt_addr);
        release_mem_region(cxt->phys_addr, cxt->size);
+       cxt->max_count = 0;
+
+       /* TODO(kees): When pstore supports unregistering, call it here. */
+       kfree(cxt->pstore.buf);
+       cxt->pstore.bufsize = 0;
+
        return 0;
 }
 
@@ -207,39 +289,12 @@ static struct platform_driver ramoops_driver = {
 
 static int __init ramoops_init(void)
 {
-       int ret;
-       ret = platform_driver_probe(&ramoops_driver, ramoops_probe);
-       if (ret == -ENODEV) {
-               /*
-                * If we didn't find a platform device, we use module parameters
-                * building platform data on the fly.
-                */
-               pr_info("platform device not found, using module parameters\n");
-               dummy_data = kzalloc(sizeof(struct ramoops_platform_data),
-                                    GFP_KERNEL);
-               if (!dummy_data)
-                       return -ENOMEM;
-               dummy_data->mem_size = mem_size;
-               dummy_data->mem_address = mem_address;
-               dummy_data->record_size = record_size;
-               dummy_data->dump_oops = dump_oops;
-               dummy = platform_create_bundle(&ramoops_driver, ramoops_probe,
-                       NULL, 0, dummy_data,
-                       sizeof(struct ramoops_platform_data));
-
-               if (IS_ERR(dummy))
-                       ret = PTR_ERR(dummy);
-               else
-                       ret = 0;
-       }
-
-       return ret;
+       return platform_driver_probe(&ramoops_driver, ramoops_probe);
 }
 
 static void __exit ramoops_exit(void)
 {
        platform_driver_unregister(&ramoops_driver);
-       kfree(dummy_data);
 }
 
 module_init(ramoops_init);
index a048199..e594d48 100644 (file)
@@ -33,6 +33,17 @@ config TCG_TIS
          from within Linux.  To compile this driver as a module, choose
          M here; the module will be called tpm_tis.
 
+config TCG_TIS_I2C
+       tristate "TPM Interface Specification 1.2 Interface (I2C)"
+       depends on I2C
+       ---help---
+         If you have a TPM security chip that is compliant with the
+         TCG TIS 1.2 TPM specification and Infineon's I2C Protocol Stack
+         Specification 0.20 say Yes and it will be accessible from within
+         Linux.
+         To compile this driver as a module, choose M here; the module
+         will be called tpm_tis_i2c.
+
 config TCG_NSC
        tristate "National Semiconductor TPM Interface"
        depends on X86
index ea3a1e0..b6e051a 100644 (file)
@@ -6,6 +6,7 @@ ifdef CONFIG_ACPI
        obj-$(CONFIG_TCG_TPM) += tpm_bios.o
 endif
 obj-$(CONFIG_TCG_TIS) += tpm_tis.o
+obj-$(CONFIG_TCG_TIS_I2C) += tpm_tis_i2c.o
 obj-$(CONFIG_TCG_NSC) += tpm_nsc.o
 obj-$(CONFIG_TCG_ATMEL) += tpm_atmel.o
 obj-$(CONFIG_TCG_INFINEON) += tpm_infineon.o
index ad7c732..60add08 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <linux/poll.h>
 #include <linux/slab.h>
+#include <linux/jiffies.h>
 #include <linux/mutex.h>
 #include <linux/spinlock.h>
 #include <linux/freezer.h>
@@ -348,31 +349,32 @@ static void timeout_work(struct work_struct *work)
        mutex_unlock(&chip->buffer_mutex);
 }
 
-/*
- * Returns max number of jiffies to wait
- */
-unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
-                                          u32 ordinal)
+static void set_needs_resume(struct tpm_chip *chip)
 {
-       int duration_idx = TPM_UNDEFINED;
-       int duration = 0;
+       mutex_lock(&chip->resume_mutex);
+       chip->resume_time = jiffies;
+       chip->needs_resume = 1;
+       mutex_unlock(&chip->resume_mutex);
+}
 
-       if (ordinal < TPM_MAX_ORDINAL)
-               duration_idx = tpm_ordinal_duration[ordinal];
-       else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) <
-                TPM_MAX_PROTECTED_ORDINAL)
-               duration_idx =
-                   tpm_protected_ordinal_duration[ordinal &
-                                                  TPM_PROTECTED_ORDINAL_MASK];
+#define TPM_ORD_CONTINUE_SELFTEST 83
+#define CONTINUE_SELFTEST_RESULT_SIZE 10
 
-       if (duration_idx != TPM_UNDEFINED)
-               duration = chip->vendor.duration[duration_idx];
-       if (duration <= 0)
-               return 2 * 60 * HZ;
-       else
-               return duration;
-}
-EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
+#define TPM_INTERNAL_RESULT_SIZE 200
+#define TPM_TAG_RQU_COMMAND cpu_to_be16(193)
+#define TPM_ORD_GET_CAP cpu_to_be32(101)
+
+static const struct tpm_input_header tpm_getcap_header = {
+       .tag = TPM_TAG_RQU_COMMAND,
+       .length = cpu_to_be32(22),
+       .ordinal = TPM_ORD_GET_CAP
+};
+
+static struct tpm_input_header continue_selftest_header = {
+       .tag = TPM_TAG_RQU_COMMAND,
+       .length = cpu_to_be32(10),
+       .ordinal = cpu_to_be32(TPM_ORD_CONTINUE_SELFTEST),
+};
 
 /*
  * Internal kernel interface to transmit TPM commands
@@ -440,32 +442,54 @@ out:
        return rc;
 }
 
-#define TPM_DIGEST_SIZE 20
-#define TPM_RET_CODE_IDX 6
-
-enum tpm_capabilities {
-       TPM_CAP_FLAG = cpu_to_be32(4),
-       TPM_CAP_PROP = cpu_to_be32(5),
-       CAP_VERSION_1_1 = cpu_to_be32(0x06),
-       CAP_VERSION_1_2 = cpu_to_be32(0x1A)
-};
-
-enum tpm_sub_capabilities {
-       TPM_CAP_PROP_PCR = cpu_to_be32(0x101),
-       TPM_CAP_PROP_MANUFACTURER = cpu_to_be32(0x103),
-       TPM_CAP_FLAG_PERM = cpu_to_be32(0x108),
-       TPM_CAP_FLAG_VOL = cpu_to_be32(0x109),
-       TPM_CAP_PROP_OWNER = cpu_to_be32(0x111),
-       TPM_CAP_PROP_TIS_TIMEOUT = cpu_to_be32(0x115),
-       TPM_CAP_PROP_TIS_DURATION = cpu_to_be32(0x120),
+void tpm_continue_selftest_nocheck(struct tpm_chip *chip)
+{
+       struct tpm_cmd_t cmd;
+       cmd.header.in = continue_selftest_header;
+       tpm_transmit(chip, (u8 *) &cmd, CONTINUE_SELFTEST_RESULT_SIZE);
+}
 
-};
+/* The maximum time in milliseconds that the TPM self test will take to
+ * complete.  TODO(semenzato): 1s should be plenty for all TPMs, but how can we
+ * ensure it?
+ */
+#define TPM_SELF_TEST_DURATION_MSEC 1000
+
+/* We don't want to wait for the self test to complete at resume, because it
+ * impacts the resume speed.  TPM commands are infrequent so the wait is
+ * usually not needed and is wasteful.  Instead, before we send any command, we
+ * check that enough time has elapsed from the resume so that we are
+ * comfortable that the self test has completed.  If not, we wait.  Unlike at
+ * boot, here we don't check the return code of continue_self_test, so we can
+ * use a code path which avoids recursion.  Furthermore, this only works when
+ * ContinueSelfTest is blocking, that is it returns only after the self test
+ * has completed, which is the case for the Infineon TPM.
+ */
+static void resume_if_needed(struct tpm_chip *chip)
+{
+       mutex_lock(&chip->resume_mutex);
+       if (chip->needs_resume) {
+               /* If it's been TPM_SELF_TEST_DURATION_MSEC msec since resume,
+                * then selftest has completed and we don't need to wait.
+                */
+               if (jiffies - chip->resume_time <
+                   msecs_to_jiffies(TPM_SELF_TEST_DURATION_MSEC)) {
+                       dev_info(chip->dev, "waiting for TPM self test");
+                       tpm_continue_selftest_nocheck(chip);
+               }
+               chip->needs_resume = 0;
+               dev_info(chip->dev, "TPM delayed resume completed");
+       }
+       mutex_unlock(&chip->resume_mutex);
+}
 
 static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
                            int len, const char *desc)
 {
        int err;
 
+       resume_if_needed(chip);
+
        len = tpm_transmit(chip,(u8 *) cmd, len);
        if (len <  0)
                return len;
@@ -479,14 +503,70 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
        return err;
 }
 
-#define TPM_INTERNAL_RESULT_SIZE 200
-#define TPM_TAG_RQU_COMMAND cpu_to_be16(193)
-#define TPM_ORD_GET_CAP cpu_to_be32(101)
+/**
+ * tpm_continue_selftest -- run TPM's selftest
+ * @chip: TPM chip to use
+ *
+ * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
+ * a TPM error code.
+ */
+int tpm_continue_selftest(struct tpm_chip *chip)
+{
+       int rc;
+       struct tpm_cmd_t cmd;
+
+       cmd.header.in = continue_selftest_header;
+       rc = transmit_cmd(chip, (const u8 *) &cmd,
+                         CONTINUE_SELFTEST_RESULT_SIZE, "continue selftest");
+       return rc;
+}
+EXPORT_SYMBOL_GPL(tpm_continue_selftest);
+
+/*
+ * Returns max number of jiffies to wait
+ */
+unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip,
+                                          u32 ordinal)
+{
+       int duration_idx = TPM_UNDEFINED;
+       int duration = 0;
+
+       if (ordinal < TPM_MAX_ORDINAL)
+               duration_idx = tpm_ordinal_duration[ordinal];
+       else if ((ordinal & TPM_PROTECTED_ORDINAL_MASK) <
+                TPM_MAX_PROTECTED_ORDINAL)
+               duration_idx =
+                   tpm_protected_ordinal_duration[ordinal &
+                                                  TPM_PROTECTED_ORDINAL_MASK];
+
+       if (duration_idx != TPM_UNDEFINED)
+               duration = chip->vendor.duration[duration_idx];
+       if (duration <= 0)
+               return 2 * 60 * HZ;
+       else
+               return duration;
+}
+EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration);
+
+#define TPM_DIGEST_SIZE 20
+#define TPM_RET_CODE_IDX 6
+
+enum tpm_capabilities {
+       TPM_CAP_FLAG = cpu_to_be32(4),
+       TPM_CAP_PROP = cpu_to_be32(5),
+       CAP_VERSION_1_1 = cpu_to_be32(0x06),
+       CAP_VERSION_1_2 = cpu_to_be32(0x1A)
+};
+
+enum tpm_sub_capabilities {
+       TPM_CAP_PROP_PCR = cpu_to_be32(0x101),
+       TPM_CAP_PROP_MANUFACTURER = cpu_to_be32(0x103),
+       TPM_CAP_FLAG_PERM = cpu_to_be32(0x108),
+       TPM_CAP_FLAG_VOL = cpu_to_be32(0x109),
+       TPM_CAP_PROP_OWNER = cpu_to_be32(0x111),
+       TPM_CAP_PROP_TIS_TIMEOUT = cpu_to_be32(0x115),
+       TPM_CAP_PROP_TIS_DURATION = cpu_to_be32(0x120),
 
-static const struct tpm_input_header tpm_getcap_header = {
-       .tag = TPM_TAG_RQU_COMMAND,
-       .length = cpu_to_be32(22),
-       .ordinal = TPM_ORD_GET_CAP
 };
 
 ssize_t tpm_getcap(struct device *dev, __be32 subcap_id, cap_t *cap,
@@ -616,33 +696,6 @@ duration:
 }
 EXPORT_SYMBOL_GPL(tpm_get_timeouts);
 
-#define TPM_ORD_CONTINUE_SELFTEST 83
-#define CONTINUE_SELFTEST_RESULT_SIZE 10
-
-static struct tpm_input_header continue_selftest_header = {
-       .tag = TPM_TAG_RQU_COMMAND,
-       .length = cpu_to_be32(10),
-       .ordinal = cpu_to_be32(TPM_ORD_CONTINUE_SELFTEST),
-};
-
-/**
- * tpm_continue_selftest -- run TPM's selftest
- * @chip: TPM chip to use
- *
- * Returns 0 on success, < 0 in case of fatal error or a value > 0 representing
- * a TPM error code.
- */
-static int tpm_continue_selftest(struct tpm_chip *chip)
-{
-       int rc;
-       struct tpm_cmd_t cmd;
-
-       cmd.header.in = continue_selftest_header;
-       rc = transmit_cmd(chip, &cmd, CONTINUE_SELFTEST_RESULT_SIZE,
-                         "continue selftest");
-       return rc;
-}
-
 ssize_t tpm_show_enabled(struct device * dev, struct device_attribute * attr,
                        char *buf)
 {
@@ -990,7 +1043,7 @@ ssize_t tpm_show_caps(struct device *dev, struct device_attribute *attr,
                       be32_to_cpu(cap.manufacturer_id));
 
        rc = tpm_getcap(dev, CAP_VERSION_1_1, &cap,
-                       "attempting to determine the 1.1 version");
+                       "attempting to determine the 1.1 version");
        if (rc)
                return 0;
        str += sprintf(str,
@@ -1185,6 +1238,8 @@ ssize_t tpm_write(struct file *file, const char __user *buf,
        while (atomic_read(&chip->data_pending) != 0)
                msleep(TPM_TIMEOUT);
 
+       resume_if_needed(chip);
+
        mutex_lock(&chip->buffer_mutex);
 
        if (in_size > TPM_BUFSIZE)
@@ -1219,6 +1274,7 @@ ssize_t tpm_read(struct file *file, char __user *buf,
        del_singleshot_timer_sync(&chip->user_read_timer);
        flush_work_sync(&chip->work);
        ret_size = atomic_read(&chip->data_pending);
+       /* TODO(wad): atomic_set should come AFTER the buffer is copied. */
        atomic_set(&chip->data_pending, 0);
        if (ret_size > 0) {     /* relay data */
                ssize_t orig_ret_size = ret_size;
@@ -1314,6 +1370,7 @@ int tpm_pm_resume(struct device *dev)
        if (chip == NULL)
                return -ENODEV;
 
+       set_needs_resume(chip);
        return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_pm_resume);
@@ -1370,6 +1427,7 @@ struct tpm_chip *tpm_register_hardware(struct device *dev,
 
        mutex_init(&chip->buffer_mutex);
        mutex_init(&chip->tpm_mutex);
+       mutex_init(&chip->resume_mutex);
        INIT_LIST_HEAD(&chip->list);
 
        INIT_WORK(&chip->work, timeout_work);
index b1c5280..a6718a1 100644 (file)
@@ -113,6 +113,10 @@ struct tpm_chip {
        atomic_t data_pending;
        struct mutex buffer_mutex;
 
+       int needs_resume;
+       unsigned long resume_time;
+       struct mutex resume_mutex;
+
        struct timer_list user_read_timer;      /* user needs to claim result */
        struct work_struct work;
        struct mutex tpm_mutex; /* tpm is processing */
index d2a70ca..d8a3ca3 100644 (file)
@@ -584,12 +584,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
                goto out_err;
        }
 
-       if (tpm_do_selftest(chip)) {
-               dev_err(dev, "TPM self test failed\n");
-               rc = -ENODEV;
-               goto out_err;
-       }
-
        /* INTERRUPT Setup */
        init_waitqueue_head(&chip->vendor.read_queue);
        init_waitqueue_head(&chip->vendor.int_queue);
diff --git a/drivers/char/tpm/tpm_tis_i2c.c b/drivers/char/tpm/tpm_tis_i2c.c
new file mode 100644 (file)
index 0000000..b5d3d27
--- /dev/null
@@ -0,0 +1,752 @@
+/*
+ * Copyright (C) 2011 Infineon Technologies
+ *
+ * Authors:
+ * Peter Huewe <huewe.external@infineon.com>
+ *
+ * Device driver for TCG/TCPA TPM (trusted platform module).
+ * Specifications at www.trustedcomputinggroup.org
+ *
+ * This device driver implements the TPM interface as defined in
+ * the TCG TPM Interface Spec version 1.2, revision 1.0 and the
+ * Infineon I2C Protocol Stack Specification v0.20.
+ *
+ * It is based on the original tpm_tis device driver from Leendert van
+ * Dorn and Kyleen Hall.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * NOTE:
+ * Suspend does currently not work Nvidias Tegra2 Platform
+ * but works fine on Beagleboard (ARM OMAP).
+ *
+ */
+#include <linux/init.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <linux/wait.h>
+#include "tpm.h"
+
+/* max. buffer size supported by our tpm */
+#define TPM_BUFSIZE 1260
+
+/* max. number of iterations after i2c NAK */
+#define MAX_COUNT 3
+
+#define SLEEP_DURATION_LOW 55
+#define SLEEP_DURATION_HI 65
+
+/* max. number of iterations after i2c NAK for 'long' commands
+ * we need this especially for sending TPM_READY, since the cleanup after the
+ * transtion to the ready state may take some time, but it is unpredictable
+ * how long it will take.
+ */
+#define MAX_COUNT_LONG 50
+
+#define SLEEP_DURATION_LONG_LOW 200
+#define SLEEP_DURATION_LONG_HI 220
+
+/* expected value for DIDVID register */
+#define TPM_TIS_I2C_DID_VID 0x000b15d1L
+
+/* Structure to store I2C TPM specific stuff */
+struct tpm_inf_dev {
+       struct i2c_client *client;
+       u8 buf[TPM_BUFSIZE+sizeof(u8)]; /* max. buffer size + addr */
+       struct tpm_chip *chip;
+};
+
+static struct tpm_inf_dev tpm_dev;
+
+
+/*
+ * Copy i2c-core:i2c_transfer() as close as possible without the adapter locks
+ * and algorithm check.  These are done by the caller for atomicity.
+ */
+static int i2c_transfer_nolock(struct i2c_adapter *adap, struct i2c_msg *msgs,
+                              int num)
+{
+       unsigned long orig_jiffies;
+       int ret, try;
+
+       /* Retry automatically on arbitration loss */
+       orig_jiffies = jiffies;
+       for (ret = 0, try = 0; try <= adap->retries; try++) {
+               ret = adap->algo->master_xfer(adap, msgs, num);
+               if (ret != -EAGAIN)
+                       break;
+               if (time_after(jiffies, orig_jiffies + adap->timeout))
+                       break;
+       }
+       return ret;
+}
+
+/*
+ * iic_tpm_read() - read from TPM register
+ * @addr: register address to read from
+ * @buffer: provided by caller
+ * @len: number of bytes to read
+ *
+ * Read len bytes from TPM register and put them into
+ * buffer (little-endian format, i.e. first byte is put into buffer[0]).
+ *
+ * NOTE: TPM is big-endian for multi-byte values. Multi-byte
+ * values have to be swapped.
+ *
+ * Return -EIO on error, 0 on success.
+ */
+static int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
+{
+
+       struct i2c_msg msg1 = { tpm_dev.client->addr, 0, 1, &addr };
+       struct i2c_msg msg2 = { tpm_dev.client->addr, I2C_M_RD, len, buffer };
+
+       int rc;
+       int count;
+
+       /* Lock the adapter for the duration of the whole sequence. */
+       if (!tpm_dev.client->adapter->algo->master_xfer)
+               return -EOPNOTSUPP;
+       i2c_lock_adapter(tpm_dev.client->adapter);
+
+       for (count = 0; count < MAX_COUNT; count++) {
+               rc = i2c_transfer_nolock(tpm_dev.client->adapter, &msg1, 1);
+               if (rc > 0)
+                       break; /* break here to skip sleep */
+
+               usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
+       }
+
+       if (rc <= 0)
+               goto out;
+
+       /* After the TPM has successfully received the register address it needs
+        * some time, thus we're sleeping here again, before retrieving the data
+        */
+       for (count = 0; count < MAX_COUNT; count++) {
+               usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
+               rc = i2c_transfer_nolock(tpm_dev.client->adapter, &msg2, 1);
+               if (rc > 0)
+                       break;
+
+       }
+
+out:
+       i2c_unlock_adapter(tpm_dev.client->adapter);
+       if (rc <= 0)
+               return -EIO;
+
+       return 0;
+}
+
+static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
+                               unsigned int sleep_low,
+                               unsigned int sleep_hi,
+                               u8 max_count)
+{
+       int rc = -1;
+       int count;
+
+       struct i2c_msg msg1 = { tpm_dev.client->addr, 0, len + 1, tpm_dev.buf };
+
+       if (!tpm_dev.client->adapter->algo->master_xfer)
+               return -EOPNOTSUPP;
+       i2c_lock_adapter(tpm_dev.client->adapter);
+
+       tpm_dev.buf[0] = addr;
+       memcpy(&(tpm_dev.buf[1]), buffer, len);
+
+       for (count = 0; count < max_count; count++) {
+               rc = i2c_transfer_nolock(tpm_dev.client->adapter, &msg1, 1);
+               if (rc > 0)
+                       break;
+
+               usleep_range(sleep_low, sleep_hi);
+       }
+
+       i2c_unlock_adapter(tpm_dev.client->adapter);
+       if (rc <= 0)
+               return -EIO;
+
+       return 0;
+}
+
+/*
+ * iic_tpm_write() - write to TPM register
+ * @addr: register address to write to
+ * @buffer: containing data to be written
+ * @len: number of bytes to write
+ *
+ * Write len bytes from provided buffer to TPM register (little
+ * endian format, i.e. buffer[0] is written as first byte).
+ *
+ * NOTE: TPM is big-endian for multi-byte values. Multi-byte
+ * values have to be swapped.
+ *
+ * NOTE: use this function instead of the iic_tpm_write_generic function.
+ *
+ * Return -EIO on error, 0 on success
+ */
+static int iic_tpm_write(u8 addr, u8 *buffer, size_t len)
+{
+       return iic_tpm_write_generic(addr, buffer, len, SLEEP_DURATION_LOW,
+                       SLEEP_DURATION_HI, MAX_COUNT);
+}
+
+/*
+ * This function is needed especially for the cleanup situation after
+ * sending TPM_READY
+ * */
+static int iic_tpm_write_long(u8 addr, u8 *buffer, size_t len)
+{
+       return iic_tpm_write_generic(addr, buffer, len, SLEEP_DURATION_LONG_LOW,
+                       SLEEP_DURATION_LONG_HI, MAX_COUNT_LONG);
+}
+
+#define TPM_HEADER_SIZE 10
+
+enum tis_access {
+       TPM_ACCESS_VALID = 0x80,
+       TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
+       TPM_ACCESS_REQUEST_PENDING = 0x04,
+       TPM_ACCESS_REQUEST_USE = 0x02,
+};
+
+enum tis_status {
+       TPM_STS_VALID = 0x80,
+       TPM_STS_COMMAND_READY = 0x40,
+       TPM_STS_GO = 0x20,
+       TPM_STS_DATA_AVAIL = 0x10,
+       TPM_STS_DATA_EXPECT = 0x08,
+};
+
+enum tis_defaults {
+       TIS_SHORT_TIMEOUT = 750,        /* ms */
+       TIS_LONG_TIMEOUT = 2000,        /* 2 sec */
+};
+
+#define        TPM_ACCESS(l)                   (0x0000 | ((l) << 4))
+#define        TPM_STS(l)                      (0x0001 | ((l) << 4))
+#define        TPM_DATA_FIFO(l)                (0x0005 | ((l) << 4))
+#define        TPM_DID_VID(l)                  (0x0006 | ((l) << 4))
+
+static int check_locality(struct tpm_chip *chip, int loc)
+{
+       u8 buf;
+       int rc;
+
+       rc = iic_tpm_read(TPM_ACCESS(loc), &buf, 1);
+       if (rc < 0)
+               return rc;
+
+       if ((buf & (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
+               (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) {
+               chip->vendor.locality = loc;
+               return loc;
+       }
+
+       return -1;
+}
+
+static void release_locality(struct tpm_chip *chip, int loc, int force)
+{
+       u8 buf;
+       if (iic_tpm_read(TPM_ACCESS(loc), &buf, 1) < 0)
+               return;
+
+       if (force || (buf & (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) ==
+                       (TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) {
+               buf = TPM_ACCESS_ACTIVE_LOCALITY;
+               iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
+       }
+}
+
+static int request_locality(struct tpm_chip *chip, int loc)
+{
+       unsigned long stop;
+       u8 buf = TPM_ACCESS_REQUEST_USE;
+
+       if (check_locality(chip, loc) >= 0)
+               return loc;
+
+       iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
+
+       /* wait for burstcount */
+       stop = jiffies + chip->vendor.timeout_a;
+       do {
+               if (check_locality(chip, loc) >= 0)
+                       return loc;
+               msleep(TPM_TIMEOUT);
+       } while (time_before(jiffies, stop));
+
+       return -1;
+}
+
+static u8 tpm_tis_i2c_status(struct tpm_chip *chip)
+{
+       /* NOTE: since i2c read may fail, return 0 in this case --> time-out */
+       u8 buf;
+       if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
+               return 0;
+       else
+               return buf;
+}
+
+static void tpm_tis_i2c_ready(struct tpm_chip *chip)
+{
+       /* this causes the current command to be aborted */
+       u8 buf = TPM_STS_COMMAND_READY;
+       iic_tpm_write_long(TPM_STS(chip->vendor.locality), &buf, 1);
+}
+
+static ssize_t get_burstcount(struct tpm_chip *chip)
+{
+       unsigned long stop;
+       ssize_t burstcnt;
+       u8 buf[3];
+
+       /* wait for burstcount */
+       /* which timeout value, spec has 2 answers (c & d) */
+       stop = jiffies + chip->vendor.timeout_d;
+       do {
+               /* Note: STS is little endian */
+               if (iic_tpm_read(TPM_STS(chip->vendor.locality) + 1, buf, 3) < 0)
+                       burstcnt = 0;
+               else
+                       burstcnt = (buf[2] << 16) + (buf[1] << 8) + buf[0];
+
+               if (burstcnt)
+                       return burstcnt;
+
+               msleep(TPM_TIMEOUT);
+       } while (time_before(jiffies, stop));
+       return -EBUSY;
+}
+
+static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
+                       int *status)
+{
+       unsigned long stop;
+
+       /* check current status */
+       *status = tpm_tis_i2c_status(chip);
+       if ((*status & mask) == mask)
+               return 0;
+
+       stop = jiffies + timeout;
+       do {
+               msleep(TPM_TIMEOUT);
+               *status = tpm_tis_i2c_status(chip);
+               if ((*status & mask) == mask)
+                       return 0;
+
+       } while (time_before(jiffies, stop));
+
+       return -ETIME;
+}
+
+static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
+{
+       size_t size = 0;
+       ssize_t burstcnt;
+       int rc;
+
+       while (size < count) {
+               burstcnt = get_burstcount(chip);
+
+               /* burstcnt < 0 = tpm is busy */
+               if (burstcnt < 0)
+                       return burstcnt;
+
+               /* limit received data to max. left */
+               if (burstcnt > (count-size))
+                       burstcnt = count-size;
+
+               rc = iic_tpm_read(TPM_DATA_FIFO(chip->vendor.locality),
+                                 &(buf[size]),
+                                 burstcnt);
+               if (rc == 0)
+                       size += burstcnt;
+
+       }
+       return size;
+}
+
+static int tpm_tis_i2c_recv(struct tpm_chip *chip, u8 *buf, size_t count)
+{
+       int size = 0;
+       int expected, status;
+
+       if (count < TPM_HEADER_SIZE) {
+               size = -EIO;
+               goto out;
+       }
+
+       /* read first 10 bytes, including tag, paramsize, and result */
+       size = recv_data(chip, buf, TPM_HEADER_SIZE);
+       if (size < TPM_HEADER_SIZE) {
+               dev_err(chip->dev, "Unable to read header\n");
+               goto out;
+       }
+
+       expected = be32_to_cpu(*(__be32 *) (buf + 2));
+       if ((size_t)expected > count) {
+               size = -EIO;
+               goto out;
+       }
+
+       size += recv_data(chip, &buf[TPM_HEADER_SIZE],
+                               expected - TPM_HEADER_SIZE);
+       if (size < expected) {
+               dev_err(chip->dev, "Unable to read remainder of result\n");
+               size = -ETIME;
+               goto out;
+       }
+
+       wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, &status);
+       if (status & TPM_STS_DATA_AVAIL) {      /* retry? */
+               dev_err(chip->dev, "Error left over data\n");
+               size = -EIO;
+               goto out;
+       }
+
+out:
+       tpm_tis_i2c_ready(chip);
+       /* The TPM needs some time to clean up here,
+        * so we sleep rather than keeping the bus busy
+        */
+       usleep_range(2400, 2600);
+       release_locality(chip, chip->vendor.locality, 0);
+       return size;
+}
+
+static int tpm_tis_i2c_send(struct tpm_chip *chip, u8 *buf, size_t len)
+{
+       int rc, status;
+       ssize_t burstcnt;
+       size_t count = 0;
+       u8 sts = TPM_STS_GO;
+
+       if (len > TPM_BUFSIZE)
+               return -E2BIG; /* command is too long for our tpm, sorry */
+
+       if (request_locality(chip, 0) < 0)
+               return -EBUSY;
+
+       status = tpm_tis_i2c_status(chip);
+       if ((status & TPM_STS_COMMAND_READY) == 0) {
+               tpm_tis_i2c_ready(chip);
+               if (wait_for_stat
+                   (chip, TPM_STS_COMMAND_READY,
+                    chip->vendor.timeout_b, &status) < 0) {
+                       rc = -ETIME;
+                       goto out_err;
+               }
+       }
+
+       while (count < len - 1) {
+               burstcnt = get_burstcount(chip);
+               dev_dbg(chip->dev,
+                       "send(): count=%zd, len=%zd, burstcount=%d (plain)\n",
+                       count, len, burstcnt);
+
+               /* burstcnt < 0 = tpm is busy */
+               if (burstcnt < 0)
+                       return burstcnt;
+
+               if (burstcnt > (len-1-count))
+                       burstcnt = len-1-count;
+
+               dev_dbg(chip->dev, "send(): burstcount=%d\n", burstcnt);
+
+               rc = iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality),
+                                  &(buf[count]), burstcnt);
+               if (rc == 0)
+                       count += burstcnt;
+
+               wait_for_stat(chip, TPM_STS_VALID,
+                               chip->vendor.timeout_c, &status);
+
+               if ((status & TPM_STS_DATA_EXPECT) == 0) {
+                       rc = -EIO;
+                       goto out_err;
+               }
+
+       }
+
+       dev_dbg(chip->dev, "send(): last byte @ count=%zd\n", count);
+
+       /* write last byte */
+       iic_tpm_write(TPM_DATA_FIFO(chip->vendor.locality), &(buf[count]), 1);
+       wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c, &status);
+       if ((status & TPM_STS_DATA_EXPECT) != 0) {
+               rc = -EIO;
+               goto out_err;
+       }
+
+       /* go and do it */
+       iic_tpm_write(TPM_STS(chip->vendor.locality), &sts, 1);
+
+       return len;
+out_err:
+       tpm_tis_i2c_ready(chip);
+       /* The TPM needs some time to clean up here,
+        * so we sleep rather than keeping the bus busy
+        */
+       usleep_range(2400, 2600);
+       release_locality(chip, chip->vendor.locality, 0);
+       return rc;
+}
+
+static const struct file_operations tis_ops = {
+       .owner = THIS_MODULE,
+       .llseek = no_llseek,
+       .open = tpm_open,
+       .read = tpm_read,
+       .write = tpm_write,
+       .release = tpm_release,
+};
+
+static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
+static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
+static DEVICE_ATTR(enabled, S_IRUGO, tpm_show_enabled, NULL);
+static DEVICE_ATTR(active, S_IRUGO, tpm_show_active, NULL);
+static DEVICE_ATTR(owned, S_IRUGO, tpm_show_owned, NULL);
+static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated, NULL);
+static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
+static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
+
+static struct attribute *tis_attrs[] = {
+       &dev_attr_pubek.attr,
+       &dev_attr_pcrs.attr,
+       &dev_attr_enabled.attr,
+       &dev_attr_active.attr,
+       &dev_attr_owned.attr,
+       &dev_attr_temp_deactivated.attr,
+       &dev_attr_caps.attr,
+       &dev_attr_cancel.attr, NULL,
+};
+
+static struct attribute_group tis_attr_grp = {
+       .attrs = tis_attrs
+};
+
+static struct tpm_vendor_specific tpm_tis_i2c = {
+       .status = tpm_tis_i2c_status,
+       .recv = tpm_tis_i2c_recv,
+       .send = tpm_tis_i2c_send,
+       .cancel = tpm_tis_i2c_ready,
+       .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
+       .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
+       .req_canceled = TPM_STS_COMMAND_READY,
+       .attr_group = &tis_attr_grp,
+       .miscdev = {
+                   .fops = &tis_ops,},
+};
+
+static int tpm_tis_i2c_init(struct device *dev)
+{
+       u32 vendor;
+       int rc = 0;
+       struct tpm_chip *chip;
+       extern void tpm_continue_selftest(struct tpm_chip *);
+
+       chip = tpm_register_hardware(dev, &tpm_tis_i2c);
+       if (!chip) {
+               rc = -ENODEV;
+               goto out_err;
+       }
+
+       /* Disable interrupts */
+       chip->vendor.irq = 0;
+
+       /* Default timeouts */
+       chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+       chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
+       chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+       chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+
+       if (request_locality(chip, 0) != 0) {
+               rc = -ENODEV;
+               goto out_vendor;
+       }
+
+       /* read four bytes from DID_VID register */
+       if (iic_tpm_read(TPM_DID_VID(0), (u8 *) &vendor, 4) < 0) {
+               rc = -EIO;
+               goto out_vendor;
+       }
+
+       /* create DID_VID register value, after swapping to little-endian */
+       vendor = be32_to_cpu((__be32) vendor);
+
+       if (vendor != TPM_TIS_I2C_DID_VID) {
+               rc = -ENODEV;
+               goto out_release;
+       }
+
+       dev_info(dev, "1.2 TPM (device-id 0x%X)\n", vendor >> 16);
+
+       INIT_LIST_HEAD(&chip->vendor.list);
+       tpm_dev.chip = chip;
+
+       tpm_get_timeouts(chip);
+       tpm_continue_selftest(chip);
+
+       return 0;
+
+out_release:
+       release_locality(chip, chip->vendor.locality, 1);
+
+out_vendor:
+       tpm_dev_vendor_release(chip);
+       tpm_remove_hardware(chip->dev);
+
+out_err:
+       return rc;
+}
+
+
+static const struct i2c_device_id tpm_i2c_tis_table[] = {
+       { "tpm_tis_i2c", 0 },
+       { },
+};
+
+#ifdef CONFIG_PM
+/* NOTE:
+ * Suspend does currently not work Nvidias Tegra2 Platform
+ * but works fine on Beagleboard (arm omap).
+ *
+ * This function will block System Suspend if TPM is not initialized,
+ * however the TPM is usually initialized by BIOS/u-boot or by sending
+ * a tpm startup command.
+ */
+static int tpm_tis_i2c_suspend(struct device *dev)
+{
+       return tpm_pm_suspend(dev, dev->power.power_state);
+}
+
+static int tpm_tis_i2c_resume(struct device *dev)
+{
+       return tpm_pm_resume(dev);
+}
+
+static const struct dev_pm_ops tpm_tis_i2c_ops = {
+       .suspend = tpm_tis_i2c_suspend,
+       .resume = tpm_tis_i2c_resume,
+};
+#endif
+
+
+static int dummy_probe(struct i2c_client *client,
+       const struct i2c_device_id *id)
+{
+       return 0;
+}
+
+static int dummy_remove(struct i2c_client *client)
+{
+       return 0;
+}
+
+static struct i2c_driver tpm_i2c_tis_driver = {
+
+       .id_table = tpm_i2c_tis_table,
+       .probe = dummy_probe,
+       .remove = dummy_remove,
+       .driver = {
+               .name   = "tpm_tis_i2c",
+               .owner  = THIS_MODULE,
+#ifdef CONFIG_PM
+               .pm     = &tpm_tis_i2c_ops,
+#endif
+       },
+};
+
+
+static struct i2c_adapter *adap;
+static struct i2c_client *client;
+static struct i2c_board_info info = {
+       I2C_BOARD_INFO("tpm_tis_i2c", 0x20),
+};
+
+
+static int addr = 0x20;
+module_param(addr, int, S_IRUGO);
+MODULE_PARM_DESC(addr, "TPM I2C Device Address (default: 0x20)");
+
+static int bus_id = 1;
+module_param(bus_id, int, S_IRUGO);
+MODULE_PARM_DESC(bus_id, "TPM I2C Bus Id (default: 1)");
+
+static int __init init_tis_i2c(void)
+{
+
+       int rc = 0;
+       info.addr = addr;
+
+
+       if (tpm_dev.client != NULL)
+               return -EBUSY;
+
+       adap = i2c_get_adapter(bus_id);
+       if (!adap)
+               return -ENODEV;
+
+       client = i2c_new_device(adap, &info);
+       if (!client) {
+               i2c_put_adapter(adap);
+               return -ENODEV;
+       }
+
+       rc = i2c_add_driver(&tpm_i2c_tis_driver);
+       if (rc != 0) {
+               i2c_del_driver(&tpm_i2c_tis_driver);
+               i2c_put_adapter(tpm_dev.client->adapter);
+               return -ENODEV;
+       }
+       client->driver = &tpm_i2c_tis_driver;
+
+       tpm_dev.client = client;
+
+       rc = tpm_tis_i2c_init(&client->dev);
+       if (rc < 0) {
+               i2c_del_driver(&tpm_i2c_tis_driver);
+               i2c_put_adapter(tpm_dev.client->adapter);
+               device_del(&(tpm_dev.client->dev));
+       }
+
+       return rc;
+}
+
+static void __exit cleanup_tis_i2c(void)
+{
+       struct tpm_chip *chip = tpm_dev.chip;
+       release_locality(chip, chip->vendor.locality, 1);
+
+       tpm_dev_vendor_release(chip);
+       tpm_remove_hardware(chip->dev);
+
+       i2c_del_driver(&tpm_i2c_tis_driver);
+
+       i2c_put_adapter(tpm_dev.client->adapter);
+
+       /*
+        * taken from core.c as workaround since
+        * tpm_remove_hardware requires device structure
+        */
+       pr_debug("device: '%s': %s\n",
+               dev_name(&(tpm_dev.client->dev)), __func__);
+       device_del(&(tpm_dev.client->dev));
+}
+
+module_init(init_tis_i2c);
+module_exit(cleanup_tis_i2c);
+MODULE_AUTHOR("Peter Huewe <huewe.external@infineon.com>");
+MODULE_DESCRIPTION("TPM TIS I2C Driver");
+MODULE_VERSION("2.1.2");
+MODULE_LICENSE("GPL");
index 2a90ba6..acedda5 100644 (file)
 #include <linux/kobject.h>
 #include <linux/module.h>
 #include <linux/dmi.h>
+#include <linux/mm.h>
 #include <asm/bios_ebda.h>
+#include <asm/e820.h>
+#include <acpi/acpi_bus.h>
 
 #define BIOS_MEMCONSOLE_V1_MAGIC       0xDEADBABE
 #define BIOS_MEMCONSOLE_V2_MAGIC       (('M')|('C'<<8)|('O'<<16)|('N'<<24))
@@ -43,6 +46,13 @@ struct biosmemcon_ebda {
 
 static char *memconsole_baseaddr;
 static size_t memconsole_length;
+static bool coreboot_system;
+
+static int set_coreboot_system_flag(const struct dmi_system_id *unused)
+{
+       coreboot_system = true;
+       return true;
+}
 
 static ssize_t memconsole_read(struct file *filp, struct kobject *kobp,
                               struct bin_attribute *bin_attr, char *buf,
@@ -83,6 +93,123 @@ static void found_v2_header(struct biosmemcon_ebda *hdr)
                                           + hdr->v2.start);
 }
 
+/*
+ * The function below tries to find the firmware console log saved in the
+ * appropriate coreboot CBMEM section, using the structures and constants from
+ * coreboot code.
+ *
+ * Coreboot's CBMEM is a structure allocated by coreboot above usable memory
+ * at a 128K aligned address. One of the CBMEM sections could contain the
+ * firmare console log.
+ */
+
+/* Coreboot CBMEM section descriptor. */
+struct cbmem_entry {
+       u32 magic;
+       u32 id;
+       u64 base;
+       u64 size;
+} __packed;
+
+/* CBMEM firmware console log descriptor. */
+struct cbmem_cons {
+       u32 buffer_size;
+       u32 buffer_cursor;
+       u8  buffer_body[0];
+} __packed;
+
+struct cbmem_cons __iomem *cbmem_console;
+
+/* coreboot CBMEM constants */
+#define CBMEM_ALIGNMENT   (128 * 1024)
+#define MEMORY_BOUNDARY   (1024 * 1024 * 1024)
+#define MAX_CBMEM_ENTRIES 16
+#define CBMEM_ENTRY_MAGIC 0x434f5245
+#define CBMEM_CONSOLE_ID  0x434f4e53
+#define CBMEM_ACPI_NAME   "\\CMEM"
+
+static bool check_cbmem(void)
+{
+       struct sysinfo sysi;
+       phys_addr_t top_of_ram, scan_addr = 0;
+       acpi_handle handle;
+       acpi_status status;
+       unsigned long long value;
+
+       /*
+        * Attempt to use defined ACPI name to locate CBMEM TOC.
+        */
+       status = acpi_get_handle(NULL, CBMEM_ACPI_NAME, &handle);
+       if (ACPI_SUCCESS(status)) {
+               status = acpi_evaluate_integer(handle, CBMEM_ACPI_NAME,
+                                              NULL, &value);
+               /* Start scan at this address */
+               if (ACPI_SUCCESS(status) && value > 0)
+                       scan_addr = (phys_addr_t) value;
+       }
+
+       /*
+        * Otherwise determine where to start looking for CBMEM signature:
+        * take the top of usable memory and align it up to 128K boundary.
+        */
+       if (!scan_addr) {
+               si_meminfo(&sysi);
+               top_of_ram = (phys_addr_t) sysi.totalram << PAGE_SHIFT;
+               scan_addr = ALIGN(top_of_ram, CBMEM_ALIGNMENT) +
+                       CBMEM_ALIGNMENT;
+       }
+
+       while (scan_addr % MEMORY_BOUNDARY) {
+               struct cbmem_entry __iomem *pcbm;
+               int i, remap_size = sizeof(struct cbmem_entry) * 16;
+
+               /*
+                * See if we reached reserved memory. Bail out if so, as it is
+                * not mappable and is above the region where the CBMEM could
+                * be.
+                */
+               if (e820_any_mapped(scan_addr,
+                                   scan_addr + remap_size,
+                                   E820_RESERVED))
+                       break;
+
+               pcbm = ioremap(scan_addr, remap_size);
+               if (!pcbm) {
+                       scan_addr += CBMEM_ALIGNMENT;
+                       continue;
+               }
+
+               if (pcbm->magic != CBMEM_ENTRY_MAGIC) {
+                       iounmap(pcbm);
+                       scan_addr += CBMEM_ALIGNMENT;
+                       continue;
+               }
+
+               /* CBMEM found. Is the console log there? */
+               for (i = 1; i < MAX_CBMEM_ENTRIES; i++) {
+                       if ((pcbm[i].magic == CBMEM_ENTRY_MAGIC) &&
+                           (pcbm[i].id == CBMEM_CONSOLE_ID)) {
+                               /* Yes, map the log. */
+                               cbmem_console = ioremap(pcbm[i].base,
+                                                       pcbm[i].size);
+                               break;
+                       }
+               }
+               iounmap(pcbm);
+               break;
+       }
+
+       if (cbmem_console) {
+               memconsole_baseaddr = cbmem_console->buffer_body;
+               memconsole_length = min(cbmem_console->buffer_cursor,
+                                       cbmem_console->buffer_size);
+               return true;
+       }
+
+       printk(KERN_INFO "CBMEM console structure not found!\n");
+       return false;
+}
+
 /*
  * Search through the EBDA for the BIOS Memory Console, and
  * set the global variables to point to it.  Return true if found.
@@ -92,6 +219,10 @@ static bool found_memconsole(void)
        unsigned int address;
        size_t length, cur;
 
+       /* Is it communicated through CBMEM? */
+       if (coreboot_system && check_cbmem())
+               return true;
+
        address = get_bios_ebda();
        if (!address) {
                printk(KERN_INFO "BIOS EBDA non-existent.\n");
@@ -133,6 +264,13 @@ static struct dmi_system_id memconsole_dmi_table[] __initdata = {
                        DMI_MATCH(DMI_BOARD_VENDOR, "Google, Inc."),
                },
        },
+       {
+               .ident = "Google Board",
+               .callback = set_coreboot_system_flag,
+               .matches = {
+                       DMI_MATCH(DMI_BIOS_VENDOR, "coreboot"),
+               },
+       },
        {}
 };
 MODULE_DEVICE_TABLE(dmi, memconsole_dmi_table);
@@ -156,6 +294,9 @@ static int __init memconsole_init(void)
 
 static void __exit memconsole_exit(void)
 {
+       if (cbmem_console)
+               iounmap(cbmem_console);
+
        sysfs_remove_bin_file(firmware_kobj, &memconsole_bin_attr);
 }
 
index e03653d..1da4037 100644 (file)
@@ -451,6 +451,12 @@ config GPIO_RDC321X
          Support for the RDC R321x SoC GPIOs over southbridge
          PCI configuration space.
 
+config GPIO_NM10
+        tristate "Intel NM10 GPIO controller support"
+        depends on PCI
+        help
+          Say Y here to support Intel's NM10 LPC based GPIO controller.
+
 comment "SPI GPIO expanders:"
 
 config GPIO_MAX7301
index 007f54b..b9c1347 100644 (file)
@@ -36,6 +36,7 @@ obj-$(CONFIG_GPIO_MSM_V1)     += gpio-msm-v1.o
 obj-$(CONFIG_GPIO_MSM_V2)      += gpio-msm-v2.o
 obj-$(CONFIG_GPIO_MXC)         += gpio-mxc.o
 obj-$(CONFIG_GPIO_MXS)         += gpio-mxs.o
+obj-$(CONFIG_GPIO_NM10)                += nm10_gpio.o
 obj-$(CONFIG_PLAT_NOMADIK)     += gpio-nomadik.o
 obj-$(CONFIG_ARCH_OMAP)                += gpio-omap.o
 obj-$(CONFIG_GPIO_PCA953X)     += gpio-pca953x.o
diff --git a/drivers/gpio/nm10_gpio.c b/drivers/gpio/nm10_gpio.c
new file mode 100644 (file)
index 0000000..ef44e53
--- /dev/null
@@ -0,0 +1,450 @@
+/*
+ * Copyright (c) 2010, The Chromium OS Authors
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * This driver supports GPIO controller of the NM10 chip.
+ *
+ * The NM10 has many GPIO pins, the exact number depends on the configuration,
+ * as some of the pins can be used for other than GPIO purposes. The GPIO
+ * controller has provision of managing of up to 64 bits. Each bit can be
+ * configured as 'not available', (when for other than GPIO purposes), or a
+ * GPIO input/output.
+ *
+ * Even though NM10 provides the ability to change GPIO bits' directions, this
+ * driver does NOT allow to change the use of the bits. Whatever the system is
+ * strapped and/or configured by BIOS for is used by the driver.
+ *
+ * This driver plugs in into the existing linux gpio infrastructure and allows
+ * to instantiate all 64 bits (through writing into /sys/class/gpio/export)
+ * even though not all bits can be used. This simplifies bit mapping between
+ * hardware and software.
+ *
+ * Attempts to write into unsupported bits are silently ignored. Attempts to
+ * read unsupported bits return value of zero.
+ *
+ * For the lower 32 GPIO bits the NM10 provides the ability to 'blink'
+ * (alternate 1 and zero with 1Hz frequency at approximately 50% duty cycle)
+ * on output and invert level on input. This driver does not provide access
+ * these features.
+ *
+ * The NM10 GPIO controller is a part of the LPC PCI device, (PCI device ID
+ * 0x27bc). The GPIO register file is mapped to the IO space. An earlier Intel
+ * chip, the ICH7M south bridge, has a similar GPIO controller, it could be
+ * also supported by this driver.
+ *
+ * "Intel NM10 Family Express Chipset" datasheet of Dec 2009 (document number
+ * 322896-001) was used as a reference when writing this driver.
+ *
+ * This driver also supports the Intel 6 Series chipset. This chipset
+ * supports 96 GPIOs instead of 64 that NM10 does. Datasheet here:
+ * http://www.intel.com/content/www/us/en/chipsets/6-chipset-c200-chipset-datasheet.html
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/gpio.h>
+#include <linux/slab.h>
+
+static char gpio_driver_name[] = "nm10_gpio";
+static char gpio_driver_version[] = "0.04";
+
+/* NM10 GPIO register file definitions, offsets in the IO space */
+#define NM10_GPIO_USE_SEL 0
+#define NM10_GPIO_IO_SEL 4
+#define NM10_GPIO_LVL 0xc
+#define NM10_GPIO_USE_SEL2 0x30
+#define NM10_GPIO_IO_SEL2 0x34
+#define NM10_GPIO_LVL2 0x38
+#define NM10_GPIO_USE_SEL3 0x40
+#define NM10_GPIO_IO_SEL3 0x44
+#define NM10_GPIO_LVL3 0x48
+
+#define NM10_GPIO_REG_FILE_SIZE 0x40
+
+/* Structure describing one GPIO section in the nm10, accessing 32 GPIO bits. */
+struct nm10_gpio_info {
+       u_char use_select_offset;
+       u_char io_select_offset;
+       u_char io_level_offset;
+};
+
+/* This array describes two NM10 GPIO sections */
+const struct nm10_gpio_info nm10_gpio_sections[] = {
+       {NM10_GPIO_USE_SEL, NM10_GPIO_IO_SEL, NM10_GPIO_LVL},
+       {NM10_GPIO_USE_SEL2, NM10_GPIO_IO_SEL2, NM10_GPIO_LVL2},
+       {NM10_GPIO_USE_SEL3, NM10_GPIO_IO_SEL3, NM10_GPIO_LVL3},
+};
+
+#define NM10_GPIO_BITS_PER_SECTION 32
+#define NM10_GPIO_SECTIONS ARRAY_SIZE(nm10_gpio_sections)
+
+static u32 max_gpio_bits;
+#define NM10_MAX_GPIO_BITS max_gpio_bits
+
+/*
+ * Structure representing a single NM10 GPIO driver instance.
+ */
+struct nm10_gpio {
+       struct gpio_chip chip;
+       u32 io_base;    /* base IO space address of the GPIO register file */
+
+       /* cached contents of the GPIO bit selections, read during driver
+        * installation */
+       u32 cached_select[NM10_GPIO_SECTIONS];
+};
+
+/**
+ * nm10_get_parameters() - get value of a GPIO bit
+ *
+ * Inputs:
+ * @chip: generic gpio chip handle associated with this module
+ * @offset: zero based GPIO bit number (in this controller's scope).
+ *
+ * Outputs:
+ * @psection - pointer to the NM10 section number containing bit offset
+ * @pbit,- pointer to the offset's bit mask within the section
+ * @pgpio - pointer to address of this nm10_gpio instance.
+ *
+ * Returns zero on errors or nonzero on success.
+ */
+static int nm10_get_parameters(struct gpio_chip *chip, unsigned offset,
+                              u8* psection, u32* pbit,
+                              struct nm10_gpio **pgpio)
+{
+       *pgpio = container_of(chip, struct nm10_gpio, chip);
+
+       *psection = offset / NM10_GPIO_BITS_PER_SECTION;
+       *pbit = BIT(offset % NM10_GPIO_BITS_PER_SECTION);
+
+       if (*psection >= NM10_GPIO_SECTIONS) {
+               printk(KERN_ERR "%s: bad offset %d\n",
+                      gpio_driver_name, offset);
+               return 0;
+       }
+
+       if (!(*pbit & (*pgpio)->cached_select[*psection])) {
+               return 0;       /* this bit is not used for GPIO */
+       }
+       return ~0;
+}
+
+/**
+ * nm10_gpio_get() - get value of a GPIO bit
+ * @chip: generic gpio chip handle associated with this module
+ * @offset: zero based GPIO bit number (in this controller's scope).
+ *
+ * Returns zero in cases when offset exceeds the chip's GPIO capacity, or the
+ * passed in bit not used for GPIO. If the offset is of a valid bit - returns
+ * a bitmask with the bit value matching the actual bit input state.
+ */
+static int nm10_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+       u8 section;
+       u32 bit;
+       struct nm10_gpio *pgpio = container_of(chip, struct nm10_gpio, chip);
+
+       if (!nm10_get_parameters(chip, offset, &section, &bit, &pgpio)) {
+               return 0;
+       }
+
+       return inl(pgpio->io_base +
+                  nm10_gpio_sections[section].io_level_offset) & bit;
+}
+
+/**
+ * nm10_gpio_set() - set value of a GPIO bit
+ * @chip: generic gpio chip handle associated with this module
+ * @offset: zero based GPIO bit number (in this controller's scope).
+ * @value: the value to set the output to
+ *
+ * If the offset is of a valid bit (used for GPIO output) - the bit state is
+ * changed to reflect the value. All other in range offset values are ignored.
+ */
+static void nm10_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+       u8 section;
+       u32 bit;
+       const struct nm10_gpio_info *pinfo;
+       struct nm10_gpio *pgpio;
+       u32 gpio_reg_value;
+
+       if (!nm10_get_parameters(chip, offset, &section, &bit, &pgpio)) {
+               return;
+       }
+
+       pinfo = nm10_gpio_sections + section;
+       if (inl(pgpio->io_base + pinfo->io_select_offset) & bit) {
+               return;         /* this is an input bit */
+       }
+
+       gpio_reg_value = inl(pgpio->io_base + pinfo->io_level_offset);
+
+       if (value) {
+               gpio_reg_value |= bit;
+       } else {
+               gpio_reg_value &= ~bit;
+       }
+       outl(gpio_reg_value, pgpio->io_base + pinfo->io_level_offset);
+}
+
+/**
+ * nm10_gpio_direction_inp() configure signal "offset" as input, or return error
+ * @chip: generic gpio chip handle associated with this module
+ * @offset: zero based GPIO bit number (in this controller's scope).
+ */
+static int nm10_gpio_direction_inp(struct gpio_chip *chip,
+                                  unsigned offset)
+{
+       u8 section;
+       u32 bit;
+       struct nm10_gpio *pgpio = container_of(chip, struct nm10_gpio, chip);
+       u32 io_select_offset;
+
+       if (!nm10_get_parameters(chip, offset, &section, &bit, &pgpio)) {
+               return -1;
+       }
+
+       io_select_offset = pgpio->io_base +
+               nm10_gpio_sections[section].io_select_offset;
+       outl(inl(io_select_offset) | bit, io_select_offset);
+       return 0;
+}
+
+/**
+ * nm10_gpio_direction_out() configure signal "offset" as output,
+ *                          or return error
+ * @chip: generic gpio chip handle associated with this module
+ * @offset: zero based GPIO bit number (in this controller's scope).
+ * @value: the value to set the output to
+ */
+static int nm10_gpio_direction_out(struct gpio_chip *chip,
+                                  unsigned offset, int value)
+{
+       u8 section;
+       u32 bit;
+       struct nm10_gpio *pgpio = container_of(chip, struct nm10_gpio, chip);
+       u32 io_select_offset;
+
+       if (!nm10_get_parameters(chip, offset, &section, &bit, &pgpio)) {
+               return -1;
+       }
+
+       io_select_offset = pgpio->io_base +
+               nm10_gpio_sections[section].io_select_offset;
+       outl(inl(io_select_offset) & ~bit, io_select_offset);
+       nm10_gpio_set(chip, offset, value);
+       return 0;
+}
+
+static int __devinit nm10_gpio_probe(struct pci_dev *pdev,
+                                    const struct pci_device_id *id)
+{
+       int retval, ii;
+       u32 value;
+       struct nm10_gpio *pgpio;
+
+       retval = pci_enable_device(pdev);
+       printk(KERN_INFO "%s version %s built on %s at %s\n", gpio_driver_name,
+              gpio_driver_version, __DATE__, __TIME__);
+
+       if (retval) {
+               goto done;
+       }
+
+       /* actual IO space offset of the GPIO block */
+       retval = pci_read_config_dword(pdev, 0x48, &value);
+       if (retval || !(value & 1)) {
+               dev_err(&pdev->dev,
+                       "failed retrieving IO base addr, got %d(0x%x)\n",
+                       retval, value);
+               goto err2;
+       }
+
+       value &= ~1; /* clear the IO space flag */
+       if (!request_region(value, NM10_GPIO_REG_FILE_SIZE, gpio_driver_name)) {
+               dev_err(&pdev->dev, "error requesting REGION\n");
+               retval = -ENOMEM;
+               goto err2;
+       }
+
+       pgpio = kzalloc(sizeof(struct nm10_gpio), GFP_KERNEL);
+       if (!pgpio) {
+               dev_err(&pdev->dev, "can't allocate nm10_gpio structure\n");
+               retval = -ENOMEM;
+               goto err3;
+       }
+
+       if (id->device == PCI_DEVICE_ID_INTEL_TGP_LPC)
+               /* NM10 supports 64 GPIOs */
+               max_gpio_bits = 64;
+       else
+               /* Cougarpoint supports 96 GPIOs */
+               max_gpio_bits = 96;
+
+       /* used to access GPIO bits on this chip */
+       pgpio->io_base = value;
+
+       pgpio->chip.base = -1;
+       pgpio->chip.label = dev_name(&pdev->dev);
+       pgpio->chip.get = nm10_gpio_get;
+       pgpio->chip.set = nm10_gpio_set;
+       pgpio->chip.direction_input = nm10_gpio_direction_inp;
+       pgpio->chip.direction_output = nm10_gpio_direction_out;
+       pgpio->chip.ngpio = NM10_MAX_GPIO_BITS;
+       pgpio->chip.can_sleep = 0;
+       pci_set_drvdata(pdev, pgpio);
+
+       /* store GPIO configuration locally */
+       for (ii = 0; ii < ARRAY_SIZE(pgpio->cached_select); ii++) {
+               pgpio->cached_select[ii] = inl(pgpio->io_base +
+                                              nm10_gpio_sections[ii].
+                                              use_select_offset);
+       }
+
+       retval = gpiochip_add(&pgpio->chip);
+       if (!retval) {
+               goto done;
+       }
+
+       dev_err(&pdev->dev, "%s gpiochip_add error %d\n",
+               gpio_driver_name, retval);
+
+       kfree(pgpio);
+      err3:
+       release_region(value, NM10_GPIO_REG_FILE_SIZE);
+      err2:
+       pci_disable_device(pdev);
+      done:
+       if (retval) {
+               printk(KERN_ERR "%s failed!\n", gpio_driver_name);
+
+       }
+       return retval;
+}
+
+/**
+ * nm10_gpio_remove() - remove the NM10 gpio driver module.
+ * @pdev: pci device associated with this driver module
+ *
+ */
+static void nm10_gpio_remove(struct pci_dev *pdev)
+{
+       struct nm10_gpio *pgpio = pci_get_drvdata(pdev);
+       int base = pgpio->chip.base;
+
+       release_region(pgpio->io_base, NM10_GPIO_REG_FILE_SIZE);
+
+       if (gpiochip_remove(&pgpio->chip)) {
+               printk(KERN_ERR "%s: failed removing!\n", gpio_driver_name);
+               return;
+       }
+
+       pci_disable_device(pdev);
+       pci_set_drvdata(pdev, NULL);
+       kfree(pgpio);
+       printk(KERN_INFO "%s base %d removed\n", gpio_driver_name, base);
+}
+
+static struct pci_device_id nm10_gpio_ids[] = {
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Z68)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_P67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_UM67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_HM65)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_H67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_HM67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Q65)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_QS67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Q67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_QM67)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_B65)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C202)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C204)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C206)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_H61)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_B75)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_C216)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_H77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM75)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM76)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MBL_SAMPLE)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Q75)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Q77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_QM77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_QS77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_SFF_SAMPLE)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_UM77)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Z75)},
+       {PCI_DEVICE(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Z77)},
+       {0,}
+};
+
+MODULE_DEVICE_TABLE(pci, nm10_gpio_ids);
+
+static struct pci_driver nm10_gpio_pci_driver = {
+       .name = gpio_driver_name,
+       .id_table = nm10_gpio_ids,
+       .probe = nm10_gpio_probe,
+       .remove = nm10_gpio_remove
+};
+
+static int __init nm10_gpio_init(void)
+{
+       return pci_register_driver(&nm10_gpio_pci_driver);
+}
+
+static void __exit nm10_gpio_exit(void)
+{
+       pci_unregister_driver(&nm10_gpio_pci_driver);
+}
+
+module_init(nm10_gpio_init);
+module_exit(nm10_gpio_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("The Chromium OS Authors");
+MODULE_DESCRIPTION("NM10 GPIO driver");
index e354bc0..a62cf61 100644 (file)
@@ -119,7 +119,6 @@ config DRM_I915
        select BACKLIGHT_CLASS_DEVICE if ACPI
        select VIDEO_OUTPUT_CONTROL if ACPI
        select INPUT if ACPI
-       select ACPI_VIDEO if ACPI
        select ACPI_BUTTON if ACPI
        help
          Choose this option if you have a system that has "Intel Graphics
index a0d6e89..fa5c723 100644 (file)
@@ -225,6 +225,11 @@ bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper)
        int i, ret;
        for (i = 0; i < fb_helper->crtc_count; i++) {
                struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
+               struct drm_crtc *crtc = mode_set->crtc;
+
+               if (!crtc->enabled)
+                       continue;
+
                ret = drm_crtc_helper_set_config(mode_set);
                if (ret)
                        error = true;
index ae8a64f..0270a2f 100644 (file)
@@ -58,13 +58,13 @@ module_param_named(powersave, i915_powersave, int, 0600);
 MODULE_PARM_DESC(powersave,
                "Enable powersavings, fbc, downclocking, etc. (default: true)");
 
-int i915_semaphores __read_mostly = -1;
+int i915_semaphores __read_mostly = 1;
 module_param_named(semaphores, i915_semaphores, int, 0600);
 MODULE_PARM_DESC(semaphores,
-               "Use semaphores for inter-ring sync (default: -1 (use per-chip defaults))");
+               "Use semaphores for inter-ring sync (default: true)");
 
-int i915_enable_rc6 __read_mostly = -1;
-module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0400);
+int i915_enable_rc6 __read_mostly = 1;
+module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);
 MODULE_PARM_DESC(i915_enable_rc6,
                "Enable power-saving render C-state 6. "
                "Different stages can be selected via bitmask values "
@@ -72,13 +72,13 @@ MODULE_PARM_DESC(i915_enable_rc6,
                "For example, 3 would enable rc6 and deep rc6, and 7 would enable everything. "
                "default: -1 (use per-chip default)");
 
-int i915_enable_fbc __read_mostly = -1;
+int i915_enable_fbc __read_mostly = 1;
 module_param_named(i915_enable_fbc, i915_enable_fbc, int, 0600);
 MODULE_PARM_DESC(i915_enable_fbc,
                "Enable frame buffer compression for power savings "
-               "(default: -1 (use per-chip default))");
+               "(default: true)");
 
-unsigned int i915_lvds_downclock __read_mostly = 0;
+unsigned int i915_lvds_downclock __read_mostly = 1;
 module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);
 MODULE_PARM_DESC(lvds_downclock,
                "Use panel (LVDS/eDP) downclocking for power savings "
index 5fabc6c..d89f585 100644 (file)
@@ -302,7 +302,6 @@ struct intel_fbc_work;
 struct intel_gmbus {
        struct i2c_adapter adapter;
        bool force_bit;
-       bool has_gpio;
        u32 reg0;
        u32 gpio_reg;
        struct i2c_algo_bit_data bit_algo;
@@ -326,12 +325,17 @@ typedef struct drm_i915_private {
        /** gt_lock is also taken in irq contexts. */
        struct spinlock gt_lock;
 
-       struct intel_gmbus *gmbus;
+       struct intel_gmbus gmbus[GMBUS_NUM_PORTS];
 
        /** gmbus_mutex protects against concurrent usage of the single hw gmbus
         * controller on different i2c buses. */
        struct mutex gmbus_mutex;
 
+       /**
+        * Base address of the gmbus and gpio block.
+        */
+       uint32_t gpio_mmio_base;
+
        struct pci_dev *bridge_dev;
        struct intel_ring_buffer ring[I915_NUM_RINGS];
        uint32_t next_seqno;
@@ -1357,6 +1361,13 @@ extern int i915_restore_state(struct drm_device *dev);
 /* intel_i2c.c */
 extern int intel_setup_gmbus(struct drm_device *dev);
 extern void intel_teardown_gmbus(struct drm_device *dev);
+extern inline bool intel_gmbus_is_port_valid(unsigned port)
+{
+       return (port >= GMBUS_PORT_SSC && port <= GMBUS_PORT_DPD);
+}
+
+extern struct i2c_adapter *intel_gmbus_get_adapter(
+               struct drm_i915_private *dev_priv, unsigned port);
 extern void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed);
 extern void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit);
 extern inline bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
index 0d1e4b7..686e5f1 100644 (file)
@@ -3317,7 +3317,10 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj,
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
 
-       BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT);
+       if (obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT) {
+               WARN(obj->pin_count, "pin count has reached its max\n");
+               return -ENOSPC;
+       }
        WARN_ON(i915_verify_lists(dev));
 
        if (obj->gtt_space != NULL) {
@@ -3494,7 +3497,8 @@ i915_gem_busy_ioctl(struct drm_device *dev, void *data,
                if (obj->base.write_domain & I915_GEM_GPU_DOMAINS) {
                        ret = i915_gem_flush_ring(obj->ring,
                                                  0, obj->base.write_domain);
-               } else if (obj->ring->outstanding_lazy_request ==
+               }
+               if (obj->ring->outstanding_lazy_request ==
                           obj->last_rendering_seqno) {
                        struct drm_i915_gem_request *request;
 
index 9d24d65..552264c 100644 (file)
 #define   GMBUS_RATE_50KHZ     (1<<8)
 #define   GMBUS_RATE_400KHZ    (2<<8) /* reserved on Pineview */
 #define   GMBUS_RATE_1MHZ      (3<<8) /* reserved on Pineview */
+#define   GMBUS_RATE_MASK      (3<<8)
 #define   GMBUS_HOLD_EXT       (1<<7) /* 300ns hold time, rsvd on Pineview */
 #define   GMBUS_PORT_DISABLED  0
 #define   GMBUS_PORT_SSC       1
 #define   GMBUS_PORT_PANEL     3
 #define   GMBUS_PORT_DPC       4 /* HDMIC */
 #define   GMBUS_PORT_DPB       5 /* SDVO, HDMIB */
-                                 /* 6 reserved */
-#define   GMBUS_PORT_DPD       7 /* HDMID */
-#define   GMBUS_NUM_PORTS       8
+#define   GMBUS_PORT_DPD       6 /* HDMID */
+#define   GMBUS_PORT_RESERVED  7 /* 7 reserved */
+#define   GMBUS_NUM_PORTS      (GMBUS_PORT_DPD - GMBUS_PORT_SSC + 1)
+#define   GMBUS_PORT_MASK      7
 #define GMBUS1                 0x5104 /* command/status */
 #define   GMBUS_SW_CLR_INT     (1<<31)
 #define   GMBUS_SW_RDY         (1<<30)
index b48fc2a..b09ea2a 100644 (file)
@@ -26,6 +26,7 @@
  */
 #include <linux/dmi.h>
 #include <drm/drm_dp_helper.h>
+#include <linux/dmi.h>
 #include "drmP.h"
 #include "drm.h"
 #include "i915_drm.h"
@@ -332,11 +333,11 @@ parse_general_definitions(struct drm_i915_private *dev_priv,
                if (block_size >= sizeof(*general)) {
                        int bus_pin = general->crt_ddc_gmbus_pin;
                        DRM_DEBUG_KMS("crt_ddc_bus_pin: %d\n", bus_pin);
-                       if (bus_pin >= 1 && bus_pin <= 6)
+                       if (intel_gmbus_is_port_valid(bus_pin))
                                dev_priv->crt_ddc_pin = bus_pin;
                } else {
                        DRM_DEBUG_KMS("BDB_GD too small (%d). Invalid.\n",
-                                 block_size);
+                                     block_size);
                }
        }
 }
@@ -595,6 +596,17 @@ parse_device_mapping(struct drm_i915_private *dev_priv,
        return;
 }
 
+static const struct dmi_system_id lvds_do_not_use_alternate_frequency[] = {
+       {
+               .callback = NULL,
+               .ident = "Lumpy",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Lumpy"),
+               }
+       },
+       { }
+};
+
 static void
 init_vbt_defaults(struct drm_i915_private *dev_priv)
 {
@@ -615,8 +627,11 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
 
        /* Default to using SSC */
        dev_priv->lvds_use_ssc = 1;
-       dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1);
-       DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq);
+       if (dmi_check_system(lvds_do_not_use_alternate_frequency))
+               dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 0);
+       else
+               dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1);
+       DRM_DEBUG("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq);
 
        /* eDP data */
        dev_priv->edp.bpp = 18;
index 90b9793..b37e213 100644 (file)
@@ -278,9 +278,10 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)
        if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {
                struct edid *edid;
                bool is_digital = false;
+               struct i2c_adapter *i2c;
 
-               edid = drm_get_edid(connector,
-                       &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
+               i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
+               edid = drm_get_edid(connector, i2c);
                /*
                 * This may be a DVI-I connector with a shared DDC
                 * link between analog and digital outputs, so we
@@ -476,15 +477,16 @@ static int intel_crt_get_modes(struct drm_connector *connector)
        struct drm_device *dev = connector->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret;
+       struct i2c_adapter *i2c;
 
-       ret = intel_ddc_get_modes(connector,
-                                &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
+       i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin);
+       ret = intel_ddc_get_modes(connector, i2c);
        if (ret || !IS_G4X(dev))
                return ret;
 
        /* Try to probe digital port for output in DVI-I -> VGA mode. */
-       return intel_ddc_get_modes(connector,
-                                  &dev_priv->gmbus[GMBUS_PORT_DPB].adapter);
+       i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
+       return intel_ddc_get_modes(connector, i2c);
 }
 
 static int intel_crt_set_property(struct drm_connector *connector,
index 1b1cf3b..6f83c46 100644 (file)
@@ -2547,7 +2547,7 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
        struct drm_i915_private *dev_priv = dev->dev_private;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        int pipe = intel_crtc->pipe;
-       u32 reg, temp, i;
+       u32 reg, temp, i, retry;
 
        /* Train 1: umask FDI RX Interrupt symbol_lock and bit_lock bit
           for train result */
@@ -2599,15 +2599,19 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
                POSTING_READ(reg);
                udelay(500);
 
-               reg = FDI_RX_IIR(pipe);
-               temp = I915_READ(reg);
-               DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
-
-               if (temp & FDI_RX_BIT_LOCK) {
-                       I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
-                       DRM_DEBUG_KMS("FDI train 1 done.\n");
-                       break;
+               for (retry = 0; retry < 5; retry++) {
+                       reg = FDI_RX_IIR(pipe);
+                       temp = I915_READ(reg);
+                       DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
+                       if (temp & FDI_RX_BIT_LOCK) {
+                               I915_WRITE(reg, temp | FDI_RX_BIT_LOCK);
+                               DRM_DEBUG_KMS("FDI train 1 done.\n");
+                               break;
+                       }
+                       udelay(50);
                }
+               if (retry < 5)
+                       break;
        }
        if (i == 4)
                DRM_ERROR("FDI train 1 fail!\n");
@@ -2648,15 +2652,19 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc)
                POSTING_READ(reg);
                udelay(500);
 
-               reg = FDI_RX_IIR(pipe);
-               temp = I915_READ(reg);
-               DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
-
-               if (temp & FDI_RX_SYMBOL_LOCK) {
-                       I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
-                       DRM_DEBUG_KMS("FDI train 2 done.\n");
-                       break;
+               for (retry = 0; retry < 5; retry++) {
+                       reg = FDI_RX_IIR(pipe);
+                       temp = I915_READ(reg);
+                       DRM_DEBUG_KMS("FDI_RX_IIR 0x%x\n", temp);
+                       if (temp & FDI_RX_SYMBOL_LOCK) {
+                               I915_WRITE(reg, temp | FDI_RX_SYMBOL_LOCK);
+                               DRM_DEBUG_KMS("FDI train 2 done.\n");
+                               break;
+                       }
+                       udelay(50);
                }
+               if (retry < 5)
+                       break;
        }
        if (i == 4)
                DRM_ERROR("FDI train 2 fail!\n");
@@ -6992,7 +7000,7 @@ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
        return mode;
 }
 
-#define GPU_IDLE_TIMEOUT 500 /* ms */
+#define GPU_IDLE_TIMEOUT 400 /* ms */
 
 /* When this timer fires, we've been idle for awhile */
 static void intel_gpu_idle_timer(unsigned long arg)
@@ -7011,7 +7019,7 @@ static void intel_gpu_idle_timer(unsigned long arg)
        queue_work(dev_priv->wq, &dev_priv->idle_work);
 }
 
-#define CRTC_IDLE_TIMEOUT 1000 /* ms */
+#define CRTC_IDLE_TIMEOUT 700 /* ms */
 
 static void intel_crtc_idle_timer(unsigned long arg)
 {
index 715afa1..ffd3823 100644 (file)
@@ -40,7 +40,8 @@
                        ret__ = -ETIMEDOUT;                             \
                        break;                                          \
                }                                                       \
-               if (W && drm_can_sleep()) msleep(W);    \
+               if (W && drm_can_sleep())                               \
+                       usleep_range(W * 50, W * 100);                  \
        }                                                               \
        ret__;                                                          \
 })
index 020a7d7..60ba50b 100644 (file)
@@ -243,7 +243,7 @@ static int intel_dvo_get_modes(struct drm_connector *connector)
         * that's not the case.
         */
        intel_ddc_get_modes(connector,
-                           &dev_priv->gmbus[GMBUS_PORT_DPC].adapter);
+                           intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPC));
        if (!list_empty(&connector->probed_modes))
                return 1;
 
@@ -375,7 +375,7 @@ void intel_dvo_init(struct drm_device *dev)
                 * special cases, but otherwise default to what's defined
                 * in the spec.
                 */
-               if (dvo->gpio != 0)
+               if (intel_gmbus_is_port_valid(dvo->gpio))
                        gpio = dvo->gpio;
                else if (dvo->type == INTEL_DVO_CHIP_LVDS)
                        gpio = GMBUS_PORT_SSC;
@@ -386,7 +386,7 @@ void intel_dvo_init(struct drm_device *dev)
                 * It appears that everything is on GPIOE except for panels
                 * on i830 laptops, which are on GPIOB (DVOA).
                 */
-               i2c = &dev_priv->gmbus[gpio].adapter;
+               i2c = intel_gmbus_get_adapter(dev_priv, gpio);
 
                intel_dvo->dev = *dvo;
                if (!dvo->dev_ops->init(&intel_dvo->dev, i2c))
index 2d7f47b..a754c51 100644 (file)
@@ -334,7 +334,8 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
        intel_hdmi->has_hdmi_sink = false;
        intel_hdmi->has_audio = false;
        edid = drm_get_edid(connector,
-                           &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
+                           intel_gmbus_get_adapter(dev_priv,
+                                                   intel_hdmi->ddc_bus));
 
        if (edid) {
                if (edid->input & DRM_EDID_INPUT_DIGITAL) {
@@ -367,7 +368,8 @@ static int intel_hdmi_get_modes(struct drm_connector *connector)
         */
 
        return intel_ddc_get_modes(connector,
-                                  &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
+                                  intel_gmbus_get_adapter(dev_priv,
+                                                          intel_hdmi->ddc_bus));
 }
 
 static bool
@@ -379,7 +381,8 @@ intel_hdmi_detect_audio(struct drm_connector *connector)
        bool has_audio = false;
 
        edid = drm_get_edid(connector,
-                           &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
+                           intel_gmbus_get_adapter(dev_priv,
+                                                   intel_hdmi->ddc_bus));
        if (edid) {
                if (edid->input & DRM_EDID_INPUT_DIGITAL)
                        has_audio = drm_detect_monitor_audio(edid);
index 8fdc957..11ea3eb 100644 (file)
 #include "i915_drm.h"
 #include "i915_drv.h"
 
+struct gmbus_port {
+       const char *name;
+       int reg;
+};
+
+static const struct gmbus_port gmbus_ports[] = {
+       { "ssc", GPIOB },
+       { "vga", GPIOA },
+       { "panel", GPIOC },
+       { "dpc", GPIOD },
+       { "dpb", GPIOE },
+       { "dpd", GPIOF },
+};
+
 /* Intel GPIO access functions */
 
 #define I2C_RISEFALL_TIME 10
@@ -49,10 +63,7 @@ void
 intel_i2c_reset(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
-       if (HAS_PCH_SPLIT(dev))
-               I915_WRITE(PCH_GMBUS0, 0);
-       else
-               I915_WRITE(GMBUS0, 0);
+       I915_WRITE(dev_priv->gpio_mmio_base + GMBUS0, 0);
 }
 
 static void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
@@ -140,63 +151,173 @@ static void set_data(void *data, int state_high)
        POSTING_READ(bus->gpio_reg);
 }
 
-static bool
+static int
+intel_gpio_pre_xfer(struct i2c_adapter *adapter)
+{
+       struct intel_gmbus *bus = container_of(adapter,
+                                              struct intel_gmbus,
+                                              adapter);
+       struct drm_i915_private *dev_priv = bus->dev_priv;
+
+       intel_i2c_reset(dev_priv->dev);
+       intel_i2c_quirk_set(dev_priv, true);
+       set_data(bus, 1);
+       set_clock(bus, 1);
+       udelay(I2C_RISEFALL_TIME);
+       return 0;
+}
+
+static void
+intel_gpio_post_xfer(struct i2c_adapter *adapter)
+{
+       struct intel_gmbus *bus = container_of(adapter,
+                                              struct intel_gmbus,
+                                              adapter);
+       struct drm_i915_private *dev_priv = bus->dev_priv;
+
+       set_data(bus, 1);
+       set_clock(bus, 1);
+       intel_i2c_quirk_set(dev_priv, false);
+}
+
+static void
 intel_gpio_setup(struct intel_gmbus *bus, u32 pin)
 {
        struct drm_i915_private *dev_priv = bus->dev_priv;
-       static const int map_pin_to_reg[] = {
-               0,
-               GPIOB,
-               GPIOA,
-               GPIOC,
-               GPIOD,
-               GPIOE,
-               0,
-               GPIOF,
-       };
        struct i2c_algo_bit_data *algo;
 
-       if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin])
-               return false;
-
        algo = &bus->bit_algo;
 
-       bus->gpio_reg = map_pin_to_reg[pin];
-       if (HAS_PCH_SPLIT(dev_priv->dev))
-               bus->gpio_reg += PCH_GPIOA - GPIOA;
+       /* -1 to map pin pair to gmbus index */
+       bus->gpio_reg = dev_priv->gpio_mmio_base + gmbus_ports[pin - 1].reg;
 
        bus->adapter.algo_data = algo;
        algo->setsda = set_data;
        algo->setscl = set_clock;
        algo->getsda = get_data;
        algo->getscl = get_clock;
+       algo->pre_xfer = intel_gpio_pre_xfer;
+       algo->post_xfer = intel_gpio_post_xfer;
        algo->udelay = I2C_RISEFALL_TIME;
        algo->timeout = usecs_to_jiffies(2200);
        algo->data = bus;
+}
+
+static int
+gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg,
+               u32 gmbus1_index)
+{
+       int reg_offset = dev_priv->gpio_mmio_base;
+       u16 len = msg->len;
+       u8 *buf = msg->buf;
+
+       I915_WRITE(GMBUS1 + reg_offset,
+                  gmbus1_index |
+                  GMBUS_CYCLE_WAIT |
+                  (len << GMBUS_BYTE_COUNT_SHIFT) |
+                  (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
+                  GMBUS_SLAVE_READ | GMBUS_SW_RDY);
+       while (len) {
+               int ret;
+               u32 val, loop = 0;
+               u32 gmbus2;
+
+               ret = wait_for((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
+                              (GMBUS_SATOER | GMBUS_HW_RDY),
+                              50);
+               if (ret)
+                       return -ETIMEDOUT;
+               if (gmbus2 & GMBUS_SATOER)
+                       return -ENXIO;
+
+               val = I915_READ(GMBUS3 + reg_offset);
+               do {
+                       *buf++ = val & 0xff;
+                       val >>= 8;
+               } while (--len && ++loop < 4);
+       }
 
-       return true;
+       return 0;
 }
 
 static int
-intel_i2c_quirk_xfer(struct intel_gmbus *bus,
-                    struct i2c_msg *msgs,
-                    int num)
+gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg)
 {
-       struct drm_i915_private *dev_priv = bus->dev_priv;
+       int reg_offset = dev_priv->gpio_mmio_base;
+       u16 len = msg->len;
+       u8 *buf = msg->buf;
+       u32 val, loop;
+
+       val = loop = 0;
+       while (len && loop < 4) {
+               val |= *buf++ << (8 * loop++);
+               len -= 1;
+       }
+
+       I915_WRITE(GMBUS3 + reg_offset, val);
+       I915_WRITE(GMBUS1 + reg_offset,
+                  GMBUS_CYCLE_WAIT |
+                  (msg->len << GMBUS_BYTE_COUNT_SHIFT) |
+                  (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) |
+                  GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
+       while (len) {
+               int ret;
+               u32 gmbus2;
+
+               val = loop = 0;
+               do {
+                       val |= *buf++ << (8 * loop);
+               } while (--len && ++loop < 4);
+
+               I915_WRITE(GMBUS3 + reg_offset, val);
+
+               ret = wait_for((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
+                              (GMBUS_SATOER | GMBUS_HW_RDY),
+                              50);
+               if (ret)
+                       return -ETIMEDOUT;
+               if (gmbus2 & GMBUS_SATOER)
+                       return -ENXIO;
+       }
+       return 0;
+}
+
+/*
+ * The gmbus controller can combine a 1 or 2 byte write with a read that
+ * immediately follows it by using an "INDEX" cycle.
+ */
+static bool
+gmbus_is_index_read(struct i2c_msg *msgs, int i, int num)
+{
+       return (i + 1 < num &&
+               !(msgs[i].flags & I2C_M_RD) && msgs[i].len <= 2 &&
+               (msgs[i + 1].flags & I2C_M_RD));
+}
+
+static int
+gmbus_xfer_index_read(struct drm_i915_private *dev_priv, struct i2c_msg *msgs)
+{
+       int reg_offset = dev_priv->gpio_mmio_base;
+       u32 gmbus1_index = 0;
+       u32 gmbus5 = 0;
        int ret;
 
-       intel_i2c_reset(dev_priv->dev);
+       if (msgs[0].len == 2)
+               gmbus5 = GMBUS_2BYTE_INDEX_EN |
+                        msgs[0].buf[1] | (msgs[0].buf[0] << 8);
+       if (msgs[0].len == 1)
+               gmbus1_index = GMBUS_CYCLE_INDEX |
+                              (msgs[0].buf[0] << GMBUS_SLAVE_INDEX_SHIFT);
 
-       intel_i2c_quirk_set(dev_priv, true);
-       set_data(bus, 1);
-       set_clock(bus, 1);
-       udelay(I2C_RISEFALL_TIME);
+       /* GMBUS5 holds 16-bit index */
+       if (gmbus5)
+               I915_WRITE(GMBUS5 + reg_offset, gmbus5);
 
-       ret = i2c_bit_algo.master_xfer(&bus->adapter, msgs, num);
+       ret = gmbus_xfer_read(dev_priv, &msgs[1], gmbus1_index);
 
-       set_data(bus, 1);
-       set_clock(bus, 1);
-       intel_i2c_quirk_set(dev_priv, false);
+       /* Clear GMBUS5 after each index transfer */
+       if (gmbus5)
+               I915_WRITE(GMBUS5 + reg_offset, 0);
 
        return ret;
 }
@@ -210,117 +331,116 @@ gmbus_xfer(struct i2c_adapter *adapter,
                                               struct intel_gmbus,
                                               adapter);
        struct drm_i915_private *dev_priv = bus->dev_priv;
-       int i, reg_offset, ret;
+       int i, reg_offset;
+       int ret = 0;
+       u32 gmbus0;
 
        mutex_lock(&dev_priv->gmbus_mutex);
 
        if (bus->force_bit) {
-               ret = intel_i2c_quirk_xfer(bus, msgs, num);
+               ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
                goto out;
        }
 
-       reg_offset = HAS_PCH_SPLIT(dev_priv->dev) ? PCH_GMBUS0 - GMBUS0 : 0;
+       reg_offset = dev_priv->gpio_mmio_base;
 
-       I915_WRITE(GMBUS0 + reg_offset, bus->reg0);
+       /* Hack to use 400kHz only for touch i2c devices on ddc ports */
+       gmbus0 = bus->reg0;
+       if (((gmbus0 & GMBUS_PORT_MASK) == GMBUS_PORT_VGADDC &&
+            (msgs[0].addr == 0x4b || msgs[0].addr == 0x67)) ||
+           ((gmbus0 & GMBUS_PORT_MASK) == GMBUS_PORT_PANEL &&
+            (msgs[0].addr == 0x4a || msgs[0].addr == 0x26)))
+               gmbus0 = (gmbus0 & ~GMBUS_RATE_MASK) | GMBUS_RATE_400KHZ;
+       I915_WRITE(GMBUS0 + reg_offset, gmbus0);
 
        for (i = 0; i < num; i++) {
-               u16 len = msgs[i].len;
-               u8 *buf = msgs[i].buf;
-
-               if (msgs[i].flags & I2C_M_RD) {
-                       I915_WRITE(GMBUS1 + reg_offset,
-                                  GMBUS_CYCLE_WAIT |
-                                  (i + 1 == num ? GMBUS_CYCLE_STOP : 0) |
-                                  (len << GMBUS_BYTE_COUNT_SHIFT) |
-                                  (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
-                                  GMBUS_SLAVE_READ | GMBUS_SW_RDY);
-                       POSTING_READ(GMBUS2+reg_offset);
-                       do {
-                               u32 val, loop = 0;
-
-                               if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
-                                       goto timeout;
-                               if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
-                                       goto clear_err;
-
-                               val = I915_READ(GMBUS3 + reg_offset);
-                               do {
-                                       *buf++ = val & 0xff;
-                                       val >>= 8;
-                               } while (--len && ++loop < 4);
-                       } while (len);
+               u32 gmbus2;
+
+               if (gmbus_is_index_read(msgs, i, num)) {
+                       ret = gmbus_xfer_index_read(dev_priv, &msgs[i]);
+                       i += 1;  /* set i to the index of the read xfer */
+               } else if (msgs[i].flags & I2C_M_RD) {
+                       ret = gmbus_xfer_read(dev_priv, &msgs[i], 0);
                } else {
-                       u32 val, loop;
-
-                       val = loop = 0;
-                       do {
-                               val |= *buf++ << (8 * loop);
-                       } while (--len && ++loop < 4);
-
-                       I915_WRITE(GMBUS3 + reg_offset, val);
-                       I915_WRITE(GMBUS1 + reg_offset,
-                                  GMBUS_CYCLE_WAIT |
-                                  (i + 1 == num ? GMBUS_CYCLE_STOP : 0) |
-                                  (msgs[i].len << GMBUS_BYTE_COUNT_SHIFT) |
-                                  (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
-                                  GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
-                       POSTING_READ(GMBUS2+reg_offset);
-
-                       while (len) {
-                               if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))
-                                       goto timeout;
-                               if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
-                                       goto clear_err;
-
-                               val = loop = 0;
-                               do {
-                                       val |= *buf++ << (8 * loop);
-                               } while (--len && ++loop < 4);
-
-                               I915_WRITE(GMBUS3 + reg_offset, val);
-                               POSTING_READ(GMBUS2+reg_offset);
-                       }
+                       ret = gmbus_xfer_write(dev_priv, &msgs[i]);
                }
 
-               if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))
+               if (ret == -ETIMEDOUT)
                        goto timeout;
-               if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER)
+               if (ret == -ENXIO)
+                       goto clear_err;
+
+               ret = wait_for((gmbus2 = I915_READ(GMBUS2 + reg_offset)) &
+                              (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE),
+                              50);
+               if (ret)
+                       goto timeout;
+               if (gmbus2 & GMBUS_SATOER)
                        goto clear_err;
        }
 
-       goto done;
+       /* Generate a STOP condition on the bus. Note that gmbus can't generata
+        * a STOP on the very first cycle. To simplify the code we
+        * unconditionally generate the STOP condition with an additional gmbus
+        * cycle. */
+       I915_WRITE(GMBUS1 + reg_offset, GMBUS_CYCLE_STOP | GMBUS_SW_RDY);
+
+       /* Mark the GMBUS interface as disabled after waiting for idle.
+        * We will re-enable it at the start of the next xfer,
+        * till then let it sleep.
+        */
+       if (wait_for((I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0,
+                    10)) {
+               DRM_DEBUG_KMS("GMBUS [%s] timed out waiting for idle\n",
+                        adapter->name);
+               ret = -ETIMEDOUT;
+       }
+       I915_WRITE(GMBUS0 + reg_offset, 0);
+       ret = ret ?: i;
+       goto out;
 
 clear_err:
+       /*
+        * Wait for bus to IDLE before clearing NAK.
+        * If we clear the NAK while bus is still active, then it will stay
+        * active and the next transaction may fail.
+        */
+       if (wait_for((I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0,
+                    10))
+               DRM_DEBUG_KMS("GMBUS [%s] timed out after NAK\n",
+                             adapter->name);
+
        /* Toggle the Software Clear Interrupt bit. This has the effect
         * of resetting the GMBUS controller and so clearing the
         * BUS_ERROR raised by the slave's NAK.
         */
        I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT);
        I915_WRITE(GMBUS1 + reg_offset, 0);
+       I915_WRITE(GMBUS0 + reg_offset, 0);
 
-done:
-       /* Mark the GMBUS interface as disabled after waiting for idle.
-        * We will re-enable it at the start of the next xfer,
-        * till then let it sleep.
+       DRM_DEBUG_KMS("GMBUS [%s] NAK for addr: %04x %c(%d)\n",
+                        adapter->name, msgs[i].addr,
+                        (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
+
+       /*
+        * If no ACK is received during the address phase of a transaction,
+        * the adapter must report -ENXIO.
+        * It is not clear what to return if no ACK is received at other times.
+        * So, we always return -ENXIO in all NAK cases, to ensure we send
+        * it at least during the one case that is specified.
         */
-       if (wait_for((I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0, 10))
-               DRM_INFO("GMBUS timed out waiting for idle\n");
-       I915_WRITE(GMBUS0 + reg_offset, 0);
-       ret = i;
+       ret = -ENXIO;
        goto out;
 
 timeout:
-       DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",
-                bus->reg0 & 0xff, bus->adapter.name);
+       DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
+                bus->adapter.name, bus->reg0 & 0xff);
        I915_WRITE(GMBUS0 + reg_offset, 0);
 
        /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
-       if (!bus->has_gpio) {
-               ret = -EIO;
-       } else {
-               bus->force_bit = true;
-               ret = intel_i2c_quirk_xfer(bus, msgs, num);
-       }
+       bus->force_bit = true;
+       ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
+
 out:
        mutex_unlock(&dev_priv->gmbus_mutex);
        return ret;
@@ -346,35 +466,26 @@ static const struct i2c_algorithm gmbus_algorithm = {
  */
 int intel_setup_gmbus(struct drm_device *dev)
 {
-       static const char *names[GMBUS_NUM_PORTS] = {
-               "disabled",
-               "ssc",
-               "vga",
-               "panel",
-               "dpc",
-               "dpb",
-               "reserved",
-               "dpd",
-       };
        struct drm_i915_private *dev_priv = dev->dev_private;
        int ret, i;
 
-       dev_priv->gmbus = kcalloc(GMBUS_NUM_PORTS, sizeof(struct intel_gmbus),
-                                 GFP_KERNEL);
-       if (dev_priv->gmbus == NULL)
-               return -ENOMEM;
+       if (HAS_PCH_SPLIT(dev))
+               dev_priv->gpio_mmio_base = PCH_GPIOA - GPIOA;
+       else
+               dev_priv->gpio_mmio_base = 0;
 
        mutex_init(&dev_priv->gmbus_mutex);
 
        for (i = 0; i < GMBUS_NUM_PORTS; i++) {
                struct intel_gmbus *bus = &dev_priv->gmbus[i];
+               u32 port = i + 1; /* +1 to map gmbus index to pin pair */
 
                bus->adapter.owner = THIS_MODULE;
                bus->adapter.class = I2C_CLASS_DDC;
                snprintf(bus->adapter.name,
                         sizeof(bus->adapter.name),
                         "i915 gmbus %s",
-                        names[i]);
+                        gmbus_ports[i].name);
 
                bus->adapter.dev.parent = &dev->pdev->dev;
                bus->dev_priv = dev_priv;
@@ -385,13 +496,9 @@ int intel_setup_gmbus(struct drm_device *dev)
                        goto err;
 
                /* By default use a conservative clock rate */
-               bus->reg0 = i | GMBUS_RATE_100KHZ;
-
-               bus->has_gpio = intel_gpio_setup(bus, i);
+               bus->reg0 = port | GMBUS_RATE_100KHZ;
 
-               /* XXX force bit banging until GMBUS is fully debugged */
-               if (bus->has_gpio)
-                       bus->force_bit = true;
+               intel_gpio_setup(bus, port);
        }
 
        intel_i2c_reset(dev_priv->dev);
@@ -403,11 +510,18 @@ err:
                struct intel_gmbus *bus = &dev_priv->gmbus[i];
                i2c_del_adapter(&bus->adapter);
        }
-       kfree(dev_priv->gmbus);
-       dev_priv->gmbus = NULL;
        return ret;
 }
 
+struct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *dev_priv,
+                                           unsigned port)
+{
+       WARN_ON(!intel_gmbus_is_port_valid(port));
+       /* -1 to map pin pair to gmbus index */
+       return (intel_gmbus_is_port_valid(port)) ?
+               &dev_priv->gmbus[port - 1].adapter : NULL;
+}
+
 void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed)
 {
        struct intel_gmbus *bus = to_intel_gmbus(adapter);
@@ -419,8 +533,7 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
 {
        struct intel_gmbus *bus = to_intel_gmbus(adapter);
 
-       if (bus->has_gpio)
-               bus->force_bit = force_bit;
+       bus->force_bit = force_bit;
 }
 
 void intel_teardown_gmbus(struct drm_device *dev)
@@ -435,7 +548,4 @@ void intel_teardown_gmbus(struct drm_device *dev)
                struct intel_gmbus *bus = &dev_priv->gmbus[i];
                i2c_del_adapter(&bus->adapter);
        }
-
-       kfree(dev_priv->gmbus);
-       dev_priv->gmbus = NULL;
 }
index 9c71183..ec38929 100644 (file)
@@ -851,8 +851,8 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev,
                    child->device_type != DEVICE_TYPE_LFP)
                        continue;
 
-               if (child->i2c_pin)
-                   *i2c_pin = child->i2c_pin;
+               if (intel_gmbus_is_port_valid(child->i2c_pin))
+                       *i2c_pin = child->i2c_pin;
 
                /* However, we cannot trust the BIOS writers to populate
                 * the VBT correctly.  Since LVDS requires additional
@@ -993,7 +993,8 @@ bool intel_lvds_init(struct drm_device *dev)
         * preferred mode is the right one.
         */
        intel_lvds->edid = drm_get_edid(connector,
-                                       &dev_priv->gmbus[pin].adapter);
+                                       intel_gmbus_get_adapter(dev_priv,
+                                                               pin));
        if (intel_lvds->edid) {
                if (drm_add_edid_modes(connector,
                                       intel_lvds->edid)) {
index d1928e7..d67ec3a 100644 (file)
@@ -56,7 +56,8 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus)
                }
        };
 
-       return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 2) == 2;
+       return i2c_transfer(intel_gmbus_get_adapter(dev_priv, ddc_bus),
+                           msgs, 2) == 2;
 }
 
 /**
index 48177ec..3f9249b 100644 (file)
 
 #define PCI_LBPC 0xf4 /* legacy/combination backlight modes */
 
+/* These are used to calculate a reasonable default when firmware has not
+ * configured a maximum PWM frequency, with 200Hz as the current default target.
+ */
+#define DEFAULT_BACKLIGHT_PWM_FREQ   200
+#define BACKLIGHT_REFCLK_DIVISOR     128
+
 void
 intel_fixed_panel_mode(struct drm_display_mode *fixed_mode,
                       struct drm_display_mode *adjusted_mode)
@@ -127,12 +133,32 @@ static int is_backlight_combination_mode(struct drm_device *dev)
        return 0;
 }
 
+static void i915_set_default_max_backlight(struct drm_i915_private *dev_priv)
+{
+       u32 refclk_freq_mhz = 0;
+       u32 max_pwm;
+
+       if (HAS_PCH_SPLIT(dev_priv->dev))
+               refclk_freq_mhz = I915_READ(PCH_RAWCLK_FREQ) & RAWCLK_FREQ_MASK;
+       else if (dev_priv->lvds_use_ssc)
+               refclk_freq_mhz = dev_priv->lvds_ssc_freq;
+
+       max_pwm = refclk_freq_mhz * 1000000 /
+                       (BACKLIGHT_REFCLK_DIVISOR * DEFAULT_BACKLIGHT_PWM_FREQ);
+
+       if (HAS_PCH_SPLIT(dev_priv->dev))
+               dev_priv->saveBLC_PWM_CTL2 = max_pwm << 16;
+       else if (IS_PINEVIEW(dev_priv->dev))
+               dev_priv->saveBLC_PWM_CTL = max_pwm << 17;
+       else
+               dev_priv->saveBLC_PWM_CTL = max_pwm << 16;
+}
+
 static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
 {
        u32 val;
 
-       /* Restore the CTL value if it lost, e.g. GPU reset */
-
+       /* Restore the CTL value if it was lost, e.g. GPU reset */
        if (HAS_PCH_SPLIT(dev_priv->dev)) {
                val = I915_READ(BLC_PWM_PCH_CTL2);
                if (dev_priv->saveBLC_PWM_CTL2 == 0) {
@@ -166,11 +192,11 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
 
        max = i915_read_blc_pwm_ctl(dev_priv);
        if (max == 0) {
-               /* XXX add code here to query mode clock or hardware clock
-                * and program max PWM appropriately.
+               /* If backlight PWM registers have not been set, set them to
+                * default backlight PWM settings.
                 */
-               printk_once(KERN_WARNING "fixme: max PWM is zero.\n");
-               return 1;
+               i915_set_default_max_backlight(dev_priv);
+               max = i915_read_blc_pwm_ctl(dev_priv);
        }
 
        if (HAS_PCH_SPLIT(dev)) {
index 62892a8..60ff6f0 100644 (file)
@@ -290,9 +290,9 @@ static int init_ring_common(struct intel_ring_buffer *ring)
                        | RING_VALID);
 
        /* If the head is still not zero, the ring is dead */
-       if ((I915_READ_CTL(ring) & RING_VALID) == 0 ||
-           I915_READ_START(ring) != obj->gtt_offset ||
-           (I915_READ_HEAD(ring) & HEAD_ADDR) != 0) {
+       if (wait_for((I915_READ_CTL(ring) & RING_VALID) != 0 &&
+                    I915_READ_START(ring) == obj->gtt_offset &&
+                    (I915_READ_HEAD(ring) & HEAD_ADDR) == 0, 50)) {
                DRM_ERROR("%s initialization failed "
                                "ctl %08x head %08x tail %08x start %08x\n",
                                ring->name,
index ae5e748..2381501 100644 (file)
@@ -1260,7 +1260,8 @@ intel_sdvo_get_analog_edid(struct drm_connector *connector)
        struct drm_i915_private *dev_priv = connector->dev->dev_private;
 
        return drm_get_edid(connector,
-                           &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter);
+                           intel_gmbus_get_adapter(dev_priv,
+                                                   dev_priv->crt_ddc_pin));
 }
 
 enum drm_connector_status
@@ -1928,12 +1929,12 @@ intel_sdvo_select_i2c_bus(struct drm_i915_private *dev_priv,
        if (mapping->initialized)
                pin = mapping->i2c_pin;
 
-       if (pin < GMBUS_NUM_PORTS) {
-               sdvo->i2c = &dev_priv->gmbus[pin].adapter;
+       if (intel_gmbus_is_port_valid(pin)) {
+               sdvo->i2c = intel_gmbus_get_adapter(dev_priv, pin);
                intel_gmbus_set_speed(sdvo->i2c, GMBUS_RATE_1MHZ);
                intel_gmbus_force_bit(sdvo->i2c, true);
        } else {
-               sdvo->i2c = &dev_priv->gmbus[GMBUS_PORT_DPB].adapter;
+               sdvo->i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
        }
 }
 
index 299d238..be1cae4 100644 (file)
@@ -451,15 +451,13 @@ static const struct hid_device_id apple_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_JIS),
                .driver_data = APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
+               .driver_data = APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
-                       APPLE_ISO_KEYBOARD },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2011_ISO),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
-                       APPLE_ISO_KEYBOARD },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
+               .driver_data = APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI),
                .driver_data = APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO),
@@ -515,12 +513,11 @@ static const struct hid_device_id apple_devices[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING5A_JIS),
                .driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ANSI),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
+               .driver_data = APPLE_HAS_FN },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_ISO),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN |
-                       APPLE_ISO_KEYBOARD },
+               .driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
        { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_2009_JIS),
-               .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
+               .driver_data = APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
                .driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
        { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
index ae2945a..02cab60 100644 (file)
   Block process call transaction   no
   I2C block read transaction       yes  (doesn't use the block buffer)
   Slave mode                       no
+  Interrupt processing             yes
 
   See the file Documentation/i2c/busses/i2c-i801 for details.
 */
 
+#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/kernel.h>
@@ -91,6 +93,7 @@
 
 /* PCI Address Constants */
 #define SMBBAR         4
+#define SMBPCISTS      0x006
 #define SMBHSTCFG      0x040
 
 /* Host configuration bits for SMBHSTCFG */
 #define SMBHSTCFG_SMB_SMI_EN   2
 #define SMBHSTCFG_I2C_EN       4
 
+/* Host status bits for SMBHSTSTS */
+#define SMBPCISTS_INTS         8
+
 /* Auxiliary control register bits, ICH4+ only */
 #define SMBAUXCTL_CRC          1
 #define SMBAUXCTL_E32B         2
 
 /* Other settings */
 #define MAX_RETRIES            400
-#define ENABLE_INT9            0       /* set to 0x01 to enable - untested */
 
 /* I801 command constants */
 #define I801_QUICK             0x00
 #define I801_PROC_CALL         0x10    /* unimplemented */
 #define I801_BLOCK_DATA                0x14
 #define I801_I2C_BLOCK_DATA    0x18    /* ICH5 and later */
-#define I801_BLOCK_LAST                0x34
-#define I801_I2C_BLOCK_LAST    0x38    /* ICH5 and later */
+
+/* I801 Hosts Control register bits */
+#define I801_INTREN            0x01
+#define I801_KILL              0x02
+#define I801_LAST_BYTE         0x20    /* ICH5 and later */
 #define I801_START             0x40
 #define I801_PEC_EN            0x80    /* ICH3 and later */
 
                                 SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \
                                 SMBHSTSTS_INTR)
 
+#define STATUS_RESULT_FLAGS    (SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \
+                                SMBHSTSTS_DEV_ERR | SMBHSTSTS_INTR)
+
 /* Older devices have their ID defined in <linux/pci_ids.h> */
 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS  0x1c22
 #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS     0x1d22
@@ -154,6 +165,18 @@ struct i801_priv {
        unsigned char original_hstcfg;
        struct pci_dev *pci_dev;
        unsigned int features;
+
+       /* isr processing */
+       wait_queue_head_t waitq;
+       spinlock_t lock;
+       u8 status;
+
+       /* Command state used during by isr */
+       u8 cmd;
+       bool is_read;
+       int count;
+       int len;
+       u8 *data;
 };
 
 static struct pci_driver i801_driver;
@@ -162,6 +185,7 @@ static struct pci_driver i801_driver;
 #define FEATURE_BLOCK_BUFFER   (1 << 1)
 #define FEATURE_BLOCK_PROC     (1 << 2)
 #define FEATURE_I2C_BLOCK_READ (1 << 3)
+#define FEATURE_IRQ            (1 << 4)
 /* Not really a feature, but it's convenient to handle it as such */
 #define FEATURE_IDF            (1 << 15)
 
@@ -170,6 +194,7 @@ static const char *i801_feature_names[] = {
        "Block buffer",
        "Block process call",
        "I2C block read",
+       "Interrupt"
 };
 
 static unsigned int disable_features;
@@ -210,7 +235,12 @@ static int i801_check_post(struct i801_priv *priv, int status, int timeout)
 {
        int result = 0;
 
-       /* If the SMBus is still busy, we give up */
+       /*
+        * If the SMBus is still busy, we give up
+        * Note: This timeout condition only happens when using polling
+        * transactions.  For interrupt operation, NAK/timeout is indicated by
+        * DEV_ERR.
+        */
        if (timeout) {
                dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
                /* try to stop the current command */
@@ -268,8 +298,15 @@ static int i801_transaction(struct i801_priv *priv, int xact)
        if (result < 0)
                return result;
 
+       if (priv->features & FEATURE_IRQ) {
+               outb(xact | I801_INTREN | I801_START, SMBHSTCNT(priv));
+               wait_event(priv->waitq, (status = priv->status));
+               priv->status = 0;
+               return i801_check_post(priv, status, 0);
+       }
+
        /* the current contents of SMBHSTCNT can be overwritten, since PEC,
-        * INTREN, SMBSCMD are passed in xact */
+        * SMBSCMD are passed in xact */
        outb_p(xact | I801_START, SMBHSTCNT(priv));
 
        /* We will always wait for a fraction of a second! */
@@ -283,6 +320,7 @@ static int i801_transaction(struct i801_priv *priv, int xact)
                return result;
 
        outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
+
        return 0;
 }
 
@@ -321,8 +359,8 @@ static int i801_block_transaction_by_block(struct i801_priv *priv,
                        outb_p(data->block[i+1], SMBBLKDAT(priv));
        }
 
-       status = i801_transaction(priv, I801_BLOCK_DATA | ENABLE_INT9 |
-                                 I801_PEC_EN * hwpec);
+       status = i801_transaction(priv, I801_BLOCK_DATA |
+                                 (hwpec ? I801_PEC_EN : 0));
        if (status)
                return status;
 
@@ -338,6 +376,75 @@ static int i801_block_transaction_by_block(struct i801_priv *priv,
        return 0;
 }
 
+/*
+ * There are two kinds of interrupts:
+ *
+ * (1) i801 signals transaction completion with one of these interrupts:
+ *   INTR - Success
+ *   DEV_ERR - Invalid command, NAK or communication timeout
+ *   BUS_ERR - SMI# transaction collision
+ *   FAILED - transaction was canceled due to a KILL request
+ * When any of these occur, update ->status and wake up the waitq.
+ * ->status must be cleared before kicking off the next transaction.
+ *
+* (2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
+*     occurs for each byte of a byte-by-byte to prepare the next byte.
+ */
+static irqreturn_t i801_isr(int irq, void *dev_id)
+{
+       struct i801_priv *priv = dev_id;
+       u8 pcists, hststs;
+       u8 cmd;
+
+       /* Confirm this is our interrupt */
+       pci_read_config_byte(priv->pci_dev, SMBPCISTS, &pcists);
+       if (!(pcists & SMBPCISTS_INTS)) {
+               dev_dbg(&priv->pci_dev->dev, "irq: pcists.ints not set\n");
+               return IRQ_NONE;
+       }
+
+       hststs = inb(SMBHSTSTS(priv));
+       dev_dbg(&priv->pci_dev->dev, "irq: hststs = %02x\n", hststs);
+
+       if (hststs & SMBHSTSTS_BYTE_DONE) {
+               if (priv->is_read) {
+                       priv->data[priv->count++] = inb(SMBBLKDAT(priv));
+
+                       /* Set LAST_BYTE for last byte of read transaction */
+                       cmd = priv->cmd;
+                       if (priv->count == priv->len - 1)
+                               cmd |= I801_LAST_BYTE;
+                       outb_p(cmd | I801_START, SMBHSTCNT(priv));
+               } else if (priv->count < priv->len - 1) {
+                       outb(priv->data[++priv->count], SMBBLKDAT(priv));
+                       outb_p(priv->cmd | I801_START, SMBHSTCNT(priv));
+               }
+
+               /* Clear BYTE_DONE to start next transaction. */
+               outb(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
+
+               /* Clear BYTE_DONE so it does not wake_up waitq */
+               hststs &= ~SMBHSTSTS_BYTE_DONE;
+       }
+
+       /*
+        * Clear irq sources and report transaction result.
+        * ->status must be cleared before the next transaction is started.
+        */
+       hststs &= STATUS_RESULT_FLAGS;
+       if (hststs) {
+               outb(hststs, SMBHSTSTS(priv));
+               priv->status |= hststs;
+               wake_up(&priv->waitq);
+       }
+
+       return IRQ_HANDLED;
+}
+
+/*
+ * i2c write uses cmd=I801_BLOCK_DATA, I2C_EN=1
+ * i2c read uses cmd=I801_I2C_BLOCK_DATA
+ */
 static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
                                               union i2c_smbus_data *data,
                                               char read_write, int command,
@@ -360,20 +467,32 @@ static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
                outb_p(data->block[1], SMBBLKDAT(priv));
        }
 
+       if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
+           read_write == I2C_SMBUS_READ)
+               smbcmd = I801_I2C_BLOCK_DATA;
+       else
+               smbcmd = I801_BLOCK_DATA;
+
+       if (priv->features & FEATURE_IRQ) {
+               priv->is_read = (read_write == I2C_SMBUS_READ);
+               if (len == 1 && priv->is_read)
+                       smbcmd |= I801_LAST_BYTE;
+               priv->cmd = smbcmd | I801_INTREN;
+               priv->len = len;
+               priv->count = 0;
+               priv->data = &data->block[1];
+
+               outb(priv->cmd | I801_START, SMBHSTCNT(priv));
+               wait_event(priv->waitq, (status = priv->status));
+               priv->status = 0;
+               return i801_check_post(priv, status, 0);
+       }
+
        for (i = 1; i <= len; i++) {
-               if (i == len && read_write == I2C_SMBUS_READ) {
-                       if (command == I2C_SMBUS_I2C_BLOCK_DATA)
-                               smbcmd = I801_I2C_BLOCK_LAST;
-                       else
-                               smbcmd = I801_BLOCK_LAST;
-               } else {
-                       if (command == I2C_SMBUS_I2C_BLOCK_DATA
-                        && read_write == I2C_SMBUS_READ)
-                               smbcmd = I801_I2C_BLOCK_DATA;
-                       else
-                               smbcmd = I801_BLOCK_DATA;
-               }
-               outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv));
+               if (i == len && read_write == I2C_SMBUS_READ)
+                       smbcmd |= I801_LAST_BYTE;
+               
+               outb_p(smbcmd, SMBHSTCNT(priv));
 
                if (i == 1)
                        outb_p(inb(SMBHSTCNT(priv)) | I801_START,
@@ -564,7 +683,7 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr,
                ret = i801_block_transaction(priv, data, read_write, size,
                                             hwpec);
        else
-               ret = i801_transaction(priv, xact | ENABLE_INT9);
+               ret = i801_transaction(priv, xact);
 
        /* Some BIOSes don't like it when PEC is enabled at reboot or resume
           time, so we forcibly disable it after every transaction. Turn off
@@ -799,6 +918,10 @@ static int __devinit i801_probe(struct pci_dev *dev,
                break;
        }
 
+       /* IRQ processing only tested on CougarPoint PCH */
+       if (dev->device == PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS)
+               priv->features |= FEATURE_IRQ;
+
        /* Disable features on user request */
        for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
                if (priv->features & disable_features & (1 << i))
@@ -873,8 +996,24 @@ static int __devinit i801_probe(struct pci_dev *dev,
        i801_probe_optional_slaves(priv);
 
        pci_set_drvdata(dev, priv);
+
+       if (priv->features & FEATURE_IRQ) {
+               init_waitqueue_head(&priv->waitq);
+               spin_lock_init(&priv->lock);
+
+               err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
+                                 i801_driver.name, priv);
+               if (err) {
+                       dev_err(&dev->dev, "Failed to allocate irq %d: %d",
+                               dev->irq, err);
+                       goto exit_del_adapter;
+               }
+       }
        return 0;
 
+exit_del_adapter:
+       pci_set_drvdata(dev, NULL);
+       i2c_del_adapter(&priv->adapter);
 exit_release:
        pci_release_region(dev, SMBBAR);
 exit:
@@ -886,6 +1025,9 @@ static void __devexit i801_remove(struct pci_dev *dev)
 {
        struct i801_priv *priv = pci_get_drvdata(dev);
 
+       if (priv->features & FEATURE_IRQ)
+               free_irq(dev->irq, priv);
+
        i2c_del_adapter(&priv->adapter);
        pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
        pci_release_region(dev, SMBBAR);
index 9b8db82..6a24d29 100644 (file)
@@ -339,4 +339,13 @@ config MOUSE_SYNAPTICS_USB
          To compile this driver as a module, choose M here: the
          module will be called synaptics_usb.
 
+config MOUSE_CYAPA
+       tristate "Cypress APA I2C Touchpad support"
+       depends on I2C
+       help
+         Say y here if you have a Cypress APA I2C Touchpad.
+
+         To compile this driver as a module, choose M here: the module will be
+         called cyapa.
+
 endif
index 4718eff..3a70b3c 100644 (file)
@@ -8,6 +8,7 @@ obj-$(CONFIG_MOUSE_AMIGA)               += amimouse.o
 obj-$(CONFIG_MOUSE_APPLETOUCH)         += appletouch.o
 obj-$(CONFIG_MOUSE_ATARI)              += atarimouse.o
 obj-$(CONFIG_MOUSE_BCM5974)            += bcm5974.o
+obj-$(CONFIG_MOUSE_CYAPA)              += cyapa.o
 obj-$(CONFIG_MOUSE_GPIO)               += gpio_mouse.o
 obj-$(CONFIG_MOUSE_INPORT)             += inport.o
 obj-$(CONFIG_MOUSE_LOGIBM)             += logibm.o
diff --git a/drivers/input/mouse/cyapa.c b/drivers/input/mouse/cyapa.c
new file mode 100644 (file)
index 0000000..d912448
--- /dev/null
@@ -0,0 +1,1858 @@
+/*
+ * Cypress APA trackpad with I2C interface
+ *
+ * Author: Dudley Du <dudl@cypress.com>
+ *
+ * Copyright (C) 2011 Cypress Semiconductor, Inc.
+ * Copyright (C) 2011 Google, Inc.
+ *
+ * Based on synaptics_i2c driver:
+ *   Copyright (C) 2009 Compulab, Ltd.
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License.  See the file COPYING in the main directory of this archive for
+ * more details.
+ */
+
+
+#include <linux/debugfs.h>
+#include <linux/delay.h>
+#include <linux/firmware.h>
+#include <linux/gpio.h>
+#include <linux/i2c.h>
+#include <linux/input.h>
+#include <linux/input/mt.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/semaphore.h>
+#include <linux/slab.h>
+#include <linux/uaccess.h>
+
+/* APA trackpad firmware generation */
+enum cyapa_gen {
+       CYAPA_GEN1 = 0x01,  /* only one finger supported. */
+       CYAPA_GEN2 = 0x02,  /* max five fingers supported. */
+       CYAPA_GEN3 = 0x03,  /* support MT-protocol B with tracking ID. */
+};
+
+/* commands for read/write registers of Cypress trackpad */
+#define CYAPA_CMD_SOFT_RESET       0x00
+#define CYAPA_CMD_POWER_MODE       0x01
+#define CYAPA_CMD_DEV_STATUS       0x02
+#define CYAPA_CMD_GROUP_DATA       0x03
+#define CYAPA_CMD_GROUP_CTRL       0x04
+#define CYAPA_CMD_GROUP_CMD        0x05
+#define CYAPA_CMD_GROUP_QUERY      0x06
+#define CYAPA_CMD_BL_STATUS        0x07
+#define CYAPA_CMD_BL_HEAD          0x08
+#define CYAPA_CMD_BL_CMD           0x09
+#define CYAPA_CMD_BL_DATA          0x0A
+#define CYAPA_CMD_BL_ALL           0x0B
+#define CYAPA_CMD_BLK_PRODUCT_ID   0x0C
+#define CYAPA_CMD_BLK_HEAD         0x0D
+
+/* report data start reg offset address. */
+#define DATA_REG_START_OFFSET  0x0000
+
+#define BL_HEAD_OFFSET 0x00
+#define BL_DATA_OFFSET 0x10
+
+/*
+ * bit 7: Valid interrupt source
+ * bit 6 - 4: Reserved
+ * bit 3 - 2: Power status
+ * bit 1 - 0: Device status
+ */
+#define REG_OP_STATUS     0x00
+#define OP_STATUS_SRC     0x80
+#define OP_STATUS_POWER   0x0C
+#define OP_STATUS_DEV     0x03
+#define OP_STATUS_MASK (OP_STATUS_SRC | OP_STATUS_POWER | OP_STATUS_DEV)
+
+/*
+ * bit 7 - 4: Number of touched finger
+ * bit 3: Valid data
+ * bit 2: Middle Physical Button
+ * bit 1: Right Physical Button
+ * bit 0: Left physical Button
+ */
+#define REG_OP_DATA1       0x01
+#define OP_DATA_VALID      0x08
+#define OP_DATA_MIDDLE_BTN 0x04
+#define OP_DATA_RIGHT_BTN  0x02
+#define OP_DATA_LEFT_BTN   0x01
+#define OP_DATA_BTN_MASK (OP_DATA_MIDDLE_BTN | OP_DATA_RIGHT_BTN | OP_DATA_LEFT_BTN)
+
+/*
+ * bit 7: Busy
+ * bit 6 - 5: Reserved
+ * bit 4: Bootloader running
+ * bit 3 - 1: Reserved
+ * bit 0: Checksum valid
+ */
+#define REG_BL_STATUS        0x01
+#define BL_STATUS_BUSY       0x80
+#define BL_STATUS_RUNNING    0x10
+#define BL_STATUS_DATA_VALID 0x08
+#define BL_STATUS_CSUM_VALID 0x01
+/*
+ * bit 7: Invalid
+ * bit 6: Invalid security key
+ * bit 5: Bootloading
+ * bit 4: Command checksum
+ * bit 3: Flash protection error
+ * bit 2: Flash checksum error
+ * bit 1 - 0: Reserved
+ */
+#define REG_BL_ERROR         0x02
+#define BL_ERROR_INVALID     0x80
+#define BL_ERROR_INVALID_KEY 0x40
+#define BL_ERROR_BOOTLOADING 0x20
+#define BL_ERROR_CMD_CSUM    0x10
+#define BL_ERROR_FLASH_PROT  0x08
+#define BL_ERROR_FLASH_CSUM  0x04
+
+#define REG_BL_KEY1 0x0D
+#define REG_BL_KEY2 0x0E
+#define REG_BL_KEY3 0x0F
+#define BL_KEY1 0xC0
+#define BL_KEY2 0xC1
+#define BL_KEY3 0xC2
+
+#define BL_STATUS_SIZE  3  /* length of bootloader status registers */
+#define BLK_HEAD_BYTES 32
+
+/* Macro for register map group offset. */
+#define CYAPA_REG_MAP_SIZE  256
+
+#define PRODUCT_ID_SIZE  16
+#define QUERY_DATA_SIZE  27
+#define REG_PROTOCOL_GEN_QUERY_OFFSET  20
+
+#define REG_OFFSET_DATA_BASE     0x0000
+#define REG_OFFSET_CONTROL_BASE  0x0000
+#define REG_OFFSET_COMMAND_BASE  0x0028
+#define REG_OFFSET_QUERY_BASE    0x002A
+
+#define CYAPA_OFFSET_SOFT_RESET  REG_OFFSET_COMMAND_BASE
+
+#define REG_OFFSET_POWER_MODE (REG_OFFSET_COMMAND_BASE + 1)
+#define SET_POWER_MODE_DELAY   10000  /* unit: us */
+#define SET_POWER_MODE_TRIES   5
+
+#define PWR_MODE_MASK   0xFC
+#define PWR_MODE_FULL_ACTIVE (0x3F << 2)
+#define PWR_MODE_IDLE        (0x05 << 2) /* default sleep time is 50 ms. */
+#define PWR_MODE_BTN_ONLY    (0x01 << 2)
+#define PWR_MODE_OFF         (0x00 << 2)
+
+#define BTN_ONLY_MODE_NAME   "buttononly"
+
+#define PWR_STATUS_MASK      0x0C
+#define PWR_STATUS_ACTIVE    (0x03 << 2)
+#define PWR_STATUS_IDLE      (0x02 << 2)
+#define PWR_STATUS_BTN_ONLY  (0x01 << 2)
+#define PWR_STATUS_OFF       (0x00 << 2)
+
+/*
+ * CYAPA trackpad device states.
+ * Used in register 0x00, bit1-0, DeviceStatus field.
+ * After trackpad boots, and can report data, it sets this value.
+ * Other values indicate device is in an abnormal state and must be reset.
+ */
+#define CYAPA_DEV_NORMAL  0x03
+
+enum cyapa_state {
+       CYAPA_STATE_OP,
+       CYAPA_STATE_BL_IDLE,
+       CYAPA_STATE_BL_ACTIVE,
+       CYAPA_STATE_BL_BUSY,
+       CYAPA_STATE_NO_DEVICE,
+};
+
+
+struct cyapa_touch {
+       /*
+        * high bits or x/y position value
+        * bit 7 - 4: high 4 bits of x position value
+        * bit 3 - 0: high 4 bits of y position value
+        */
+       u8 xy;
+       u8 x;  /* low 8 bits of x position value. */
+       u8 y;  /* low 8 bits of y position value. */
+       u8 pressure;
+       /* id range is 1 - 15.  It is incremented with every new touch. */
+       u8 id;
+} __packed;
+
+/* The touch.id is used as the MT slot id, thus max MT slot is 15 */
+#define CYAPA_MAX_MT_SLOTS  15
+
+/* CYAPA reports up to 5 touches per packet. */
+#define CYAPA_MAX_TOUCHES  5
+
+struct cyapa_reg_data {
+       /*
+        * bit 0 - 1: device status
+        * bit 3 - 2: power mode
+        * bit 6 - 4: reserved
+        * bit 7: interrupt valid bit
+        */
+       u8 device_status;
+       /*
+        * bit 7 - 4: number of fingers currently touching pad
+        * bit 3: valid data check bit
+        * bit 2: middle mechanism button state if exists
+        * bit 1: right mechanism button state if exists
+        * bit 0: left mechanism button state if exists
+        */
+       u8 finger_btn;
+       struct cyapa_touch touches[CYAPA_MAX_TOUCHES];
+} __packed;
+
+/* The main device structure */
+struct cyapa {
+       enum cyapa_state state;
+
+       struct i2c_client       *client;
+       struct input_dev        *input;
+       int irq;
+       u8 adapter_func;
+       bool irq_wake;  /* irq wake is enabled */
+       bool smbus;
+
+       /* power mode settings */
+       u8 suspend_power_mode;
+
+       /* read from query data region. */
+       char product_id[16];
+       u8 capability[14];
+       u8 fw_maj_ver;  /* firmware major version. */
+       u8 fw_min_ver;  /* firmware minor version. */
+       u8 hw_maj_ver;  /* hardware major version. */
+       u8 hw_min_ver;  /* hardware minor version. */
+       enum cyapa_gen gen;
+       int max_abs_x;
+       int max_abs_y;
+       int physical_size_x;
+       int physical_size_y;
+
+       struct mutex debugfs_mutex;
+
+       /* per-instance debugfs root */
+       struct dentry *dentry_dev;
+
+       /* Buffer to store firmware read using debugfs */
+       u8 *read_fw_image;
+};
+
+static const u8 bl_activate[] = { 0x00, 0xFF, 0x38, 0x00, 0x01, 0x02, 0x03,
+               0x04, 0x05, 0x06, 0x07 };
+static const u8 bl_deactivate[] = { 0x00, 0xFF, 0x3B, 0x00, 0x01, 0x02, 0x03,
+               0x04, 0x05, 0x06, 0x07 };
+static const u8 bl_exit[] = { 0x00, 0xFF, 0xA5, 0x00, 0x01, 0x02, 0x03, 0x04,
+               0x05, 0x06, 0x07 };
+
+/* global root node of the cyapa debugfs directory. */
+static struct dentry *cyapa_debugfs_root;
+
+struct cyapa_cmd_len {
+       unsigned char cmd;
+       unsigned char len;
+};
+
+#define CYAPA_ADAPTER_FUNC_NONE   0
+#define CYAPA_ADAPTER_FUNC_I2C    1
+#define CYAPA_ADAPTER_FUNC_SMBUS  2
+#define CYAPA_ADAPTER_FUNC_BOTH   3
+
+#define CYTP_I2C 0
+#define CYTP_SMBUS 1
+
+/*
+ * macros for SMBus communication
+ */
+#define SMBUS_READ   0x01
+#define SMBUS_WRITE 0x00
+#define SMBUS_ENCODE_IDX(cmd, idx) ((cmd) | (((idx) & 0x03) << 1))
+#define SMBUS_ENCODE_RW(cmd, rw) ((cmd) | ((rw) & 0x01))
+#define SMBUS_BYTE_BLOCK_CMD_MASK 0x80
+#define SMBUS_GROUP_BLOCK_CMD_MASK 0x40
+
+ /* for byte read/write command */
+#define CMD_RESET 0
+#define CMD_POWER_MODE 1
+#define CMD_DEV_STATUS 2
+#define SMBUS_BYTE_CMD(cmd) (((cmd) & 0x3F) << 1)
+#define CYAPA_SMBUS_RESET SMBUS_BYTE_CMD(CMD_RESET)
+#define CYAPA_SMBUS_POWER_MODE SMBUS_BYTE_CMD(CMD_POWER_MODE)
+#define CYAPA_SMBUS_DEV_STATUS SMBUS_BYTE_CMD(CMD_DEV_STATUS)
+
+ /* for group registers read/write command */
+#define REG_GROUP_DATA 0
+#define REG_GROUP_CTRL 1
+#define REG_GROUP_CMD 2
+#define REG_GROUP_QUERY 3
+#define SMBUS_GROUP_CMD(grp) (0x80 | (((grp) & 0x07) << 3))
+#define CYAPA_SMBUS_GROUP_DATA SMBUS_GROUP_CMD(REG_GROUP_DATA)
+#define CYAPA_SMBUS_GROUP_CTRL SMBUS_GROUP_CMD(REG_GROUP_CTRL)
+#define CYAPA_SMBUS_GROUP_CMD SMBUS_GROUP_CMD(REG_GROUP_CMD)
+#define CYAPA_SMBUS_GROUP_QUERY SMBUS_GROUP_CMD(REG_GROUP_QUERY)
+
+ /* for register block read/write command */
+#define CMD_BL_STATUS 0
+#define CMD_BL_HEAD 1
+#define CMD_BL_CMD 2
+#define CMD_BL_DATA 3
+#define CMD_BL_ALL 4
+#define CMD_BLK_PRODUCT_ID 5
+#define CMD_BLK_HEAD 6
+#define SMBUS_BLOCK_CMD(cmd) (0xC0 | (((cmd) & 0x1F) << 1))
+/* register block read/write command in bootloader mode */
+#define CYAPA_SMBUS_BL_STATUS SMBUS_BLOCK_CMD(CMD_BL_STATUS)
+#define CYAPA_SMBUS_BL_HEAD SMBUS_BLOCK_CMD(CMD_BL_HEAD)
+#define CYAPA_SMBUS_BL_CMD SMBUS_BLOCK_CMD(CMD_BL_CMD)
+#define CYAPA_SMBUS_BL_DATA SMBUS_BLOCK_CMD(CMD_BL_DATA)
+#define CYAPA_SMBUS_BL_ALL SMBUS_BLOCK_CMD(CMD_BL_ALL)
+/* register block read/write command in operational mode */
+#define CYAPA_SMBUS_BLK_PRODUCT_ID SMBUS_BLOCK_CMD(CMD_BLK_PRODUCT_ID)
+#define CYAPA_SMBUS_BLK_HEAD SMBUS_BLOCK_CMD(CMD_BLK_HEAD)
+
+static const struct cyapa_cmd_len cyapa_i2c_cmds[] = {
+       {CYAPA_OFFSET_SOFT_RESET, 1},
+       {REG_OFFSET_COMMAND_BASE + 1, 1},
+       {REG_OFFSET_DATA_BASE, 1},
+       {REG_OFFSET_DATA_BASE, sizeof(struct cyapa_reg_data)},
+       {REG_OFFSET_CONTROL_BASE, 0},
+       {REG_OFFSET_COMMAND_BASE, 0},
+       {REG_OFFSET_QUERY_BASE, QUERY_DATA_SIZE},
+       {BL_HEAD_OFFSET, 3},
+       {BL_HEAD_OFFSET, 16},
+       {BL_HEAD_OFFSET, 16},
+       {BL_DATA_OFFSET, 16},
+       {BL_HEAD_OFFSET, 32},
+       {REG_OFFSET_QUERY_BASE, PRODUCT_ID_SIZE},
+       {REG_OFFSET_DATA_BASE, 32}
+};
+
+static const struct cyapa_cmd_len cyapa_smbus_cmds[] = {
+       {CYAPA_SMBUS_RESET, 1},
+       {CYAPA_SMBUS_POWER_MODE, 1},
+       {CYAPA_SMBUS_DEV_STATUS, 1},
+       {CYAPA_SMBUS_GROUP_DATA, sizeof(struct cyapa_reg_data)},
+       {CYAPA_SMBUS_GROUP_CTRL, 0},
+       {CYAPA_SMBUS_GROUP_CMD, 2},
+       {CYAPA_SMBUS_GROUP_QUERY, QUERY_DATA_SIZE},
+       {CYAPA_SMBUS_BL_STATUS, 3},
+       {CYAPA_SMBUS_BL_HEAD, 16},
+       {CYAPA_SMBUS_BL_CMD, 16},
+       {CYAPA_SMBUS_BL_DATA, 16},
+       {CYAPA_SMBUS_BL_ALL, 32},
+       {CYAPA_SMBUS_BLK_PRODUCT_ID, PRODUCT_ID_SIZE},
+       {CYAPA_SMBUS_BLK_HEAD, 16},
+};
+
+#define CYAPA_DEBUGFS_READ_FW  "read_fw"
+#define CYAPA_FW_NAME          "cyapa.bin"
+#define CYAPA_FW_BLOCK_SIZE    64
+#define CYAPA_FW_READ_SIZE     16
+#define CYAPA_FW_HDR_START     0x0780
+#define CYAPA_FW_HDR_BLOCK_COUNT  2
+#define CYAPA_FW_HDR_BLOCK_START  (CYAPA_FW_HDR_START / CYAPA_FW_BLOCK_SIZE)
+#define CYAPA_FW_HDR_SIZE      (CYAPA_FW_HDR_BLOCK_COUNT * \
+                                CYAPA_FW_BLOCK_SIZE)
+#define CYAPA_FW_DATA_START    0x0800
+#define CYAPA_FW_DATA_BLOCK_COUNT  480
+#define CYAPA_FW_DATA_BLOCK_START  (CYAPA_FW_DATA_START / CYAPA_FW_BLOCK_SIZE)
+#define CYAPA_FW_DATA_SIZE     (CYAPA_FW_DATA_BLOCK_COUNT * \
+                                CYAPA_FW_BLOCK_SIZE)
+#define CYAPA_FW_SIZE          (CYAPA_FW_HDR_SIZE + CYAPA_FW_DATA_SIZE)
+#define CYAPA_CMD_LEN          16
+
+static void cyapa_detect(struct cyapa *cyapa);
+
+#define BYTE_PER_LINE  8
+void cyapa_dump_data(struct cyapa *cyapa, size_t length, const u8 *data)
+{
+       struct device *dev = &cyapa->client->dev;
+       int i;
+       char buf[BYTE_PER_LINE * 3 + 1];
+       char *s = buf;
+
+       for (i = 0; i < length; i++) {
+               s += sprintf(s, " %02x", data[i]);
+               if ((i + 1) == length || ((i + 1) % BYTE_PER_LINE) == 0) {
+                       dev_dbg(dev, "%s\n", buf);
+                       s = buf;
+               }
+       }
+}
+#undef BYTE_PER_LINE
+
+/*
+ * cyapa_i2c_reg_read_block - read a block of data from device i2c registers
+ * @cyapa  - private data structure of driver
+ * @reg    - register at which to start reading
+ * @length - length of block to read, in bytes
+ * @values - buffer to store values read from registers
+ *
+ * Returns negative errno, else number of bytes read.
+ *
+ * Note: The trackpad register block is 256 bytes.
+ */
+static ssize_t cyapa_i2c_reg_read_block(struct cyapa *cyapa, u8 reg, size_t len,
+                                       u8 *values)
+{
+       struct device *dev = &cyapa->client->dev;
+       ssize_t ret;
+
+       ret = i2c_smbus_read_i2c_block_data(cyapa->client, reg, len, values);
+       dev_dbg(dev, "i2c read block reg: 0x%02x len: %zu ret: %zd\n",
+               reg, len, ret);
+       if (ret > 0)
+               cyapa_dump_data(cyapa, ret, values);
+
+       return ret;
+}
+
+/*
+ * cyapa_i2c_reg_write_block - write a block of data to device i2c registers
+ * @cyapa  - private data structure of driver
+ * @reg    - register at which to start writing
+ * @length - length of block to write, in bytes
+ * @values - buffer to write to i2c registers
+ *
+ * Returns 0 on success, else negative errno on failure.
+ *
+ * Note: The trackpad register block is 256 bytes.
+ */
+static ssize_t cyapa_i2c_reg_write_block(struct cyapa *cyapa, u8 reg,
+                                        size_t len, const u8 *values)
+{
+       struct device *dev = &cyapa->client->dev;
+       ssize_t ret;
+
+       ret = i2c_smbus_write_i2c_block_data(cyapa->client, reg, len, values);
+       dev_dbg(dev, "i2c write block reg: 0x%02x len: %zu ret: %zd\n",
+               reg, len, ret);
+       cyapa_dump_data(cyapa, len, values);
+
+       return ret;
+}
+
+/*
+ * cyapa_smbus_read_block - perform smbus block read command
+ * @cyapa  - private data structure of the driver
+ * @cmd    - the properly encoded smbus command
+ * @length - expected length of smbus command result
+ * @values - buffer to store smbus command result
+ *
+ * Returns negative errno, else the number of bytes written.
+ *
+ * Note:
+ * In trackpad device, the memory block allocated for I2C register map
+ * is 256 bytes, so the max read block for I2C bus is 256 bytes.
+ */
+static ssize_t cyapa_smbus_read_block(struct cyapa *cyapa, u8 cmd, size_t len,
+                                     u8 *values)
+{
+       ssize_t ret;
+       u8 index;
+       u8 smbus_cmd;
+       u8 *buf;
+       struct i2c_client *client = cyapa->client;
+       struct device *dev = &client->dev;
+
+       if (!(SMBUS_BYTE_BLOCK_CMD_MASK & cmd))
+               return -EINVAL;
+
+       if (SMBUS_GROUP_BLOCK_CMD_MASK & cmd) {
+               /* read specific block registers command. */
+               smbus_cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
+               ret = i2c_smbus_read_block_data(client, smbus_cmd, values);
+               goto out;
+       }
+
+       ret = 0;
+       for (index = 0; index * I2C_SMBUS_BLOCK_MAX < len; index++) {
+               smbus_cmd = SMBUS_ENCODE_IDX(cmd, index);
+               smbus_cmd = SMBUS_ENCODE_RW(smbus_cmd, SMBUS_READ);
+               buf = values + I2C_SMBUS_BLOCK_MAX * index;
+               ret = i2c_smbus_read_block_data(client, smbus_cmd, buf);
+               if (ret < 0)
+                       goto out;
+       }
+
+out:
+       dev_dbg(dev, "smbus read block cmd: 0x%02x len: %zu ret: %zd\n",
+               cmd, len, ret);
+       if (ret > 0)
+               cyapa_dump_data(cyapa, len, values);
+       return (ret > 0) ? len : ret;
+}
+
+static s32 cyapa_read_byte(struct cyapa *cyapa, u8 cmd_idx)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       u8 cmd;
+
+       if (cyapa->smbus) {
+               cmd = cyapa_smbus_cmds[cmd_idx].cmd;
+               cmd = SMBUS_ENCODE_RW(cmd, SMBUS_READ);
+       } else {
+               cmd = cyapa_i2c_cmds[cmd_idx].cmd;
+       }
+       ret = i2c_smbus_read_byte_data(cyapa->client, cmd);
+       dev_dbg(dev, "read byte [0x%02x] = 0x%02x  ret: %d\n",
+               cmd, ret, ret);
+
+       return ret;
+}
+
+static s32 cyapa_write_byte(struct cyapa *cyapa, u8 cmd_idx, u8 value)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       u8 cmd;
+
+       if (cyapa->smbus) {
+               cmd = cyapa_smbus_cmds[cmd_idx].cmd;
+               cmd = SMBUS_ENCODE_RW(cmd, SMBUS_WRITE);
+       } else {
+               cmd = cyapa_i2c_cmds[cmd_idx].cmd;
+       }
+       ret = i2c_smbus_write_byte_data(cyapa->client, cmd, value);
+       dev_dbg(dev, "write byte [0x%02x] = 0x%02x  ret: %d\n",
+               cmd, value, ret);
+
+       return ret;
+}
+
+static ssize_t cyapa_read_block(struct cyapa *cyapa, u8 cmd_idx, u8 *values)
+{
+       u8 cmd;
+       size_t len;
+
+       if (cyapa->smbus) {
+               cmd = cyapa_smbus_cmds[cmd_idx].cmd;
+               len = cyapa_smbus_cmds[cmd_idx].len;
+               return cyapa_smbus_read_block(cyapa, cmd, len, values);
+       } else {
+               cmd = cyapa_i2c_cmds[cmd_idx].cmd;
+               len = cyapa_i2c_cmds[cmd_idx].len;
+               return cyapa_i2c_reg_read_block(cyapa, cmd, len, values);
+       }
+}
+
+/*
+ * Query device for its current operating state.
+ *
+ * Possible states are:
+ *   OPERATION_MODE
+ *   BOOTLOADER_IDLE
+ *   BOOTLOADER_ACTIVE
+ *   BOOTLOADER_BUSY
+ *   NO_DEVICE
+ *
+ * Returns:
+ *   0 on success, and sets cyapa->state
+ *   < 0 on error, and sets cyapa->state = CYAPA_STATE_NO_DEVICE
+ */
+static int cyapa_get_state(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       u8 status[BL_STATUS_SIZE];
+
+       cyapa->state = CYAPA_STATE_NO_DEVICE;
+
+       /*
+        * Get trackpad status by reading 3 registers starting from 0.
+        * If the device is in the bootloader, this will be BL_HEAD.
+        * If the device is in operation mode, this will be the DATA regs.
+        *
+        * Note: on SMBus, this may be slow.
+        * TODO(djkurtz): make it fast on SMBus!
+        */
+       ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET, BL_STATUS_SIZE,
+                                      status);
+
+       /*
+        * On smbus systems in OP mode, the i2c_reg_read will fail with
+        * -ETIMEDOUT.  In this case, try again using the smbus equivalent
+        * command.  This should return a BL_HEAD indicating CYAPA_STATE_OP.
+        */
+       if (cyapa->smbus && (ret == -ETIMEDOUT || ret == -ENXIO)) {
+               dev_dbg(dev, "smbus: probing with BL_STATUS command\n");
+               ret = cyapa_read_block(cyapa, CYAPA_CMD_BL_STATUS, status);
+       }
+
+       if (ret != BL_STATUS_SIZE)
+               return (ret < 0) ? ret : -EAGAIN;
+
+       if ((status[REG_OP_STATUS] & OP_STATUS_DEV) == CYAPA_DEV_NORMAL) {
+               dev_dbg(dev, "device state: operational mode\n");
+               cyapa->state = CYAPA_STATE_OP;
+       } else if (status[REG_BL_STATUS] & BL_STATUS_BUSY) {
+               dev_dbg(dev, "device state: bootloader busy\n");
+               cyapa->state = CYAPA_STATE_BL_BUSY;
+       } else if (status[REG_BL_ERROR] & BL_ERROR_BOOTLOADING) {
+               dev_dbg(dev, "device state: bootloader active\n");
+               cyapa->state = CYAPA_STATE_BL_ACTIVE;
+       } else {
+               dev_dbg(dev, "device state: bootloader idle\n");
+               cyapa->state = CYAPA_STATE_BL_IDLE;
+       }
+
+       return 0;
+}
+/*
+ * Poll device for its status in a loop, waiting up to timeout for a response.
+ *
+ * When the device switches state, it usually takes ~300 ms.
+ * Howere, when running a new firmware image, the device must calibrate its
+ * sensors, which can take as long as 2 seconds.
+ *
+ * Note: The timeout has granularity of the polling rate, which is 300 ms.
+ *
+ * Returns:
+ *   0 when the device eventually responds with a valid non-busy state.
+ *   -ETIMEDOUT if device never responds (too many -EAGAIN)
+ *   < 0    other errors
+ */
+static int cyapa_poll_state(struct cyapa *cyapa, unsigned int timeout)
+{
+       int ret;
+       int tries = timeout / 100;
+
+       ret = cyapa_get_state(cyapa);
+       while ((ret || cyapa->state >= CYAPA_STATE_BL_BUSY) && tries--) {
+               msleep(100);
+               ret = cyapa_get_state(cyapa);
+       }
+       return (ret == -EAGAIN || ret == -ETIMEDOUT) ? -ETIMEDOUT : ret;
+}
+
+/*
+ * Enter bootloader by soft resetting the device.
+ *
+ * If device is already in the bootloader, the function just returns.
+ * Otherwise, reset the device; after reset, device enters bootloader idle
+ * state immediately.
+ *
+ * Also, if device was unregister device from input core.  Device will
+ * re-register after it is detected following resumption of operational mode.
+ *
+ * Returns:
+ *   0 on success
+ *   -EAGAIN  device was reset, but is not now in bootloader idle state
+ *   < 0 if the device never responds within the timeout
+ */
+static int cyapa_bl_enter(struct cyapa *cyapa)
+{
+       int ret;
+
+       if (cyapa->input) {
+               disable_irq(cyapa->irq);
+               input_unregister_device(cyapa->input);
+               cyapa->input = NULL;
+       }
+
+       if (cyapa->state != CYAPA_STATE_OP)
+               return 0;
+
+       cyapa->state = CYAPA_STATE_NO_DEVICE;
+       ret = cyapa_write_byte(cyapa, CYAPA_CMD_SOFT_RESET, 0x01);
+       if (ret < 0)
+               return -EIO;
+
+       usleep_range(25000, 50000);
+       ret = cyapa_get_state(cyapa);
+       if (ret < 0)
+               return ret;
+       if (cyapa->state != CYAPA_STATE_BL_IDLE)
+               return -EAGAIN;
+
+       return 0;
+}
+static int cyapa_bl_activate(struct cyapa *cyapa)
+{
+       int ret;
+
+       ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_activate),
+                                       bl_activate);
+       if (ret < 0)
+               return ret;
+
+       /* Wait for bootloader to activate; takes between 2 and 12 seconds */
+       msleep(2000);
+       ret = cyapa_poll_state(cyapa, 10000);
+       if (ret < 0)
+               return ret;
+       if (cyapa->state != CYAPA_STATE_BL_ACTIVE)
+               return -EAGAIN;
+
+       return 0;
+}
+
+static int cyapa_bl_deactivate(struct cyapa *cyapa)
+{
+       int ret;
+
+       ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_deactivate),
+                                       bl_deactivate);
+       if (ret < 0)
+               return ret;
+
+       /* wait for bootloader to switch to idle state; should take < 100ms */
+       msleep(100);
+       ret = cyapa_poll_state(cyapa, 500);
+       if (ret < 0)
+               return ret;
+       if (cyapa->state != CYAPA_STATE_BL_IDLE)
+               return -EAGAIN;
+       return 0;
+}
+
+/*
+ * Exit bootloader
+ *
+ * Send bl_exit command, then wait 300 ms to let device transition to
+ * operational mode.  If this is the first time the device's firmware is
+ * running, it can take up to 2 seconds to calibrate its sensors.  So, poll
+ * the device's new state for up to 2 seconds.
+ *
+ * Returns:
+ *   -EIO    failure while reading from device
+ *   -EAGAIN device is stuck in bootloader, b/c it has invalid firmware
+ *   0       device is supported and in operational mode
+ */
+static int cyapa_bl_exit(struct cyapa *cyapa)
+{
+       int ret;
+
+       ret = cyapa_i2c_reg_write_block(cyapa, 0, sizeof(bl_exit), bl_exit);
+       if (ret < 0)
+               return ret;
+
+       /*
+        * Wait for bootloader to exit, and operation mode to start.
+        * Normally, this takes at least 50 ms.
+        */
+       usleep_range(50000, 100000);
+       /*
+        * In addition, when a device boots for the first time after being
+        * updated to new firmware, it must first calibrate its sensors, which
+        * can take up to an additional 2 seconds.
+        */
+       ret = cyapa_poll_state(cyapa, 2000);
+       if (ret < 0)
+               return ret;
+       if (cyapa->state != CYAPA_STATE_OP)
+               return -EAGAIN;
+
+       return 0;
+}
+
+/*
+ * Set device power mode
+ *
+ * Device power mode can only be set when device is in operational mode.
+ */
+static int cyapa_set_power_mode(struct cyapa *cyapa, u8 power_mode)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       u8 power;
+       int tries = SET_POWER_MODE_TRIES;
+
+       if (cyapa->state != CYAPA_STATE_OP)
+               return 0;
+
+       while (true) {
+               ret = cyapa_read_byte(cyapa, CYAPA_CMD_POWER_MODE);
+               if (ret >= 0 || --tries < 1)
+                       break;
+               dev_dbg(dev, "set power mode read retry. tries left = %d\n",
+                       tries);
+               usleep_range(SET_POWER_MODE_DELAY, 2 * SET_POWER_MODE_DELAY);
+       }
+       if (ret < 0) {
+               dev_err(dev, "failed to read power mode %d\n", ret);
+               return ret;
+       }
+
+       power = ret;
+       power &= ~PWR_MODE_MASK;
+       power |= power_mode & PWR_MODE_MASK;
+       while (true) {
+               ret = cyapa_write_byte(cyapa, CYAPA_CMD_POWER_MODE, power);
+               if (!ret || --tries < 1)
+                       break;
+               dev_dbg(dev, "set power mode write retry. tries left = %d\n",
+                       tries);
+               usleep_range(SET_POWER_MODE_DELAY, 2 * SET_POWER_MODE_DELAY);
+       }
+       if (ret < 0)
+               dev_err(dev, "failed to set power_mode 0x%02x err = %d\n",
+                       power_mode, ret);
+       return ret;
+}
+
+static int cyapa_get_query_data(struct cyapa *cyapa)
+{
+       u8 query_data[QUERY_DATA_SIZE];
+       int ret;
+
+       if (cyapa->state != CYAPA_STATE_OP)
+               return -EBUSY;
+
+       ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_QUERY, query_data);
+       if (ret < 0)
+               return ret;
+       if (ret != QUERY_DATA_SIZE)
+               return -EIO;
+
+       cyapa->product_id[0] = query_data[0];
+       cyapa->product_id[1] = query_data[1];
+       cyapa->product_id[2] = query_data[2];
+       cyapa->product_id[3] = query_data[3];
+       cyapa->product_id[4] = query_data[4];
+       cyapa->product_id[5] = '-';
+       cyapa->product_id[6] = query_data[5];
+       cyapa->product_id[7] = query_data[6];
+       cyapa->product_id[8] = query_data[7];
+       cyapa->product_id[9] = query_data[8];
+       cyapa->product_id[10] = query_data[9];
+       cyapa->product_id[11] = query_data[10];
+       cyapa->product_id[12] = '-';
+       cyapa->product_id[13] = query_data[11];
+       cyapa->product_id[14] = query_data[12];
+       cyapa->product_id[15] = '\0';
+
+       cyapa->fw_maj_ver = query_data[15];
+       cyapa->fw_min_ver = query_data[16];
+       cyapa->hw_maj_ver = query_data[17];
+       cyapa->hw_min_ver = query_data[18];
+
+       cyapa->gen = query_data[20] & 0x0F;
+
+       cyapa->max_abs_x = ((query_data[21] & 0xF0) << 4) | query_data[22];
+       cyapa->max_abs_y = ((query_data[21] & 0x0F) << 8) | query_data[23];
+
+       cyapa->physical_size_x =
+               ((query_data[24] & 0xF0) << 4) | query_data[25];
+       cyapa->physical_size_y =
+               ((query_data[24] & 0x0F) << 8) | query_data[26];
+
+       return 0;
+}
+
+/*
+ * Check if device is operational.
+ *
+ * An operational device is responding, has exited bootloader, and has
+ * firmware supported by this driver.
+ *
+ * Returns:
+ *   -EBUSY  no device or in bootloader
+ *   -EIO    failure while reading from device
+ *   -EAGAIN device is still in bootloader
+ *           if ->state = CYAPA_STATE_BL_IDLE, device has invalid firmware
+ *   -EINVAL device is in operational mode, but not supported by this driver
+ *   0       device is supported
+ */
+static int cyapa_check_is_operational(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+       const char unique_str[] = "CYTRA";
+       int ret;
+
+       ret = cyapa_poll_state(cyapa, 2000);
+       if (ret < 0)
+               return ret;
+       switch (cyapa->state) {
+       case CYAPA_STATE_BL_ACTIVE:
+               ret = cyapa_bl_deactivate(cyapa);
+               if (ret)
+                       return ret;
+
+       /* Fallthrough state */
+       case CYAPA_STATE_BL_IDLE:
+               ret = cyapa_bl_exit(cyapa);
+               if (ret)
+                       return ret;
+
+       /* Fallthrough state */
+       case CYAPA_STATE_OP:
+               ret = cyapa_get_query_data(cyapa);
+               if (ret < 0)
+                       return ret;
+
+               /* only support firmware protocol gen3 */
+               if (cyapa->gen != CYAPA_GEN3) {
+                       dev_err(dev, "unsupported protocol version (%d)",
+                               cyapa->gen);
+                       return -EINVAL;
+               }
+
+               /* only support product ID starting with CYTRA */
+               if (memcmp(cyapa->product_id, unique_str,
+                          sizeof(unique_str) - 1)) {
+                       dev_err(dev, "unsupported product ID (%s)\n",
+                               cyapa->product_id);
+                       return -EINVAL;
+               }
+               return 0;
+
+       default:
+               return -EIO;
+       }
+       return 0;
+}
+
+
+static u16 cyapa_csum(const u8 *buf, size_t count)
+{
+       int i;
+       u16 csum = 0;
+
+       for (i = 0; i < count; i++)
+               csum += buf[i];
+
+       return csum;
+}
+
+/*
+ * Write a |len| byte long buffer |buf| to the device, by chopping it up into a
+ * sequence of smaller |CYAPA_CMD_LEN|-length write commands.
+ *
+ * The data bytes for a write command are prepended with the 1-byte offset
+ * of the data relative to the start of |buf|.
+ */
+static int cyapa_write_buffer(struct cyapa *cyapa, const u8 *buf, size_t len)
+{
+       int ret;
+       size_t i;
+       unsigned char cmd[CYAPA_CMD_LEN + 1];
+       size_t cmd_len;
+
+       for (i = 0; i < len; i += CYAPA_CMD_LEN) {
+               const u8 *payload = &buf[i];
+               cmd_len = (len - i >= CYAPA_CMD_LEN) ? CYAPA_CMD_LEN : len - i;
+               cmd[0] = i;
+               memcpy(&cmd[1], payload, cmd_len);
+
+               ret = cyapa_i2c_reg_write_block(cyapa, 0, cmd_len + 1, cmd);
+               if (ret < 0)
+                       return ret;
+       }
+       return 0;
+}
+
+
+/*
+ * A firmware block write command writes 64 bytes of data to a single flash
+ * page in the device.  The 78-byte block write command has the format:
+ *   <0xFF> <CMD> <Key> <Start> <Data> <Data-Checksum> <CMD Checksum>
+ *
+ *  <0xFF>  - every command starts with 0xFF
+ *  <CMD>   - the write command value is 0x39
+ *  <Key>   - write commands include an 8-byte key: { 00 01 02 03 04 05 06 07 }
+ *  <Block> - Memory Block number (address / 64) (16-bit, big-endian)
+ *  <Data>  - 64 bytes of firmware image data
+ *  <Data Checksum> - sum of 64 <Data> bytes, modulo 0xFF
+ *  <CMD Checksum> - sum of 77 bytes, from 0xFF to <Data Checksum>
+ *
+ * Each write command is split into 5 i2c write transactions of up to 16 bytes.
+ * Each transaction starts with an i2c register offset: (00, 10, 20, 30, 40).
+ */
+static int cyapa_write_fw_block(struct cyapa *cyapa, u16 block, const u8 *data)
+{
+       int ret;
+       u8 cmd[78];
+       u8 status[BL_STATUS_SIZE];
+       int tries = 3;
+
+       /* set write command and security key bytes. */
+       cmd[0] = 0xFF;
+       cmd[1] = 0x39;
+       cmd[2] = 0x00;
+       cmd[3] = 0x01;
+       cmd[4] = 0x02;
+       cmd[5] = 0x03;
+       cmd[6] = 0x04;
+       cmd[7] = 0x05;
+       cmd[8] = 0x06;
+       cmd[9] = 0x07;
+       cmd[10] = block >> 8;
+       cmd[11] = block;
+       memcpy(&cmd[12], data, CYAPA_FW_BLOCK_SIZE);
+       cmd[76] = cyapa_csum(data, CYAPA_FW_BLOCK_SIZE);
+       cmd[77] = cyapa_csum(cmd, sizeof(cmd) - 1);
+
+       ret = cyapa_write_buffer(cyapa, cmd, sizeof(cmd));
+       if (ret)
+               return ret;
+
+       /* wait for write to finish */
+       do {
+               usleep_range(10000, 20000);
+
+               /* check block write command result status. */
+               ret = cyapa_i2c_reg_read_block(cyapa, BL_HEAD_OFFSET,
+                                              BL_STATUS_SIZE, status);
+               if (ret != BL_STATUS_SIZE)
+                       return (ret < 0) ? ret : -EIO;
+               ret = (status[1] == 0x10 && status[2] == 0x20) ? 0 : -EIO;
+       } while (--tries && ret);
+
+       return ret;
+}
+
+/*
+ * A firmware block read command reads 16 bytes of data from flash starting
+ * from a given address.  The 12-byte block read command has the format:
+ *   <0xFF> <CMD> <Key> <Addr>
+ *
+ *  <0xFF>  - every command starts with 0xFF
+ *  <CMD>   - the read command value is 0x3C
+ *  <Key>   - read commands include an 8-byte key: { 00 01 02 03 04 05 06 07 }
+ *  <Addr>  - Memory address (16-bit, big-endian)
+ *
+ * The command is followed by an i2c block read to read the 16 bytes of data.
+ */
+static int cyapa_read_fw_bytes(struct cyapa *cyapa, u16 addr, u8 *data)
+{
+       int ret;
+       u8 cmd[] = { 0xFF, 0x3C, 0, 1, 2, 3, 4, 5, 6, 7, addr >> 8, addr };
+
+       ret = cyapa_write_buffer(cyapa, cmd, sizeof(cmd));
+       if (ret)
+               return ret;
+
+       /* read data buffer starting from offset 16 */
+       ret = cyapa_i2c_reg_read_block(cyapa, 16, CYAPA_FW_READ_SIZE, data);
+       if (ret != CYAPA_FW_READ_SIZE)
+               return (ret < 0) ? ret : -EIO;
+
+       return 0;
+}
+
+
+/*
+ * Verify the integrity of a CYAPA firmware image file.
+ *
+ * The firmware image file is 30848 bytes, composed of 482 64-byte blocks.
+ *
+ * The first 2 blocks are the firmware header.
+ * The next 480 blocks are the firmware image.
+ *
+ * The first two bytes of the header hold the header checksum, computed by
+ * summing the other 126 bytes of the header.
+ * The last two bytes of the header hold the firmware image checksum, computed
+ * by summing the 30720 bytes of the image modulo 0xFFFF.
+ *
+ * Both checksums are stored little-endian.
+ */
+static int cyapa_check_fw(struct cyapa *cyapa, const struct firmware *fw)
+{
+       struct device *dev = &cyapa->client->dev;
+       u16 csum;
+       u16 csum_expected;
+
+       /* Firmware must match exact 30848 bytes = 482 64-byte blocks. */
+       if (fw->size != CYAPA_FW_SIZE) {
+               dev_err(dev, "invalid firmware size = %zu, expected %u.\n",
+                       fw->size, CYAPA_FW_SIZE);
+               return -EINVAL;
+       }
+
+       /* Verify header block */
+       csum_expected = (fw->data[0] << 8) | fw->data[1];
+       csum = cyapa_csum(&fw->data[2], CYAPA_FW_HDR_SIZE - 2);
+       if (csum != csum_expected) {
+               dev_err(dev, "invalid firmware header checksum = %04x, expected: %04x\n",
+                       csum, csum_expected);
+               return -EINVAL;
+       }
+
+       /* Verify firmware image */
+       csum_expected = (fw->data[CYAPA_FW_HDR_SIZE - 2] << 8) |
+                        fw->data[CYAPA_FW_HDR_SIZE - 1];
+       csum = cyapa_csum(&fw->data[CYAPA_FW_HDR_SIZE], CYAPA_FW_DATA_SIZE);
+       if (csum != csum_expected) {
+               dev_err(dev, "invalid firmware checksum = %04x, expected: %04x\n",
+                       csum, csum_expected);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+static int cyapa_firmware(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       const struct firmware *fw;
+       const char *fw_name = CYAPA_FW_NAME;
+       int i;
+
+       ret = request_firmware(&fw, CYAPA_FW_NAME, dev);
+       if (ret) {
+               dev_err(dev, "Could not load firmware from %s, %d\n",
+                         fw_name, ret);
+               return ret;
+       }
+
+       ret = cyapa_check_fw(cyapa, fw);
+       if (ret) {
+               dev_err(dev, "Invalid CYAPA firmware image: %s\n", fw_name);
+               goto done;
+       }
+
+       ret = cyapa_bl_enter(cyapa);
+       if (ret)
+               goto err_detect;
+
+       ret = cyapa_bl_activate(cyapa);
+       if (ret)
+               goto err_detect;
+
+       /* First write data, starting at byte 128  of fw->data */
+       for (i = 0; i < CYAPA_FW_DATA_BLOCK_COUNT; i++) {
+               size_t block = CYAPA_FW_DATA_BLOCK_START + i;
+               size_t addr = (i + CYAPA_FW_HDR_BLOCK_COUNT) *
+                               CYAPA_FW_BLOCK_SIZE;
+               const u8 *data = &fw->data[addr];
+               ret = cyapa_write_fw_block(cyapa, block, data);
+               if (ret)
+                       goto err_detect;
+       }
+
+       /* Then write checksum */
+       for (i = 0; i < CYAPA_FW_HDR_BLOCK_COUNT; i++) {
+               size_t block = CYAPA_FW_HDR_BLOCK_START + i;
+               size_t addr = i * CYAPA_FW_BLOCK_SIZE;
+               const u8 *data = &fw->data[addr];
+               ret = cyapa_write_fw_block(cyapa, block, data);
+               if (ret)
+                       goto err_detect;
+       }
+
+err_detect:
+       cyapa_detect(cyapa);
+
+done:
+       release_firmware(fw);
+       return ret;
+}
+
+/*
+ * Read the entire firmware image into ->read_fw_image.
+ * If the ->read_fw_image has already been allocated, then this function
+ * doesn't do anything and just returns 0.
+ * If an error occurs while reading the image, ->read_fw_image is freed, and
+ * the error is returned.
+ *
+ * The firmware is a fixed size (CYAPA_FW_SIZE), and is read out in
+ * fixed length (CYAPA_FW_READ_SIZE) chunks.
+ */
+static int cyapa_read_fw(struct cyapa *cyapa)
+{
+       int ret;
+       int addr;
+
+       if (cyapa->read_fw_image)
+               return 0;
+
+       ret = cyapa_bl_enter(cyapa);
+       if (ret)
+               goto err_detect;
+
+       cyapa->read_fw_image = kmalloc(CYAPA_FW_SIZE, GFP_KERNEL);
+       if (!cyapa->read_fw_image) {
+               ret = -ENOMEM;
+               goto err_detect;
+       }
+
+       for (addr = 0; addr < CYAPA_FW_SIZE; addr += CYAPA_FW_READ_SIZE) {
+               ret = cyapa_read_fw_bytes(cyapa, CYAPA_FW_HDR_START + addr,
+                                         &cyapa->read_fw_image[addr]);
+               if (ret) {
+                       kfree(cyapa->read_fw_image);
+                       cyapa->read_fw_image = NULL;
+                       break;
+               }
+       }
+
+err_detect:
+       cyapa_detect(cyapa);
+       return ret;
+}
+
+/*
+ *******************************************************************
+ * below routines export interfaces to sysfs file system.
+ * so user can get firmware/driver/hardware information using cat command.
+ * e.g.: use below command to get firmware version
+ *      cat /sys/bus/i2c/drivers/cyapa/0-0067/firmware_version
+ *******************************************************************
+ */
+static ssize_t cyapa_show_fm_ver(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       return sprintf(buf, "%d.%d\n", cyapa->fw_maj_ver, cyapa->fw_min_ver);
+}
+
+static ssize_t cyapa_show_hw_ver(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       return sprintf(buf, "%d.%d\n", cyapa->hw_maj_ver, cyapa->hw_min_ver);
+}
+
+static ssize_t cyapa_show_product_id(struct device *dev,
+                                    struct device_attribute *attr, char *buf)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       return sprintf(buf, "%s\n", cyapa->product_id);
+}
+
+static ssize_t cyapa_show_protocol_version(struct device *dev,
+                                          struct device_attribute *attr,
+                                          char *buf)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       return sprintf(buf, "%d\n", cyapa->gen);
+}
+
+static ssize_t cyapa_update_fw_store(struct device *dev,
+                                    struct device_attribute *attr,
+                                    const char *buf, size_t count)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       int ret;
+
+       ret = cyapa_firmware(cyapa);
+       if (ret)
+               dev_err(dev, "firmware update failed, %d\n", ret);
+       else
+               dev_dbg(dev, "firmware update succeeded\n");
+
+       return ret ? ret : count;
+}
+
+static u8 cyapa_sleep_time_to_pwr_cmd(u16 sleep_time)
+{
+       if (sleep_time < 20)
+               sleep_time = 20;     /* minimal sleep time. */
+       else if (sleep_time > 1000)
+               sleep_time = 1000;   /* maximal sleep time. */
+
+       if (sleep_time < 100)
+               return ((sleep_time / 10) << 2) & PWR_MODE_MASK;
+       else
+               return ((sleep_time / 20 + 5) << 2) & PWR_MODE_MASK;
+}
+
+static u16 cyapa_pwr_cmd_to_sleep_time(u8 pwr_mode)
+{
+       u8 encoded_time = pwr_mode >> 2;
+       return (encoded_time < 10) ? encoded_time * 10
+                                  : (encoded_time - 5) * 20;
+}
+
+static ssize_t cyapa_show_suspend_scanrate(struct device *dev,
+                                          struct device_attribute *attr,
+                                          char *buf)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       int len = 0;
+       u8 pwr_cmd = cyapa->suspend_power_mode;
+
+       if (pwr_cmd == PWR_MODE_BTN_ONLY)
+               len = sprintf(buf, "%s\n", BTN_ONLY_MODE_NAME);
+       else
+               len = sprintf(buf, "%u\n",
+                             cyapa_pwr_cmd_to_sleep_time(pwr_cmd));
+       return len;
+}
+
+static ssize_t cyapa_update_suspend_scanrate(struct device *dev,
+                                            struct device_attribute *attr,
+                                            const char *buf, size_t count)
+{
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+       const char *btnonly = BTN_ONLY_MODE_NAME;
+       u8 pwr_cmd;
+       u16 sleep_time;
+       size_t len;
+
+       if (buf == NULL || count == 0)
+               goto invalidparam;
+
+       len = (buf[count - 1] == '\n') ? count - 1 : count;
+
+       if (len == strlen(btnonly) &&
+           !strncasecmp(buf, btnonly, strlen(btnonly)))
+               pwr_cmd = PWR_MODE_BTN_ONLY;
+       else if (!kstrtou16(buf, 10, &sleep_time))
+               pwr_cmd = cyapa_sleep_time_to_pwr_cmd(sleep_time);
+       else
+               goto invalidparam;
+
+       cyapa->suspend_power_mode = pwr_cmd;
+       return count;
+
+invalidparam:
+       dev_err(dev, "invalid suspend scanrate ms parameters\n");
+       return -EINVAL;
+}
+
+static DEVICE_ATTR(firmware_version, S_IRUGO, cyapa_show_fm_ver, NULL);
+static DEVICE_ATTR(hardware_version, S_IRUGO, cyapa_show_hw_ver, NULL);
+static DEVICE_ATTR(product_id, S_IRUGO, cyapa_show_product_id, NULL);
+static DEVICE_ATTR(protocol_version, S_IRUGO, cyapa_show_protocol_version, NULL);
+static DEVICE_ATTR(update_fw, S_IWUSR, NULL, cyapa_update_fw_store);
+
+static struct attribute *cyapa_sysfs_entries[] = {
+       &dev_attr_firmware_version.attr,
+       &dev_attr_hardware_version.attr,
+       &dev_attr_product_id.attr,
+       &dev_attr_protocol_version.attr,
+       &dev_attr_update_fw.attr,
+       NULL,
+};
+
+static const struct attribute_group cyapa_sysfs_group = {
+       .attrs = cyapa_sysfs_entries,
+};
+
+#ifdef CONFIG_PM
+static DEVICE_ATTR(suspend_scanrate_ms, S_IRUGO|S_IWUSR,
+                  cyapa_show_suspend_scanrate,
+                  cyapa_update_suspend_scanrate);
+
+static struct attribute *cyapa_power_wakeup_entries[] = {
+       &dev_attr_suspend_scanrate_ms.attr,
+       NULL,
+};
+
+static const struct attribute_group cyapa_power_wakeup_group = {
+       .name = power_group_name,
+       .attrs = cyapa_power_wakeup_entries,
+};
+#endif
+
+/*
+ **************************************************************
+ * debugfs interface
+ **************************************************************
+*/
+static int cyapa_debugfs_open(struct inode *inode, struct file *file)
+{
+       struct cyapa *cyapa = inode->i_private;
+       int ret;
+
+       if (!cyapa)
+               return -ENODEV;
+
+       ret = mutex_lock_interruptible(&cyapa->debugfs_mutex);
+       if (ret)
+               return ret;
+
+       if (!kobject_get(&cyapa->client->dev.kobj)) {
+               ret = -ENODEV;
+               goto out;
+       }
+
+       file->private_data = cyapa;
+
+       /*
+        * If firmware hasn't been read yet, read it all in one pass.
+        * Subsequent opens will reuse the data in this same buffer.
+        */
+       ret = cyapa_read_fw(cyapa);
+
+out:
+       mutex_unlock(&cyapa->debugfs_mutex);
+       return ret;
+}
+
+static int cyapa_debugfs_release(struct inode *inode, struct file *file)
+{
+       struct cyapa *cyapa = file->private_data;
+       int ret;
+
+       if (!cyapa)
+               return 0;
+
+       ret = mutex_lock_interruptible(&cyapa->debugfs_mutex);
+       if (ret)
+               return ret;
+       file->private_data = NULL;
+       kobject_put(&cyapa->client->dev.kobj);
+       mutex_unlock(&cyapa->debugfs_mutex);
+
+       return 0;
+}
+
+
+/* Return some bytes from the buffered firmware image, starting from *ppos */
+static ssize_t cyapa_debugfs_read_fw(struct file *file, char __user *buffer,
+                                    size_t count, loff_t *ppos)
+{
+       struct cyapa *cyapa = file->private_data;
+
+       if (!cyapa->read_fw_image)
+               return -EINVAL;
+
+       if (*ppos >= CYAPA_FW_SIZE)
+               return 0;
+
+       if (count + *ppos > CYAPA_FW_SIZE)
+               count = CYAPA_FW_SIZE - *ppos;
+
+       if (copy_to_user(buffer, &cyapa->read_fw_image[*ppos], count))
+               return -EFAULT;
+
+       *ppos += count;
+       return count;
+}
+
+static const struct file_operations cyapa_read_fw_fops = {
+       .open = cyapa_debugfs_open,
+       .release = cyapa_debugfs_release,
+       .read = cyapa_debugfs_read_fw
+};
+
+static int cyapa_debugfs_init(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+
+       if (!cyapa_debugfs_root)
+               return -ENODEV;
+
+       cyapa->dentry_dev = debugfs_create_dir(kobject_name(&dev->kobj),
+                                              cyapa_debugfs_root);
+
+       if (!cyapa->dentry_dev)
+               return -ENODEV;
+
+       mutex_init(&cyapa->debugfs_mutex);
+
+       debugfs_create_file(CYAPA_DEBUGFS_READ_FW, S_IRUSR, cyapa->dentry_dev,
+                           cyapa, &cyapa_read_fw_fops);
+       return 0;
+}
+
+/*
+ **************************************************************
+ * Cypress i2c trackpad input device driver.
+ **************************************************************
+*/
+
+static irqreturn_t cyapa_irq(int irq, void *dev_id)
+{
+       struct cyapa *cyapa = dev_id;
+       struct device *dev = &cyapa->client->dev;
+       struct input_dev *input = cyapa->input;
+       struct cyapa_reg_data data;
+       int i;
+       int ret;
+       int num_fingers;
+       unsigned int mask;
+
+       /*
+        * Don't read input if input device has not been configured.
+        * This check check solves a race during probe() between irq_request()
+        * and irq_disable(), since there is no way to request an irq that is
+        * initially disabled.
+        */
+       if (!input)
+               return IRQ_HANDLED;
+
+       if (device_may_wakeup(dev))
+               pm_wakeup_event(dev, 0);
+
+       ret = cyapa_read_block(cyapa, CYAPA_CMD_GROUP_DATA, (u8 *)&data);
+       if (ret != sizeof(data))
+               return IRQ_HANDLED;
+
+       if ((data.device_status & OP_STATUS_SRC) != OP_STATUS_SRC ||
+           (data.device_status & OP_STATUS_DEV) != CYAPA_DEV_NORMAL ||
+           (data.finger_btn & OP_DATA_VALID) != OP_DATA_VALID) {
+               return IRQ_HANDLED;
+       }
+
+       mask = 0;
+       num_fingers = (data.finger_btn >> 4) & 0x0F;
+       for (i = 0; i < num_fingers; i++) {
+               const struct cyapa_touch *touch = &data.touches[i];
+               /* Note: touch->id range is 1 to 15; slots are 0 to 14. */
+               int slot = touch->id - 1;
+
+               mask |= (1 << slot);
+               input_mt_slot(input, slot);
+               input_mt_report_slot_state(input, MT_TOOL_FINGER, true);
+               input_report_abs(input, ABS_MT_POSITION_X,
+                                ((touch->xy & 0xF0) << 4) | touch->x);
+               input_report_abs(input, ABS_MT_POSITION_Y,
+                                ((touch->xy & 0x0F) << 8) | touch->y);
+               input_report_abs(input, ABS_MT_PRESSURE, touch->pressure);
+       }
+
+       /* Invalidate all unreported slots */
+       for (i = 0; i < CYAPA_MAX_MT_SLOTS; i++) {
+               if (mask & (1 << i))
+                       continue;
+               input_mt_slot(input, i);
+               input_mt_report_slot_state(input, MT_TOOL_FINGER, false);
+       }
+
+       input_mt_report_pointer_emulation(input, true);
+       input_report_key(input, BTN_LEFT, data.finger_btn & OP_DATA_BTN_MASK);
+       input_sync(input);
+
+       return IRQ_HANDLED;
+}
+
+static u8 cyapa_check_adapter_functionality(struct i2c_client *client)
+{
+       u8 ret = CYAPA_ADAPTER_FUNC_NONE;
+
+       if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
+               ret |= CYAPA_ADAPTER_FUNC_I2C;
+       if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA |
+                                    I2C_FUNC_SMBUS_BLOCK_DATA |
+                                    I2C_FUNC_SMBUS_I2C_BLOCK))
+               ret |= CYAPA_ADAPTER_FUNC_SMBUS;
+       return ret;
+}
+
+static int cyapa_create_input_dev(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+       struct input_dev *input;
+
+       dev_info(dev,
+                "Cypress APA Trackpad Information:\n" \
+                "    Product ID:  %s\n" \
+                "    Protocol Generation:  %d\n" \
+                "    Firmware Version:  %d.%d\n" \
+                "    Hardware Version:  %d.%d\n" \
+                "    Max ABS X,Y:   %d,%d\n" \
+                "    Physical Size X,Y:   %d,%d\n",
+                cyapa->product_id,
+                cyapa->gen,
+                cyapa->fw_maj_ver, cyapa->fw_min_ver,
+                cyapa->hw_maj_ver, cyapa->hw_min_ver,
+                cyapa->max_abs_x, cyapa->max_abs_y,
+                cyapa->physical_size_x, cyapa->physical_size_y);
+
+       input = cyapa->input = input_allocate_device();
+       if (!input) {
+               dev_err(dev, "allocate memory for input device failed\n");
+               return -ENOMEM;
+       }
+
+       input->name = cyapa->client->name;
+       input->phys = cyapa->client->adapter->name;
+       input->id.bustype = BUS_I2C;
+       input->id.version = 1;
+       input->id.product = 0;  /* means any product in eventcomm. */
+       input->dev.parent = &cyapa->client->dev;
+
+       input_set_drvdata(input, cyapa);
+
+       __set_bit(EV_ABS, input->evbit);
+
+       /*
+        * set and report not-MT axes to support synaptics X Driver.
+        * When multi-fingers on trackpad, only the first finger touch
+        * will be reported as X/Y axes values.
+        */
+       input_set_abs_params(input, ABS_X, 0, cyapa->max_abs_x, 0, 0);
+       input_set_abs_params(input, ABS_Y, 0, cyapa->max_abs_y, 0, 0);
+       input_set_abs_params(input, ABS_PRESSURE, 0, 255, 0, 0);
+
+       /* finger position */
+       input_set_abs_params(input, ABS_MT_POSITION_X, 0, cyapa->max_abs_x, 0, 0);
+       input_set_abs_params(input, ABS_MT_POSITION_Y, 0, cyapa->max_abs_y, 0, 0);
+       input_set_abs_params(input, ABS_MT_PRESSURE, 0, 255, 0, 0);
+       ret = input_mt_init_slots(input, CYAPA_MAX_MT_SLOTS);
+       if (ret < 0) {
+               dev_err(dev, "allocate memory for MT slots failed, %d\n", ret);
+               goto err_free_device;
+       }
+
+       if (cyapa->physical_size_x && cyapa->physical_size_y) {
+               input_abs_set_res(input, ABS_X,
+                       cyapa->max_abs_x / cyapa->physical_size_x);
+               input_abs_set_res(input, ABS_Y,
+                       cyapa->max_abs_y / cyapa->physical_size_y);
+               input_abs_set_res(input, ABS_MT_POSITION_X,
+                       cyapa->max_abs_x / cyapa->physical_size_x);
+               input_abs_set_res(input, ABS_MT_POSITION_Y,
+                       cyapa->max_abs_y / cyapa->physical_size_y);
+       }
+
+       __set_bit(EV_KEY, input->evbit);
+       __set_bit(BTN_TOUCH, input->keybit);
+       __set_bit(BTN_TOOL_FINGER, input->keybit);
+       __set_bit(BTN_TOOL_DOUBLETAP, input->keybit);
+       __set_bit(BTN_TOOL_TRIPLETAP, input->keybit);
+       __set_bit(BTN_TOOL_QUADTAP, input->keybit);
+       __set_bit(BTN_TOOL_QUINTTAP, input->keybit);
+
+       __set_bit(BTN_LEFT, input->keybit);
+
+       __set_bit(INPUT_PROP_POINTER, input->propbit);
+       __set_bit(INPUT_PROP_BUTTONPAD, input->propbit);
+
+       /* Register the device in input subsystem */
+       ret = input_register_device(input);
+       if (ret) {
+               dev_err(dev, "input device register failed, %d\n", ret);
+               goto err_free_device;
+       }
+
+       enable_irq(cyapa->irq);
+       return 0;
+
+err_free_device:
+       input_free_device(input);
+       cyapa->input = NULL;
+       return ret;
+}
+
+static void cyapa_detect(struct cyapa *cyapa)
+{
+       struct device *dev = &cyapa->client->dev;
+       int ret;
+
+       ret = cyapa_check_is_operational(cyapa);
+       if (ret == -ETIMEDOUT) {
+               dev_err(dev, "no device detected, %d\n", ret);
+               return;
+       } else if (ret) {
+               dev_err(dev, "device detected, but not operational, %d\n", ret);
+               return;
+       }
+
+       if (!cyapa->input) {
+               ret = cyapa_create_input_dev(cyapa);
+               if (ret)
+                       dev_err(dev, "create input_dev instance failed, %d\n",
+                               ret);
+
+               /*
+                * On some systems, a system crash / warm boot does not reset
+                * the device's current power mode to FULL_ACTIVE.
+                * If such an event happens during suspend, after the device
+                * has been put in a low power mode, the device will still be
+                * in low power mode on a subsequent boot, since there was
+                * never a matching resume().
+                * Handle this by always forcing full power here, when a
+                * device is first detected to be in operational mode.
+                */
+               ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
+               if (ret)
+                       dev_warn(dev, "set active power failed, %d\n", ret);
+       }
+}
+
+static int __devinit cyapa_probe(struct i2c_client *client,
+                                const struct i2c_device_id *dev_id)
+{
+       int ret;
+       u8 adapter_func;
+       struct cyapa *cyapa;
+       struct device *dev = &client->dev;
+
+       adapter_func = cyapa_check_adapter_functionality(client);
+       if (adapter_func == CYAPA_ADAPTER_FUNC_NONE) {
+               dev_err(dev, "not a supported I2C/SMBus adapter\n");
+               return -EIO;
+       }
+
+       cyapa = kzalloc(sizeof(struct cyapa), GFP_KERNEL);
+       if (!cyapa) {
+               dev_err(dev, "allocate memory for cyapa failed\n");
+               return -ENOMEM;
+       }
+
+       cyapa->gen = CYAPA_GEN3;
+       cyapa->client = client;
+       i2c_set_clientdata(client, cyapa);
+
+       cyapa->adapter_func = adapter_func;
+       /* i2c isn't supported, set smbus */
+       if (cyapa->adapter_func == CYAPA_ADAPTER_FUNC_SMBUS)
+               cyapa->smbus = true;
+       cyapa->state = CYAPA_STATE_NO_DEVICE;
+       cyapa->suspend_power_mode = PWR_MODE_IDLE;
+
+       /*
+        * Note: There is no way to request an irq that is initially disabled.
+        * Thus, there is a little race here, which is resolved in cyapa_irq()
+        * by checking that cyapa->input has been allocated, which happens
+        * in cyapa_detect(), before creating input events.
+        */
+       cyapa->irq = client->irq;
+       ret = request_threaded_irq(cyapa->irq,
+                                  NULL,
+                                  cyapa_irq,
+                                  IRQF_TRIGGER_FALLING,
+                                  "cyapa",
+                                  cyapa);
+       if (ret) {
+               dev_err(dev, "IRQ request failed: %d\n, ", ret);
+               goto err_mem_free;
+       }
+       disable_irq(cyapa->irq);
+
+       if (sysfs_create_group(&client->dev.kobj, &cyapa_sysfs_group))
+               dev_warn(dev, "error creating sysfs entries.\n");
+
+       if (cyapa_debugfs_init(cyapa))
+               dev_warn(dev, "error creating debugfs entries.\n");
+
+#ifdef CONFIG_PM
+       if (device_can_wakeup(dev) &&
+           sysfs_merge_group(&client->dev.kobj, &cyapa_power_wakeup_group))
+               dev_warn(dev, "error creating wakeup power entries.\n");
+#endif
+
+       cyapa_detect(cyapa);
+
+       return 0;
+
+err_mem_free:
+       kfree(cyapa);
+
+       return ret;
+}
+
+static int __devexit cyapa_remove(struct i2c_client *client)
+{
+       struct cyapa *cyapa = i2c_get_clientdata(client);
+
+       sysfs_remove_group(&client->dev.kobj, &cyapa_sysfs_group);
+
+       free_irq(cyapa->irq, cyapa);
+
+       if (cyapa->input)
+               input_unregister_device(cyapa->input);
+
+       if (cyapa->dentry_dev) {
+               debugfs_remove_recursive(cyapa->dentry_dev);
+               mutex_destroy(&cyapa->debugfs_mutex);
+       }
+
+       kfree(cyapa->read_fw_image);
+       cyapa->read_fw_image = NULL;
+
+       kfree(cyapa);
+
+       return 0;
+}
+
+#ifdef CONFIG_PM_SLEEP
+static int cyapa_suspend(struct device *dev)
+{
+       int ret;
+       u8 power_mode;
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+
+       /* set trackpad device to idle mode if wakeup is allowed
+        * otherwise turn off. */
+       power_mode = device_may_wakeup(dev) ? cyapa->suspend_power_mode
+                                           : PWR_MODE_OFF;
+       ret = cyapa_set_power_mode(cyapa, power_mode);
+       if (ret < 0)
+               dev_err(dev, "set power mode failed, %d\n", ret);
+
+       if (device_may_wakeup(dev))
+               cyapa->irq_wake = (enable_irq_wake(cyapa->irq) == 0);
+       disable_irq(cyapa->irq);
+
+       return 0;
+}
+
+static int cyapa_resume(struct device *dev)
+{
+       int ret;
+       struct cyapa *cyapa = dev_get_drvdata(dev);
+
+       enable_irq(cyapa->irq);
+       if (device_may_wakeup(dev) && cyapa->irq_wake)
+               disable_irq_wake(cyapa->irq);
+
+       cyapa_detect(cyapa);
+
+       ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
+       if (ret)
+               dev_warn(dev, "resume active power failed, %d\n", ret);
+
+       return 0;
+}
+#endif
+
+static SIMPLE_DEV_PM_OPS(cyapa_pm_ops, cyapa_suspend, cyapa_resume);
+
+static const struct i2c_device_id cyapa_id_table[] = {
+       { "cyapa", 0 },
+       { },
+};
+MODULE_DEVICE_TABLE(i2c, cyapa_id_table);
+
+static struct i2c_driver cyapa_driver = {
+       .driver = {
+               .name = "cyapa",
+               .owner = THIS_MODULE,
+               .pm = &cyapa_pm_ops,
+       },
+
+       .probe = cyapa_probe,
+       .remove = __devexit_p(cyapa_remove),
+       .id_table = cyapa_id_table,
+};
+
+static int __init cyapa_init(void)
+{
+       int ret;
+
+       /* Create a global debugfs root for all cyapa devices */
+       cyapa_debugfs_root = debugfs_create_dir("cyapa", NULL);
+       if (cyapa_debugfs_root == ERR_PTR(-ENODEV))
+               cyapa_debugfs_root = NULL;
+
+       ret = i2c_add_driver(&cyapa_driver);
+       if (ret) {
+               pr_err("cyapa driver register FAILED.\n");
+               return ret;
+       }
+
+       return ret;
+}
+
+static void __exit cyapa_exit(void)
+{
+       if (cyapa_debugfs_root)
+               debugfs_remove_recursive(cyapa_debugfs_root);
+
+       i2c_del_driver(&cyapa_driver);
+}
+
+module_init(cyapa_init);
+module_exit(cyapa_exit);
+
+MODULE_DESCRIPTION("Cypress APA I2C Trackpad Driver");
+MODULE_AUTHOR("Dudley Du <dudl@cypress.com>");
+MODULE_LICENSE("GPL");
index a4b14a4..3c24949 100644 (file)
@@ -652,11 +652,13 @@ static void synaptics_report_mt_data(struct psmouse *psmouse,
        default:
                /*
                 * If the finger slot contained in SGM is valid, and either
-                * hasn't changed, or is new, then report SGM in MTB slot 0.
+                * hasn't changed, or is new, or the old SGM has now moved to
+                * AGM, then report SGM in MTB slot 0.
                 * Otherwise, empty MTB slot 0.
                 */
                if (mt_state->sgm != -1 &&
-                   (mt_state->sgm == old->sgm || old->sgm == -1))
+                   (mt_state->sgm == old->sgm ||
+                    old->sgm == -1 || mt_state->agm == old->sgm))
                        synaptics_report_slot(dev, 0, sgm);
                else
                        synaptics_report_slot(dev, 0, NULL);
@@ -665,9 +667,31 @@ static void synaptics_report_mt_data(struct psmouse *psmouse,
                 * If the finger slot contained in AGM is valid, and either
                 * hasn't changed, or is new, then report AGM in MTB slot 1.
                 * Otherwise, empty MTB slot 1.
+                *
+                * However, in the case where the AGM is new, make sure that
+                * that it is either the same as the old SGM, or there was no
+                * SGM.
+                *
+                * Otherwise, if the SGM was just 1, and the new AGM is 2, then
+                * the new AGM will keep the old SGM's tracking ID, which can
+                * cause apparent drumroll.  This happens if in the following
+                * valid finger sequence:
+                *
+                *  Action                 SGM  AGM (MTB slot:Contact)
+                *  1. Touch contact 0    (0:0)
+                *  2. Touch contact 1    (0:0, 1:1)
+                *  3. Lift  contact 0    (1:1)
+                *  4. Touch contacts 2,3 (0:2, 1:3)
+                *
+                * In step 4, contact 3, in AGM must not be given the same
+                * tracking ID as contact 1 had in step 3.  To avoid this,
+                * the first agm with contact 3 is dropped and slot 1 is
+                * invalidated (tracking ID = -1).
                 */
                if (mt_state->agm != -1 &&
-                   (mt_state->agm == old->agm || old->agm == -1))
+                   (mt_state->agm == old->agm ||
+                    (old->agm == -1 &&
+                     (old->sgm == -1 || mt_state->agm == old->sgm))))
                        synaptics_report_slot(dev, 1, agm);
                else
                        synaptics_report_slot(dev, 1, NULL);
@@ -1141,7 +1165,8 @@ static void set_abs_position_params(struct input_dev *dev,
        int x_max = priv->x_max ?: XMAX_NOMINAL;
        int y_min = priv->y_min ?: YMIN_NOMINAL;
        int y_max = priv->y_max ?: YMAX_NOMINAL;
-       int fuzz = SYN_CAP_REDUCED_FILTERING(priv->ext_cap_0c) ?
+       int fuzz = (SYN_CAP_REDUCED_FILTERING(priv->ext_cap_0c) &&
+                       !SYN_CAP_IMAGE_SENSOR(priv->ext_cap_0c)) ?
                        SYN_REDUCED_FILTER_FUZZ : 0;
 
        input_set_abs_params(dev, x_code, x_min, x_max, fuzz, 0);
index 19d4ea6..328a7fa 100644 (file)
@@ -11,6 +11,8 @@
  *
  */
 
+#include <linux/debugfs.h>
+#include <linux/completion.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/delay.h>
@@ -20,6 +22,7 @@
 #include <linux/input/mt.h>
 #include <linux/interrupt.h>
 #include <linux/slab.h>
+#include <linux/uaccess.h>
 
 /* Version */
 #define MXT_VER_20             20
 /* Slave addresses */
 #define MXT_APP_LOW            0x4a
 #define MXT_APP_HIGH           0x4b
-#define MXT_BOOT_LOW           0x24
+/*
+ * MXT_BOOT_LOW disagrees with Atmel documentation, but has been
+ * updated to support new touch hardware that pairs 0x26 boot with 0x4a app.
+ */
+#define MXT_BOOT_LOW           0x26
 #define MXT_BOOT_HIGH          0x25
 
 /* Firmware */
 #define MXT_FW_NAME            "maxtouch.fw"
 
+/* Config file */
+#define MXT_CONFIG_NAME                "maxtouch.cfg"
+
 /* Registers */
+#define MXT_INFO               0x00
 #define MXT_FAMILY_ID          0x00
 #define MXT_VARIANT_ID         0x01
 #define MXT_VERSION            0x02
 #define MXT_PROCI_TOUCHSUPPRESSION_T42 42
 #define MXT_PROCI_STYLUS_T47           47
 #define MXT_PROCG_NOISESUPPRESSION_T48 48
+#define MXT_PROCI_ADAPTIVETHRESHOLD_T55 55
+#define MXT_PROCI_SHIELDLESS_T56       56
+#define MXT_PROCI_EXTRATOUCHSCREENDATA_T57     57
+#define MXT_PROCG_NOISESUPPRESSION_T62 62
 #define MXT_SPT_COMMSCONFIG_T18                18
 #define MXT_SPT_GPIOPWM_T19            19
 #define MXT_SPT_SELFTEST_T25           25
@@ -75,6 +90,7 @@
 #define MXT_SPT_DIGITIZER_T43          43
 #define MXT_SPT_MESSAGECOUNT_T44       44
 #define MXT_SPT_CTECONFIG_T46          46
+#define MXT_SPT_TIMER_T61              61
 
 /* MXT_GEN_COMMAND_T6 field */
 #define MXT_COMMAND_RESET      0
 #define MXT_COMMAND_REPORTALL  3
 #define MXT_COMMAND_DIAGNOSTIC 5
 
+#define MXT_T6_CMD_PAGE_UP             0x01
+#define MXT_T6_CMD_PAGE_DOWN           0x02
+#define MXT_T6_CMD_DELTAS              0x10
+#define MXT_T6_CMD_REFS                        0x11
+#define MXT_T6_CMD_DEVICE_ID           0x80
+#define MXT_T6_CMD_TOUCH_THRESH                0xF4
+
 /* MXT_GEN_POWER_T7 field */
 #define MXT_POWER_IDLEACQINT   0
 #define MXT_POWER_ACTVACQINT   1
 /* Define for MXT_GEN_COMMAND_T6 */
 #define MXT_BOOT_VALUE         0xa5
 #define MXT_BACKUP_VALUE       0x55
-#define MXT_BACKUP_TIME                25      /* msec */
-#define MXT_RESET_TIME         65      /* msec */
+#define MXT_BACKUP_TIME                270     /* msec */
+#define MXT_RESET_TIME         350     /* msec */
+#define MXT_CAL_TIME           25      /* msec */
 
-#define MXT_FWRESET_TIME       175     /* msec */
+#define MXT_FWRESET_TIME       500     /* msec */
+
+/* MXT_SPT_GPIOPWM_T19 field */
+#define MXT_GPIO0_MASK         0x04
+#define MXT_GPIO1_MASK         0x08
+#define MXT_GPIO2_MASK         0x10
+#define MXT_GPIO3_MASK         0x20
 
 /* Command to unlock bootloader */
 #define MXT_UNLOCK_CMD_MSB     0xaa
 #define MXT_BOOT_STATUS_MASK   0x3f
 
 /* Touch status */
+#define MXT_UNGRIP             (1 << 0)
 #define MXT_SUPPRESS           (1 << 1)
 #define MXT_AMP                        (1 << 2)
 #define MXT_VECTOR             (1 << 3)
 
 #define MXT_MAX_FINGER         10
 
+/* For CMT (must match XRANGE/YRANGE as defined in board config */
+#define MXT_PIXELS_PER_MM      20
+
 struct mxt_info {
        u8 family_id;
        u8 variant_id;
@@ -225,26 +259,14 @@ struct mxt_info {
 struct mxt_object {
        u8 type;
        u16 start_address;
-       u8 size;
-       u8 instances;
+       u16 size;
+       u16 instances;
        u8 num_report_ids;
-
-       /* to map object and message */
-       u8 max_reportid;
 };
 
 struct mxt_message {
        u8 reportid;
        u8 message[7];
-       u8 checksum;
-};
-
-struct mxt_finger {
-       int status;
-       int x;
-       int y;
-       int area;
-       int pressure;
 };
 
 /* Each client has this additional data */
@@ -254,16 +276,74 @@ struct mxt_data {
        const struct mxt_platform_data *pdata;
        struct mxt_object *object_table;
        struct mxt_info info;
-       struct mxt_finger finger[MXT_MAX_FINGER];
+       bool is_tp;
+
+       bool irq_wake;  /* irq wake is enabled */
+
+       /* for fw update in bootloader */
+       struct completion bl_completion;
+
+       /* for auto-calibration in suspend */
+       struct completion auto_cal_completion;
+
        unsigned int irq;
        unsigned int max_x;
        unsigned int max_y;
+
+       u32 info_csum;
+       u32 config_csum;
+
+       /* Cached parameters from object table */
+       u16 T5_address;
+       u8 T6_reportid;
+       u8 T9_reportid_min;
+       u8 T9_reportid_max;
+       u8 T19_reportid;
+       u16 T44_address;
+
+       /* Saved T7 configuration
+        * [0] = IDLEACQINT
+        * [1] = ACTVACQINT
+        * [2] = ACTV2IDLETO
+        */
+       u8 T7_config[3];
+       bool T7_config_valid;
+
+       /* Saved T9 Ctrl field */
+       u8 T9_ctrl;
+       bool T9_ctrl_valid;
+
+       /* per-instance debugfs root */
+       struct dentry *dentry_dev;
+       struct dentry *dentry_deltas;
+       struct dentry *dentry_refs;
+       struct dentry *dentry_object;
+
+       /* Protect access to the T37 object buffer, used by debugfs */
+       struct mutex T37_buf_mutex;
+       u8 *T37_buf;
+       size_t T37_buf_size;
+
+       /* Protect access to the object register buffer */
+       struct mutex object_str_mutex;
+       char *object_str;
+       size_t object_str_size;
+
+       /* firmware file name */
+       char *fw_file;
+
+       /* config file name */
+       char *config_file;
 };
 
+/* global root node of the atmel_mxt_ts debugfs directory. */
+static struct dentry *mxt_debugfs_root;
+
+static int mxt_initialize(struct mxt_data *data);
+
 static bool mxt_object_readable(unsigned int type)
 {
        switch (type) {
-       case MXT_GEN_MESSAGE_T5:
        case MXT_GEN_COMMAND_T6:
        case MXT_GEN_POWER_T7:
        case MXT_GEN_ACQUIRE_T8:
@@ -281,13 +361,18 @@ static bool mxt_object_readable(unsigned int type)
        case MXT_PROCI_TOUCHSUPPRESSION_T42:
        case MXT_PROCI_STYLUS_T47:
        case MXT_PROCG_NOISESUPPRESSION_T48:
+       case MXT_PROCI_ADAPTIVETHRESHOLD_T55:
+       case MXT_PROCI_SHIELDLESS_T56:
+       case MXT_PROCI_EXTRATOUCHSCREENDATA_T57:
+       case MXT_PROCG_NOISESUPPRESSION_T62:
        case MXT_SPT_COMMSCONFIG_T18:
        case MXT_SPT_GPIOPWM_T19:
        case MXT_SPT_SELFTEST_T25:
        case MXT_SPT_CTECONFIG_T28:
-       case MXT_SPT_USERDATA_T38:
+       case MXT_DEBUG_DIAGNOSTIC_T37:
        case MXT_SPT_DIGITIZER_T43:
        case MXT_SPT_CTECONFIG_T46:
+       case MXT_SPT_TIMER_T61:
                return true;
        default:
                return false;
@@ -313,12 +398,17 @@ static bool mxt_object_writable(unsigned int type)
        case MXT_PROCI_TOUCHSUPPRESSION_T42:
        case MXT_PROCI_STYLUS_T47:
        case MXT_PROCG_NOISESUPPRESSION_T48:
+       case MXT_PROCI_ADAPTIVETHRESHOLD_T55:
+       case MXT_PROCI_SHIELDLESS_T56:
+       case MXT_PROCI_EXTRATOUCHSCREENDATA_T57:
+       case MXT_PROCG_NOISESUPPRESSION_T62:
        case MXT_SPT_COMMSCONFIG_T18:
        case MXT_SPT_GPIOPWM_T19:
        case MXT_SPT_SELFTEST_T25:
        case MXT_SPT_CTECONFIG_T28:
        case MXT_SPT_DIGITIZER_T43:
        case MXT_SPT_CTECONFIG_T46:
+       case MXT_SPT_TIMER_T61:
                return true;
        default:
                return false;
@@ -326,32 +416,68 @@ static bool mxt_object_writable(unsigned int type)
 }
 
 static void mxt_dump_message(struct device *dev,
-                                 struct mxt_message *message)
+                            struct mxt_message *message)
+{
+       dev_dbg(dev, "reportid: %u\tmessage: %02x %02x %02x %02x %02x %02x %02x\n",
+               message->reportid, message->message[0], message->message[1],
+               message->message[2], message->message[3], message->message[4],
+               message->message[5], message->message[6]);
+}
+
+static int mxt_wait_for_chg(struct mxt_data *data, unsigned int timeout_ms)
 {
-       dev_dbg(dev, "reportid:\t0x%x\n", message->reportid);
-       dev_dbg(dev, "message1:\t0x%x\n", message->message[0]);
-       dev_dbg(dev, "message2:\t0x%x\n", message->message[1]);
-       dev_dbg(dev, "message3:\t0x%x\n", message->message[2]);
-       dev_dbg(dev, "message4:\t0x%x\n", message->message[3]);
-       dev_dbg(dev, "message5:\t0x%x\n", message->message[4]);
-       dev_dbg(dev, "message6:\t0x%x\n", message->message[5]);
-       dev_dbg(dev, "message7:\t0x%x\n", message->message[6]);
-       dev_dbg(dev, "checksum:\t0x%x\n", message->checksum);
+       struct device *dev = &data->client->dev;
+       struct completion *comp = &data->bl_completion;
+       unsigned long timeout = msecs_to_jiffies(timeout_ms);
+       long ret;
+
+       ret = wait_for_completion_interruptible_timeout(comp, timeout);
+       if (ret < 0) {
+               dev_err(dev, "Wait for completion interrupted.\n");
+               /*
+                * TODO: handle -EINTR better by terminating fw update process
+                * before returning to userspace by writing length 0x000 to
+                * device (iff we are in WAITING_FRAME_DATA state).
+                */
+               return -EINTR;
+       } else if (ret == 0) {
+               dev_err(dev, "Wait for completion timed out.\n");
+               return -ETIMEDOUT;
+       }
+       return 0;
 }
 
-static int mxt_check_bootloader(struct i2c_client *client,
-                                    unsigned int state)
+static int mxt_check_bootloader(struct mxt_data *data, unsigned int state)
 {
+       struct i2c_client *client = data->client;
+       int count;
        u8 val;
 
 recheck:
-       if (i2c_master_recv(client, &val, 1) != 1) {
+       if (state != MXT_WAITING_BOOTLOAD_CMD) {
+               /*
+                * In application update mode, the interrupt
+                * line signals state transitions. We must wait for the
+                * CHG assertion before reading the status byte.
+                * Once the status byte has been read, the line is deasserted.
+                */
+               int ret = mxt_wait_for_chg(data, 300);
+               if (ret) {
+                       dev_err(&client->dev, "Update wait error %d\n", ret);
+                       return ret;
+               }
+       }
+
+       count = i2c_master_recv(client, &val, 1);
+       if (count != 1) {
                dev_err(&client->dev, "%s: i2c recv failed\n", __func__);
-               return -EIO;
+               return count < 0 ? count : -EIO;
        }
 
        switch (state) {
        case MXT_WAITING_BOOTLOAD_CMD:
+               dev_info(&client->dev, "bootloader version: %d\n",
+                        val & MXT_BOOT_STATUS_MASK);
        case MXT_WAITING_FRAME_DATA:
                val &= ~MXT_BOOT_STATUS_MASK;
                break;
@@ -364,7 +490,7 @@ recheck:
        }
 
        if (val != state) {
-               dev_err(&client->dev, "Unvalid bootloader mode state\n");
+               dev_err(&client->dev, "Invalid bootloader mode state\n");
                return -EINVAL;
        }
 
@@ -373,14 +499,16 @@ recheck:
 
 static int mxt_unlock_bootloader(struct i2c_client *client)
 {
+       int count;
        u8 buf[2];
 
        buf[0] = MXT_UNLOCK_CMD_LSB;
        buf[1] = MXT_UNLOCK_CMD_MSB;
 
-       if (i2c_master_send(client, buf, 2) != 2) {
+       count = i2c_master_send(client, buf, 2);
+       if (count != 2) {
                dev_err(&client->dev, "%s: i2c send failed\n", __func__);
-               return -EIO;
+               return count < 0 ? count : -EIO;
        }
 
        return 0;
@@ -389,18 +517,47 @@ static int mxt_unlock_bootloader(struct i2c_client *client)
 static int mxt_fw_write(struct i2c_client *client,
                             const u8 *data, unsigned int frame_size)
 {
-       if (i2c_master_send(client, data, frame_size) != frame_size) {
+       int count;
+       count = i2c_master_send(client, data, frame_size);
+       if (count != frame_size) {
                dev_err(&client->dev, "%s: i2c send failed\n", __func__);
-               return -EIO;
+               return count < 0 ? count : -EIO;
        }
 
        return 0;
 }
 
-static int __mxt_read_reg(struct i2c_client *client,
-                              u16 reg, u16 len, void *val)
+#ifdef DEBUG
+#define DUMP_LEN       16
+static void mxt_dump_xfer(struct device *dev, const char *func, u16 reg,
+                         u16 len, const u8 *val)
+{
+       /* Rough guess for string size */
+       char str[DUMP_LEN * 3 + 2];
+       int i;
+       size_t n;
+
+       for (i = 0, n = 0; i < len; i++) {
+               n += snprintf(&str[n], sizeof(str) - n, "%02x ", val[i]);
+               if ((i + 1) % DUMP_LEN == 0 || (i + 1) == len) {
+                       dev_dbg(dev,
+                               "%s(reg: %d len: %d offset: 0x%02x): %s\n",
+                               func, reg, len, (i / DUMP_LEN) * DUMP_LEN,
+                               str);
+                       n = 0;
+               }
+       }
+}
+#undef DUMP_LEN
+#else
+static void mxt_dump_xfer(struct device *dev, const char *func, u16 reg,
+                         u16 len, const u8 *val) { }
+#endif
+
+static int mxt_read_reg(struct i2c_client *client, u16 reg, u16 len, void *val)
 {
        struct i2c_msg xfer[2];
+       int ret;
        u8 buf[2];
 
        buf[0] = reg & 0xff;
@@ -418,44 +575,40 @@ static int __mxt_read_reg(struct i2c_client *client,
        xfer[1].len = len;
        xfer[1].buf = val;
 
-       if (i2c_transfer(client->adapter, xfer, 2) != 2) {
-               dev_err(&client->dev, "%s: i2c transfer failed\n", __func__);
-               return -EIO;
+       ret = i2c_transfer(client->adapter, xfer, 2);
+       if (ret != 2) {
+               dev_err(&client->dev, "%s: i2c read failed\n", __func__);
+               return ret < 0 ? ret : -EIO;
        }
 
-       return 0;
-}
+       mxt_dump_xfer(&client->dev, __func__, reg, len, val);
 
-static int mxt_read_reg(struct i2c_client *client, u16 reg, u8 *val)
-{
-       return __mxt_read_reg(client, reg, 1, val);
+       return 0;
 }
 
-static int mxt_write_reg(struct i2c_client *client, u16 reg, u8 val)
+static int mxt_write_reg(struct i2c_client *client, u16 reg, u16 len,
+                        const void *val)
 {
-       u8 buf[3];
+       size_t count = 2 + len;         /* + 2-byte offset */
+       int ret;
+       u8 buf[count];
 
        buf[0] = reg & 0xff;
        buf[1] = (reg >> 8) & 0xff;
-       buf[2] = val;
+       memcpy(&buf[2], val, len);
 
-       if (i2c_master_send(client, buf, 3) != 3) {
-               dev_err(&client->dev, "%s: i2c send failed\n", __func__);
-               return -EIO;
+       mxt_dump_xfer(&client->dev, __func__, reg, len, val);
+
+       ret = i2c_master_send(client, buf, count);
+       if (ret != count) {
+               dev_err(&client->dev, "%s: i2c write failed\n", __func__);
+               return ret < 0 ? ret : -EIO;
        }
 
        return 0;
 }
 
-static int mxt_read_object_table(struct i2c_client *client,
-                                     u16 reg, u8 *object_buf)
-{
-       return __mxt_read_reg(client, reg, MXT_OBJECT_SIZE,
-                                  object_buf);
-}
-
-static struct mxt_object *
-mxt_get_object(struct mxt_data *data, u8 type)
+static struct mxt_object *mxt_get_object(struct mxt_data *data, u8 type)
 {
        struct mxt_object *object;
        int i;
@@ -470,270 +623,345 @@ mxt_get_object(struct mxt_data *data, u8 type)
        return NULL;
 }
 
-static int mxt_read_message(struct mxt_data *data,
-                                struct mxt_message *message)
+static int mxt_read_object(struct mxt_data *data, struct mxt_object *object,
+                          u8 instance, void *val)
 {
-       struct mxt_object *object;
-       u16 reg;
-
-       object = mxt_get_object(data, MXT_GEN_MESSAGE_T5);
-       if (!object)
-               return -EINVAL;
+       u16 addr;
 
-       reg = object->start_address;
-       return __mxt_read_reg(data->client, reg,
-                       sizeof(struct mxt_message), message);
+       BUG_ON(instance >= object->instances);
+       addr = object->start_address + instance * object->size;
+       return mxt_read_reg(data->client, addr, object->size, val);
 }
 
-static int mxt_read_object(struct mxt_data *data,
-                               u8 type, u8 offset, u8 *val)
+static int mxt_write_object(struct mxt_data *data, u8 type, u8 instance,
+                           u8 offset, u8 val)
 {
        struct mxt_object *object;
        u16 reg;
 
        object = mxt_get_object(data, type);
-       if (!object)
+       if (!object || instance >= object->instances || offset >= object->size)
                return -EINVAL;
 
-       reg = object->start_address;
-       return __mxt_read_reg(data->client, reg + offset, 1, val);
+       reg = object->start_address + instance * object->size + offset;
+       return mxt_write_reg(data->client, reg, 1, &val);
 }
 
-static int mxt_write_object(struct mxt_data *data,
-                                u8 type, u8 offset, u8 val)
+static int mxt_read_num_messages(struct mxt_data *data, u8 *count)
 {
-       struct mxt_object *object;
-       u16 reg;
+       /* TODO: Optimization: read first message along with message count */
+       return mxt_read_reg(data->client, data->T44_address, 1, count);
+}
 
-       object = mxt_get_object(data, type);
-       if (!object)
-               return -EINVAL;
+static int mxt_read_messages(struct mxt_data *data, u8 count,
+                            struct mxt_message *messages)
+{
+       return mxt_read_reg(data->client, data->T5_address,
+                           sizeof(struct mxt_message) * count, messages);
+}
+
+static void mxt_input_button(struct mxt_data *data, struct mxt_message *message)
+{
+       struct device *dev = &data->client->dev;
+       struct input_dev *input = data->input_dev;
+       bool button;
 
-       reg = object->start_address;
-       return mxt_write_reg(data->client, reg + offset, val);
+       /* Active-low switch */
+       button = !(message->message[0] & MXT_GPIO3_MASK);
+       input_report_key(input, BTN_LEFT, button);
+       dev_dbg(dev, "Button state: %d\n", button);
 }
 
-static void mxt_input_report(struct mxt_data *data, int single_id)
+static void mxt_input_touch(struct mxt_data *data, struct mxt_message *message)
 {
-       struct mxt_finger *finger = data->finger;
+       struct device *dev = &data->client->dev;
        struct input_dev *input_dev = data->input_dev;
-       int status = finger[single_id].status;
-       int finger_num = 0;
+       u8 status;
+       int x;
+       int y;
+       int area;
+       int amplitude;
+       int vector1, vector2;
        int id;
 
-       for (id = 0; id < MXT_MAX_FINGER; id++) {
-               if (!finger[id].status)
-                       continue;
-
-               input_mt_slot(input_dev, id);
-               input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
-                               finger[id].status != MXT_RELEASE);
-
-               if (finger[id].status != MXT_RELEASE) {
-                       finger_num++;
-                       input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR,
-                                       finger[id].area);
-                       input_report_abs(input_dev, ABS_MT_POSITION_X,
-                                       finger[id].x);
-                       input_report_abs(input_dev, ABS_MT_POSITION_Y,
-                                       finger[id].y);
-                       input_report_abs(input_dev, ABS_MT_PRESSURE,
-                                       finger[id].pressure);
-               } else {
-                       finger[id].status = 0;
-               }
-       }
+       id = message->reportid - data->T9_reportid_min;
 
-       input_report_key(input_dev, BTN_TOUCH, finger_num > 0);
+       status = message->message[0];
+       x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
+       y = (message->message[2] << 4) | ((message->message[3] & 0xf));
+       if (data->max_x < 1024)
+               x >>= 2;
+       if (data->max_y < 1024)
+               y >>= 2;
 
-       if (status != MXT_RELEASE) {
-               input_report_abs(input_dev, ABS_X, finger[single_id].x);
-               input_report_abs(input_dev, ABS_Y, finger[single_id].y);
-               input_report_abs(input_dev,
-                                ABS_PRESSURE, finger[single_id].pressure);
+       area = message->message[4];
+       amplitude = message->message[5];
+
+       /* The two vector components are 4-bit signed ints (2s complement) */
+       vector1 = (signed)((signed char)message->message[6]) >> 4;
+       vector2 = (signed)((signed char)(message->message[6] << 4)) >> 4;
+
+       dev_dbg(dev,
+               "[%d] %c%c%c%c%c%c%c%c x: %d y: %d area: %d amp: %d vector: [%d,%d]\n",
+               id,
+               (status & MXT_DETECT) ? 'D' : '.',
+               (status & MXT_PRESS) ? 'P' : '.',
+               (status & MXT_RELEASE) ? 'R' : '.',
+               (status & MXT_MOVE) ? 'M' : '.',
+               (status & MXT_VECTOR) ? 'V' : '.',
+               (status & MXT_AMP) ? 'A' : '.',
+               (status & MXT_SUPPRESS) ? 'S' : '.',
+               (status & MXT_UNGRIP) ? 'U' : '.',
+               x, y, area, amplitude, vector1, vector2);
+
+       input_mt_slot(input_dev, id);
+       input_mt_report_slot_state(input_dev, MT_TOOL_FINGER,
+                                  status & MXT_DETECT);
+
+       if (status & MXT_DETECT) {
+               input_report_abs(input_dev, ABS_MT_POSITION_X, x);
+               input_report_abs(input_dev, ABS_MT_POSITION_Y, y);
+               input_report_abs(input_dev, ABS_MT_PRESSURE, amplitude);
+               /* TODO: This should really be sqrt(area) */
+               input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, area);
+               /* TODO: Use vector to report ORIENTATION & TOUCH_MINOR */
        }
-
-       input_sync(input_dev);
 }
 
-static void mxt_input_touchevent(struct mxt_data *data,
-                                     struct mxt_message *message, int id)
+static int mxt_proc_messages(struct mxt_data *data, u8 count)
 {
-       struct mxt_finger *finger = data->finger;
        struct device *dev = &data->client->dev;
-       u8 status = message->message[0];
-       int x;
-       int y;
-       int area;
-       int pressure;
+       struct mxt_message messages[count], *msg;
+       int ret;
+       bool update_input;
 
-       /* Check the touch is present on the screen */
-       if (!(status & MXT_DETECT)) {
-               if (status & MXT_RELEASE) {
-                       dev_dbg(dev, "[%d] released\n", id);
+       ret = mxt_read_messages(data, count, messages);
+       if (ret) {
+               dev_err(dev, "Failed to read %u messages (%d).\n", count, ret);
+               return ret;
+       }
 
-                       finger[id].status = MXT_RELEASE;
-                       mxt_input_report(data, id);
+       update_input = false;
+       for (msg = messages; msg < &messages[count]; msg++) {
+               mxt_dump_message(dev, msg);
+
+               if (msg->reportid >= data->T9_reportid_min &&
+                   msg->reportid <= data->T9_reportid_max) {
+                       mxt_input_touch(data, msg);
+                       update_input = true;
+               } else if (msg->reportid == data->T19_reportid) {
+                       mxt_input_button(data, msg);
+                       update_input = true;
+               } else if (msg->reportid == data->T6_reportid) {
+                       data->config_csum = msg->message[1] |
+                                           (msg->message[2] << 8) |
+                                           (msg->message[3] << 16);
+                       dev_info(dev, "Status: %02x Config Checksum: %06x\n",
+                                msg->message[0], data->config_csum);
+                       if (msg->message[0] == 0x00)
+                               complete(&data->auto_cal_completion);
                }
-               return;
        }
 
-       /* Check only AMP detection */
-       if (!(status & (MXT_PRESS | MXT_MOVE)))
-               return;
+       if (update_input) {
+               input_mt_report_pointer_emulation(data->input_dev,
+                                                 data->is_tp);
+               input_sync(data->input_dev);
+       }
 
-       x = (message->message[1] << 4) | ((message->message[3] >> 4) & 0xf);
-       y = (message->message[2] << 4) | ((message->message[3] & 0xf));
-       if (data->max_x < 1024)
-               x = x >> 2;
-       if (data->max_y < 1024)
-               y = y >> 2;
+       return 0;
+}
 
-       area = message->message[4];
-       pressure = message->message[5];
+static int mxt_handle_messages(struct mxt_data *data)
+{
+       struct device *dev = &data->client->dev;
+       int ret;
+       u8 count;
 
-       dev_dbg(dev, "[%d] %s x: %d, y: %d, area: %d\n", id,
-               status & MXT_MOVE ? "moved" : "pressed",
-               x, y, area);
+       ret = mxt_read_num_messages(data, &count);
+       if (ret) {
+               dev_err(dev, "Failed to read message count (%d).\n", ret);
+               return ret;
+       }
 
-       finger[id].status = status & MXT_MOVE ?
-                               MXT_MOVE : MXT_PRESS;
-       finger[id].x = x;
-       finger[id].y = y;
-       finger[id].area = area;
-       finger[id].pressure = pressure;
+       if (count > 0)
+               ret = mxt_proc_messages(data, count);
 
-       mxt_input_report(data, id);
+       return ret;
 }
 
-static irqreturn_t mxt_interrupt(int irq, void *dev_id)
+static bool mxt_in_bootloader(struct mxt_data *data)
 {
-       struct mxt_data *data = dev_id;
-       struct mxt_message message;
-       struct mxt_object *object;
-       struct device *dev = &data->client->dev;
-       int id;
-       u8 reportid;
-       u8 max_reportid;
-       u8 min_reportid;
+       struct i2c_client *client = data->client;
+       return (client->addr == MXT_BOOT_LOW || client->addr == MXT_BOOT_HIGH);
+}
 
-       do {
-               if (mxt_read_message(data, &message)) {
-                       dev_err(dev, "Failed to read message\n");
-                       goto end;
-               }
+static int mxt_enter_bl(struct mxt_data *data)
+{
+       struct i2c_client *client = data->client;
+       struct device *dev = &client->dev;
+       int ret;
+
+       if (mxt_in_bootloader(data))
+               return 0;
+
+       disable_irq(data->irq);
 
-               reportid = message.reportid;
+       /* Change to the bootloader mode */
+       ret = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,
+                              MXT_COMMAND_RESET, MXT_BOOT_VALUE);
+       if (ret) {
+               enable_irq(data->irq);
+               return ret;
+       }
 
-               /* whether reportid is thing of MXT_TOUCH_MULTI_T9 */
-               object = mxt_get_object(data, MXT_TOUCH_MULTI_T9);
-               if (!object)
-                       goto end;
+       /* Change to slave address of bootloader */
+       if (client->addr == MXT_APP_LOW)
+               client->addr = MXT_BOOT_LOW;
+       else
+               client->addr = MXT_BOOT_HIGH;
 
-               max_reportid = object->max_reportid;
-               min_reportid = max_reportid - object->num_report_ids + 1;
-               id = reportid - min_reportid;
+       INIT_COMPLETION(data->bl_completion);
+       enable_irq(data->irq);
 
-               if (reportid >= min_reportid && reportid <= max_reportid)
-                       mxt_input_touchevent(data, &message, id);
+       /* Wait for CHG assert to indicate successful reset into bootloader */
+       ret = mxt_wait_for_chg(data, MXT_RESET_TIME);
+       if (ret) {
+               dev_err(dev, "Failed waiting for reset to bootloader.\n");
+               if (client->addr == MXT_BOOT_LOW)
+                       client->addr = MXT_APP_LOW;
                else
-                       mxt_dump_message(dev, &message);
-       } while (reportid != 0xff);
+                       client->addr = MXT_APP_HIGH;
+               return ret;
+       }
+       return 0;
+}
+
+static void mxt_exit_bl(struct mxt_data *data)
+{
+       struct i2c_client *client = data->client;
+       struct device *dev = &client->dev;
+       int error;
+
+       if (!mxt_in_bootloader(data))
+               return;
+
+       /* Wait for reset */
+       mxt_wait_for_chg(data, MXT_FWRESET_TIME);
+
+       disable_irq(data->irq);
+       if (client->addr == MXT_BOOT_LOW)
+               client->addr = MXT_APP_LOW;
+       else
+               client->addr = MXT_APP_HIGH;
+
+       kfree(data->object_table);
+       data->object_table = NULL;
+
+       error = mxt_initialize(data);
+       if (error) {
+               dev_err(dev, "Failed to initialize on exit bl. error = %d\n",
+                       error);
+       }
+
+       error = mxt_handle_messages(data);
+       if (error)
+               dev_err(dev, "Handle messages failed after init. error = %d\n",
+                       error);
+       enable_irq(data->irq);
+}
+
+static irqreturn_t mxt_interrupt(int irq, void *dev_id)
+{
+       struct mxt_data *data = (struct mxt_data *)dev_id;
 
-end:
+       if (mxt_in_bootloader(data)) {
+               /* bootloader state transition completion */
+               complete(&data->bl_completion);
+       } else {
+               mxt_handle_messages(data);
+       }
        return IRQ_HANDLED;
 }
 
-static int mxt_check_reg_init(struct mxt_data *data)
+static int mxt_apply_pdata_config(struct mxt_data *data)
 {
        const struct mxt_platform_data *pdata = data->pdata;
-       struct mxt_object *object;
        struct device *dev = &data->client->dev;
-       int index = 0;
-       int i, j, config_offset;
+       int i, offset;
+       int ret;
 
        if (!pdata->config) {
-               dev_dbg(dev, "No cfg data defined, skipping reg init\n");
+               dev_info(dev, "No cfg data defined, skipping reg init\n");
                return 0;
        }
 
-       for (i = 0; i < data->info.object_num; i++) {
-               object = data->object_table + i;
+       for (offset = 0, i = 0; i < data->info.object_num; i++) {
+               struct mxt_object *object = &data->object_table[i];
+               size_t config_size;
 
                if (!mxt_object_writable(object->type))
                        continue;
 
-               for (j = 0;
-                    j < (object->size + 1) * (object->instances + 1);
-                    j++) {
-                       config_offset = index + j;
-                       if (config_offset > pdata->config_length) {
-                               dev_err(dev, "Not enough config data!\n");
-                               return -EINVAL;
-                       }
-                       mxt_write_object(data, object->type, j,
-                                        pdata->config[config_offset]);
+               config_size = object->size * object->instances;
+               if (offset + config_size > pdata->config_length) {
+                       dev_err(dev, "Not enough config data!\n");
+                       return -EINVAL;
                }
-               index += (object->size + 1) * (object->instances + 1);
+
+               ret = mxt_write_reg(data->client, object->start_address,
+                                   config_size, &pdata->config[offset]);
+               if (ret)
+                       return ret;
+               offset += config_size;
        }
 
        return 0;
 }
 
-static int mxt_make_highchg(struct mxt_data *data)
+static int mxt_handle_pdata(struct mxt_data *data)
 {
+       const struct mxt_platform_data *pdata = data->pdata;
        struct device *dev = &data->client->dev;
-       struct mxt_message message;
-       int count = 10;
-       int error;
-
-       /* Read dummy message to make high CHG pin */
-       do {
-               error = mxt_read_message(data, &message);
-               if (error)
-                       return error;
-       } while (message.reportid != 0xff && --count);
+       u8 voltage;
+       int ret;
 
-       if (!count) {
-               dev_err(dev, "CHG pin isn't cleared\n");
-               return -EBUSY;
+       if (!pdata) {
+               dev_info(dev, "No platform data provided\n");
+               return 0;
        }
 
-       return 0;
-}
-
-static void mxt_handle_pdata(struct mxt_data *data)
-{
-       const struct mxt_platform_data *pdata = data->pdata;
-       u8 voltage;
+       ret = mxt_apply_pdata_config(data);
+       if (ret)
+               return ret;
 
        /* Set touchscreen lines */
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_XSIZE,
-                       pdata->x_line);
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_YSIZE,
-                       pdata->y_line);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_XSIZE, pdata->x_line);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_YSIZE, pdata->y_line);
 
        /* Set touchscreen orient */
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9, MXT_TOUCH_ORIENT,
-                       pdata->orient);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_ORIENT, pdata->orient);
 
        /* Set touchscreen burst length */
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_BLEN, pdata->blen);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_BLEN, pdata->blen);
 
        /* Set touchscreen threshold */
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_TCHTHR, pdata->threshold);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_TCHTHR, pdata->threshold);
 
        /* Set touchscreen resolution */
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_XRANGE_LSB, (pdata->x_size - 1) & 0xff);
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_XRANGE_MSB, (pdata->x_size - 1) >> 8);
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_YRANGE_LSB, (pdata->y_size - 1) & 0xff);
-       mxt_write_object(data, MXT_TOUCH_MULTI_T9,
-                       MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_XRANGE_LSB, (pdata->x_size - 1) & 0xff);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_XRANGE_MSB, (pdata->x_size - 1) >> 8);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_YRANGE_LSB, (pdata->y_size - 1) & 0xff);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0,
+                        MXT_TOUCH_YRANGE_MSB, (pdata->y_size - 1) >> 8);
 
        /* Set touchscreen voltage */
        if (pdata->voltage) {
@@ -745,206 +973,198 @@ static void mxt_handle_pdata(struct mxt_data *data)
                        voltage = (pdata->voltage - MXT_VOLTAGE_DEFAULT) /
                                MXT_VOLTAGE_STEP;
 
-               mxt_write_object(data, MXT_SPT_CTECONFIG_T28,
-                               MXT_CTE_VOLTAGE, voltage);
+               mxt_write_object(data, MXT_SPT_CTECONFIG_T28, 0,
+                                MXT_CTE_VOLTAGE, voltage);
        }
+
+       return 0;
 }
 
-static int mxt_get_info(struct mxt_data *data)
+/* Update 24-bit CRC with two new bytes of data */
+static u32 crc24_step(u32 crc, u8 byte1, u8 byte2)
 {
-       struct i2c_client *client = data->client;
-       struct mxt_info *info = &data->info;
-       int error;
-       u8 val;
+       const u32 crcpoly = 0x80001b;
+       u16 data = byte1 | (byte2 << 8);
+       u32 result = data ^ (crc << 1);
 
-       error = mxt_read_reg(client, MXT_FAMILY_ID, &val);
-       if (error)
-               return error;
-       info->family_id = val;
+       /* XOR result with crcpoly if bit 25 is set (overflow occurred) */
+       if (result & 0x01000000)
+               result ^= crcpoly;
 
-       error = mxt_read_reg(client, MXT_VARIANT_ID, &val);
-       if (error)
-               return error;
-       info->variant_id = val;
+       return result & 0x00ffffff;
+}
 
-       error = mxt_read_reg(client, MXT_VERSION, &val);
-       if (error)
-               return error;
-       info->version = val;
+static u32 crc24(u32 crc, const u8 *data, size_t len)
+{
+       size_t i;
 
-       error = mxt_read_reg(client, MXT_BUILD, &val);
-       if (error)
-               return error;
-       info->build = val;
+       for (i = 0; i < len - 1; i += 2)
+               crc = crc24_step(crc, data[i], data[i + 1]);
 
-       error = mxt_read_reg(client, MXT_OBJECT_NUM, &val);
-       if (error)
-               return error;
-       info->object_num = val;
+       /* If there were an odd number of bytes pad with 0 */
+       if (i < len)
+               crc = crc24_step(crc, data[i], 0);
 
-       return 0;
+       return crc;
 }
 
-static int mxt_get_object_table(struct mxt_data *data)
+static int mxt_verify_info_block_csum(struct mxt_data *data, const void *buf)
 {
-       int error;
-       int i;
-       u16 reg;
-       u8 reportid = 0;
-       u8 buf[MXT_OBJECT_SIZE];
-
-       for (i = 0; i < data->info.object_num; i++) {
-               struct mxt_object *object = data->object_table + i;
+       struct i2c_client *client = data->client;
+       struct device *dev = &client->dev;
+       size_t object_table_size, info_block_size;
+       u32 crc = 0;
+       u8 *info_block;
+       int ret = 0;
+
+       object_table_size = data->info.object_num * MXT_OBJECT_SIZE;
+       info_block_size = sizeof(data->info) + object_table_size;
+       info_block = kmalloc(info_block_size, GFP_KERNEL);
+       if (!info_block)
+               return -ENOMEM;
 
-               reg = MXT_OBJECT_START + MXT_OBJECT_SIZE * i;
-               error = mxt_read_object_table(data->client, reg, buf);
-               if (error)
-                       return error;
-
-               object->type = buf[0];
-               object->start_address = (buf[2] << 8) | buf[1];
-               object->size = buf[3];
-               object->instances = buf[4];
-               object->num_report_ids = buf[5];
-
-               if (object->num_report_ids) {
-                       reportid += object->num_report_ids *
-                                       (object->instances + 1);
-                       object->max_reportid = reportid;
-               }
+       /*
+        * Information Block CRC is computed over both ID info and Object Table
+        * So concat them in a temporary buffer, before computing CRC.
+        * TODO: refactor how the info block is read from the device such
+        * that it ends up in a single buffer and this copy is not needed.
+        */
+       memcpy(info_block, &data->info, sizeof(data->info));
+       memcpy(&info_block[sizeof(data->info)], buf, object_table_size);
+
+       crc = crc24(crc, info_block, info_block_size);
+
+       if (crc != data->info_csum) {
+               dev_err(dev, "Information Block CRC mismatch: %06x != %06x\n",
+                       data->info_csum, crc);
+               ret = -EINVAL;
        }
 
-       return 0;
+       kfree(info_block);
+       return ret;
 }
 
-static int mxt_initialize(struct mxt_data *data)
+static int mxt_get_object_table(struct mxt_data *data)
 {
        struct i2c_client *client = data->client;
-       struct mxt_info *info = &data->info;
+       struct device *dev = &client->dev;
        int error;
-       u8 val;
-
-       error = mxt_get_info(data);
-       if (error)
-               return error;
+       int i;
+       u8 reportid;
+       u8 buf[data->info.object_num][MXT_OBJECT_SIZE];
+       u8 csum[3];
 
-       data->object_table = kcalloc(info->object_num,
-                                    sizeof(struct mxt_object),
-                                    GFP_KERNEL);
+       data->object_table = kcalloc(data->info.object_num,
+                                    sizeof(struct mxt_object), GFP_KERNEL);
        if (!data->object_table) {
-               dev_err(&client->dev, "Failed to allocate memory\n");
+               dev_err(dev, "Failed to allocate object table\n");
                return -ENOMEM;
        }
 
-       /* Get object table information */
-       error = mxt_get_object_table(data);
+       error = mxt_read_reg(client, MXT_OBJECT_START, sizeof(buf), buf);
        if (error)
                return error;
 
-       /* Check register init values */
-       error = mxt_check_reg_init(data);
+       /*
+        * Read Information Block checksum from 3 bytes immediately following
+        * info block
+        */
+       error = mxt_read_reg(client, MXT_OBJECT_START + sizeof(buf),
+                            sizeof(csum), csum);
        if (error)
                return error;
 
-       mxt_handle_pdata(data);
-
-       /* Backup to memory */
-       mxt_write_object(data, MXT_GEN_COMMAND_T6,
-                       MXT_COMMAND_BACKUPNV,
-                       MXT_BACKUP_VALUE);
-       msleep(MXT_BACKUP_TIME);
-
-       /* Soft reset */
-       mxt_write_object(data, MXT_GEN_COMMAND_T6,
-                       MXT_COMMAND_RESET, 1);
-       msleep(MXT_RESET_TIME);
-
-       /* Update matrix size at info struct */
-       error = mxt_read_reg(client, MXT_MATRIX_X_SIZE, &val);
-       if (error)
-               return error;
-       info->matrix_xsize = val;
+       data->info_csum = csum[0] | (csum[1] << 8) | (csum[2] << 16);
+       dev_info(dev, "Information Block Checksum = %06x\n", data->info_csum);
 
-       error = mxt_read_reg(client, MXT_MATRIX_Y_SIZE, &val);
+       error = mxt_verify_info_block_csum(data, buf);
        if (error)
                return error;
-       info->matrix_ysize = val;
 
-       dev_info(&client->dev,
-                       "Family ID: %d Variant ID: %d Version: %d Build: %d\n",
-                       info->family_id, info->variant_id, info->version,
-                       info->build);
-
-       dev_info(&client->dev,
-                       "Matrix X Size: %d Matrix Y Size: %d Object Num: %d\n",
-                       info->matrix_xsize, info->matrix_ysize,
-                       info->object_num);
+       /* Valid Report IDs start counting from 1 */
+       reportid = 1;
+       for (i = 0; i < data->info.object_num; i++) {
+               struct mxt_object *object = &data->object_table[i];
+               u8 num_ids, min_id, max_id;
+
+               object->type = buf[i][0];
+               object->start_address = (buf[i][2] << 8) | buf[i][1];
+               object->size = buf[i][3] + 1;
+               object->instances = buf[i][4] + 1;
+               object->num_report_ids = buf[i][5];
+
+               num_ids = object->num_report_ids * object->instances;
+               min_id = num_ids ? reportid : 0;
+               max_id = num_ids ? reportid + num_ids - 1 : 0;
+               reportid += num_ids;
+
+               dev_info(dev,
+                        "Type %2d Start %3d Size %3d Instances %2d ReportIDs %3u : %3u\n",
+                        object->type, object->start_address, object->size,
+                        object->instances, min_id, max_id);
+
+               /* Save data for objects used when processing interrupts */
+               switch (object->type) {
+               case MXT_GEN_MESSAGE_T5:
+                       data->T5_address = object->start_address;
+                       break;
+               case MXT_GEN_COMMAND_T6:
+                       data->T6_reportid = min_id;
+                       break;
+               case MXT_TOUCH_MULTI_T9:
+                       data->T9_reportid_min = min_id;
+                       data->T9_reportid_max = max_id;
+                       break;
+               case MXT_SPT_GPIOPWM_T19:
+                       data->T19_reportid = min_id;
+                       break;
+               case MXT_SPT_MESSAGECOUNT_T44:
+                       data->T44_address = object->start_address;
+                       break;
+               }
+       }
 
        return 0;
 }
 
-static void mxt_calc_resolution(struct mxt_data *data)
+static int mxt_calc_resolution(struct mxt_data *data)
 {
-       unsigned int max_x = data->pdata->x_size - 1;
-       unsigned int max_y = data->pdata->y_size - 1;
+       struct i2c_client *client = data->client;
+       u8 orient;
+       __le16 xyrange[2];
+       unsigned int max_x, max_y;
+       int ret;
+
+       struct mxt_object *T9 = mxt_get_object(data, MXT_TOUCH_MULTI_T9);
+       if (T9 == NULL)
+               return -EINVAL;
+
+       /* Get touchscreen resolution */
+       ret = mxt_read_reg(client, T9->start_address + MXT_TOUCH_XRANGE_LSB,
+                          4, xyrange);
+       if (ret)
+               return ret;
+
+       ret = mxt_read_reg(client, T9->start_address + MXT_TOUCH_ORIENT,
+                          1, &orient);
+       if (ret)
+               return ret;
 
-       if (data->pdata->orient & MXT_XY_SWITCH) {
+       max_x = le16_to_cpu(xyrange[0]);
+       max_y = le16_to_cpu(xyrange[1]);
+
+       if (orient & MXT_XY_SWITCH) {
                data->max_x = max_y;
                data->max_y = max_x;
        } else {
                data->max_x = max_x;
                data->max_y = max_y;
        }
+
+       return 0;
 }
 
-static ssize_t mxt_object_show(struct device *dev,
-                                   struct device_attribute *attr, char *buf)
-{
-       struct mxt_data *data = dev_get_drvdata(dev);
-       struct mxt_object *object;
-       int count = 0;
-       int i, j;
-       int error;
-       u8 val;
-
-       for (i = 0; i < data->info.object_num; i++) {
-               object = data->object_table + i;
-
-               count += snprintf(buf + count, PAGE_SIZE - count,
-                               "Object[%d] (Type %d)\n",
-                               i + 1, object->type);
-               if (count >= PAGE_SIZE)
-                       return PAGE_SIZE - 1;
-
-               if (!mxt_object_readable(object->type)) {
-                       count += snprintf(buf + count, PAGE_SIZE - count,
-                                       "\n");
-                       if (count >= PAGE_SIZE)
-                               return PAGE_SIZE - 1;
-                       continue;
-               }
-
-               for (j = 0; j < object->size + 1; j++) {
-                       error = mxt_read_object(data,
-                                               object->type, j, &val);
-                       if (error)
-                               return error;
-
-                       count += snprintf(buf + count, PAGE_SIZE - count,
-                                       "\t[%2d]: %02x (%d)\n", j, val, val);
-                       if (count >= PAGE_SIZE)
-                               return PAGE_SIZE - 1;
-               }
-
-               count += snprintf(buf + count, PAGE_SIZE - count, "\n");
-               if (count >= PAGE_SIZE)
-                       return PAGE_SIZE - 1;
-       }
-
-       return count;
-}
-
-static int mxt_load_fw(struct device *dev, const char *fn)
+static int mxt_load_fw(struct device *dev, const char *fn)
 {
        struct mxt_data *data = dev_get_drvdata(dev);
        struct i2c_client *client = data->client;
@@ -959,31 +1179,29 @@ static int mxt_load_fw(struct device *dev, const char *fn)
                return ret;
        }
 
-       /* Change to the bootloader mode */
-       mxt_write_object(data, MXT_GEN_COMMAND_T6,
-                       MXT_COMMAND_RESET, MXT_BOOT_VALUE);
-       msleep(MXT_RESET_TIME);
-
-       /* Change to slave address of bootloader */
-       if (client->addr == MXT_APP_LOW)
-               client->addr = MXT_BOOT_LOW;
-       else
-               client->addr = MXT_BOOT_HIGH;
+       if (!mxt_in_bootloader(data)) {
+               ret = mxt_enter_bl(data);
+               if (ret) {
+                       dev_err(dev, "Failed to reset to bootloader.\n");
+                       goto out;
+               }
+       }
 
-       ret = mxt_check_bootloader(client, MXT_WAITING_BOOTLOAD_CMD);
+       ret = mxt_check_bootloader(data, MXT_WAITING_BOOTLOAD_CMD);
        if (ret)
                goto out;
 
        /* Unlock bootloader */
-       mxt_unlock_bootloader(client);
+       ret = mxt_unlock_bootloader(client);
+       if (ret)
+               goto out;
 
        while (pos < fw->size) {
-               ret = mxt_check_bootloader(client,
-                                               MXT_WAITING_FRAME_DATA);
+               ret = mxt_check_bootloader(data, MXT_WAITING_FRAME_DATA);
                if (ret)
                        goto out;
 
-               frame_size = ((*(fw->data + pos) << 8) | *(fw->data + pos + 1));
+               frame_size = (fw->data[pos] << 8) + fw->data[pos + 1];
 
                /* We should add 2 at frame size as the the firmware data is not
                 * included the CRC bytes.
@@ -991,28 +1209,332 @@ static int mxt_load_fw(struct device *dev, const char *fn)
                frame_size += 2;
 
                /* Write one frame to device */
-               mxt_fw_write(client, fw->data + pos, frame_size);
+               ret = mxt_fw_write(client, fw->data + pos, frame_size);
+               if (ret)
+                       goto out;
 
-               ret = mxt_check_bootloader(client,
-                                               MXT_FRAME_CRC_PASS);
+               ret = mxt_check_bootloader(data, MXT_FRAME_CRC_PASS);
                if (ret)
                        goto out;
 
                pos += frame_size;
-
                dev_dbg(dev, "Updated %d bytes / %zd bytes\n", pos, fw->size);
        }
 
+       /* Device exits bl mode to app mode only if successful */
+       mxt_exit_bl(data);
 out:
        release_firmware(fw);
+       return ret;
+}
 
-       /* Change to slave address of application */
-       if (client->addr == MXT_BOOT_LOW)
-               client->addr = MXT_APP_LOW;
+/*
+ * Helper function for performing a T6 diagnostic command
+ */
+static int mxt_T6_diag_cmd(struct mxt_data *data, struct mxt_object *T6,
+                          u8 cmd)
+{
+       int ret;
+       u16 addr = T6->start_address + MXT_COMMAND_DIAGNOSTIC;
+
+       ret = mxt_write_reg(data->client, addr, 1, &cmd);
+       if (ret)
+               return ret;
+
+       /*
+        * Poll T6.diag until it returns 0x00, which indicates command has
+        * completed.
+        */
+       while (cmd != 0) {
+               ret = mxt_read_reg(data->client, addr, 1, &cmd);
+               if (ret)
+                       return ret;
+       }
+       return 0;
+}
+
+/*
+ * SysFS Helper function for reading DELTAS and REFERENCE values for T37 object
+ *
+ * For both modes, a T37_buf is allocated to stores matrix_xsize * matrix_ysize
+ * 2-byte (little-endian) values, which are returned to userspace unmodified.
+ *
+ * It is left to userspace to parse the 2-byte values.
+ * - deltas are signed 2's complement 2-byte little-endian values.
+ *     s32 delta = (b[0] + (b[1] << 8));
+ * - refs are signed 'offset binary' 2-byte little-endian values, with offset
+ *   value 0x4000:
+ *     s32 ref = (b[0] + (b[1] << 8)) - 0x4000;
+ */
+static ssize_t mxt_T37_fetch(struct mxt_data *data, u8 mode)
+{
+       struct mxt_object *T6, *T37;
+       u8 *obuf;
+       ssize_t ret = 0;
+       size_t i;
+       size_t T37_buf_size, num_pages;
+       size_t pos;
+
+       if (!data || !data->object_table)
+               return -ENODEV;
+
+       T6 = mxt_get_object(data, MXT_GEN_COMMAND_T6);
+       T37 = mxt_get_object(data, MXT_DEBUG_DIAGNOSTIC_T37);
+       if (!T6 || T6->size < 6 || !T37 || T37->size < 3) {
+               dev_err(&data->client->dev, "Invalid T6 or T37 object\n");
+               return -ENODEV;
+       }
+
+       /* Something has gone wrong if T37_buf is already allocated */
+       if (data->T37_buf)
+               return -EINVAL;
+
+       T37_buf_size = data->info.matrix_xsize * data->info.matrix_ysize *
+                      sizeof(__le16);
+       data->T37_buf_size = T37_buf_size;
+       data->T37_buf = kmalloc(data->T37_buf_size, GFP_KERNEL);
+       if (!data->T37_buf)
+               return -ENOMEM;
+
+       /* Temporary buffer used to fetch one T37 page */
+       obuf = kmalloc(T37->size, GFP_KERNEL);
+       if (!obuf)
+               return -ENOMEM;
+
+       disable_irq(data->irq);
+       num_pages = DIV_ROUND_UP(T37_buf_size, T37->size - 2);
+       pos = 0;
+       for (i = 0; i < num_pages; i++) {
+               u8 cmd;
+               size_t chunk_len;
+
+               /* For first page, send mode as cmd, otherwise PageUp */
+               cmd = (i == 0) ? mode : MXT_T6_CMD_PAGE_UP;
+               ret = mxt_T6_diag_cmd(data, T6, cmd);
+               if (ret)
+                       goto err_free_T37_buf;
+
+               ret = mxt_read_object(data, T37, 0, obuf);
+               if (ret)
+                       goto err_free_T37_buf;
+
+               /* Verify first two bytes are current mode and page # */
+               if (obuf[0] != mode) {
+                       dev_err(&data->client->dev,
+                               "Unexpected mode (%u != %u)\n", obuf[0], mode);
+                       ret = -EIO;
+                       goto err_free_T37_buf;
+               }
+
+               if (obuf[1] != i) {
+                       dev_err(&data->client->dev,
+                               "Unexpected page (%u != %zu)\n", obuf[1], i);
+                       ret = -EIO;
+                       goto err_free_T37_buf;
+               }
+
+               /*
+                * Copy the data portion of the page, or however many bytes are
+                * left, whichever is less.
+                */
+               chunk_len = min((size_t)T37->size - 2, T37_buf_size - pos);
+               memcpy(&data->T37_buf[pos], &obuf[2], chunk_len);
+               pos += chunk_len;
+       }
+
+       goto out;
+
+err_free_T37_buf:
+       kfree(data->T37_buf);
+       data->T37_buf = NULL;
+       data->T37_buf_size = 0;
+out:
+       kfree(obuf);
+       enable_irq(data->irq);
+       return ret ?: 0;
+}
+
+/*
+ **************************************************************
+ * sysfs interface
+ **************************************************************
+*/
+static ssize_t mxt_backupnv_store(struct device *dev,
+                                 struct device_attribute *attr,
+                                 const char *buf, size_t count)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       int ret;
+
+       /* Backup non-volatile memory */
+       ret = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,
+                              MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE);
+       if (ret)
+               return ret;
+       msleep(MXT_BACKUP_TIME);
+
+       return count;
+}
+
+static ssize_t mxt_calibrate_store(struct device *dev,
+                                  struct device_attribute *attr,
+                                  const char *buf, size_t count)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       int ret;
+
+       disable_irq(data->irq);
+
+       /* Perform touch surface recalibration */
+       ret = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,
+                              MXT_COMMAND_CALIBRATE, 1);
+       if (ret)
+               return ret;
+       msleep(MXT_CAL_TIME);
+
+       enable_irq(data->irq);
+
+       return count;
+}
+
+static ssize_t mxt_config_csum_show(struct device *dev,
+                                   struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       return scnprintf(buf, PAGE_SIZE, "%06x\n", data->config_csum);
+}
+
+static ssize_t mxt_fw_file_show(struct device *dev,
+                               struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       return scnprintf(buf, PAGE_SIZE, "%s\n", data->fw_file);
+}
+
+static int mxt_update_file_name(struct device *dev, char** file_name,
+                               const char *buf, size_t count)
+{
+       char *file_name_tmp;
+
+       /* Simple sanity check */
+       if (count > 64) {
+               dev_warn(dev, "File name too long\n");
+               return -EINVAL;
+       }
+
+       file_name_tmp = krealloc(*file_name, count + 1, GFP_KERNEL);
+       if (!file_name_tmp) {
+               dev_warn(dev, "no memory\n");
+               return -ENOMEM;
+       }
+
+       *file_name = file_name_tmp;
+       memcpy(*file_name, buf, count);
+
+       /* Echo into the sysfs entry may append newline at the end of buf */
+       if (buf[count - 1] == '\n')
+               (*file_name)[count - 1] = '\0';
        else
-               client->addr = MXT_APP_HIGH;
+               (*file_name)[count] = '\0';
 
-       return ret;
+       return 0;
+}
+
+static ssize_t mxt_fw_file_store(struct device *dev,
+                                struct device_attribute *attr,
+                                const char *buf, size_t count)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       int ret;
+
+       ret = mxt_update_file_name(dev, &data->fw_file, buf, count);
+       if (ret)
+               return ret;
+
+       return count;
+}
+
+static ssize_t mxt_config_file_show(struct device *dev,
+                                   struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       return scnprintf(buf, PAGE_SIZE, "%s\n", data->config_file);
+}
+
+static ssize_t mxt_config_file_store(struct device *dev,
+                                    struct device_attribute *attr,
+                                    const char *buf, size_t count)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       int ret;
+
+       ret = mxt_update_file_name(dev, &data->config_file, buf, count);
+       return ret ? ret : count;
+}
+
+static ssize_t mxt_fw_version_show(struct device *dev,
+                              struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       struct mxt_info *info = &data->info;
+       return scnprintf(buf, PAGE_SIZE, "%d.%d.%d\n",
+                        info->version >> 4, info->version & 0xf, info->build);
+}
+
+/* Hardware Version is <FamilyID>.<VariantID> */
+static ssize_t mxt_hw_version_show(struct device *dev,
+                                  struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       struct mxt_info *info = &data->info;
+       return scnprintf(buf, PAGE_SIZE, "%d.%d\n",
+                        info->family_id, info->variant_id);
+}
+
+static ssize_t mxt_info_csum_show(struct device *dev,
+                                 struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       return scnprintf(buf, PAGE_SIZE, "%06x\n", data->info_csum);
+}
+
+/* Matrix Size is <MatrixSizeX> <MatrixSizeY> */
+static ssize_t mxt_matrix_size_show(struct device *dev,
+                                   struct device_attribute *attr, char *buf)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       struct mxt_info *info = &data->info;
+       return scnprintf(buf, PAGE_SIZE, "%u %u\n",
+                        info->matrix_xsize, info->matrix_ysize);
+}
+
+static ssize_t mxt_object_store(struct device *dev,
+                               struct device_attribute *attr,
+                               const char *buf, size_t count)
+{
+       struct mxt_data *data = dev_get_drvdata(dev);
+       int ret;
+       u32 param;
+       u8 type, instance, offset, val;
+
+       ret = kstrtou32(buf, 16, &param);
+       if (ret < 0)
+               return -EINVAL;
+
+       /*
+        * Byte Write Command is encoded in 32-bit word: TTIIOOVV:
+        * <Type> <Instance> <Offset> <Value>
+        */
+       type = (param & 0xff000000) >> 24;
+       instance = (param & 0x00ff0000) >> 16;
+       offset = (param & 0x0000ff00) >> 8;
+       val = param & 0x000000ff;
+
+       ret = mxt_write_object(data, type, instance, offset, val);
+       if (ret)
+               return ret;
+
+       return count;
 }
 
 static ssize_t mxt_update_fw_store(struct device *dev,
@@ -1022,37 +1544,40 @@ static ssize_t mxt_update_fw_store(struct device *dev,
        struct mxt_data *data = dev_get_drvdata(dev);
        int error;
 
-       disable_irq(data->irq);
-
-       error = mxt_load_fw(dev, MXT_FW_NAME);
+       error = mxt_load_fw(dev, data->fw_file);
        if (error) {
                dev_err(dev, "The firmware update failed(%d)\n", error);
                count = error;
        } else {
                dev_dbg(dev, "The firmware update succeeded\n");
-
-               /* Wait for reset */
-               msleep(MXT_FWRESET_TIME);
-
-               kfree(data->object_table);
-               data->object_table = NULL;
-
-               mxt_initialize(data);
        }
-
-       enable_irq(data->irq);
-
-       error = mxt_make_highchg(data);
-       if (error)
-               return error;
-
        return count;
 }
 
-static DEVICE_ATTR(object, 0444, mxt_object_show, NULL);
-static DEVICE_ATTR(update_fw, 0664, NULL, mxt_update_fw_store);
+static DEVICE_ATTR(backupnv, S_IWUSR, NULL, mxt_backupnv_store);
+static DEVICE_ATTR(calibrate, S_IWUSR, NULL, mxt_calibrate_store);
+static DEVICE_ATTR(config_csum, S_IRUGO, mxt_config_csum_show, NULL);
+static DEVICE_ATTR(fw_file, S_IRUGO | S_IWUSR, mxt_fw_file_show,
+                  mxt_fw_file_store);
+static DEVICE_ATTR(config_file, S_IRUGO | S_IWUSR, mxt_config_file_show,
+                  mxt_config_file_store);
+static DEVICE_ATTR(fw_version, S_IRUGO, mxt_fw_version_show, NULL);
+static DEVICE_ATTR(hw_version, S_IRUGO, mxt_hw_version_show, NULL);
+static DEVICE_ATTR(info_csum, S_IRUGO, mxt_info_csum_show, NULL);
+static DEVICE_ATTR(matrix_size, S_IRUGO, mxt_matrix_size_show, NULL);
+static DEVICE_ATTR(object, S_IWUSR, NULL, mxt_object_store);
+static DEVICE_ATTR(update_fw, S_IWUSR, NULL, mxt_update_fw_store);
 
 static struct attribute *mxt_attrs[] = {
+       &dev_attr_backupnv.attr,
+       &dev_attr_calibrate.attr,
+       &dev_attr_config_csum.attr,
+       &dev_attr_fw_file.attr,
+       &dev_attr_config_file.attr,
+       &dev_attr_fw_version.attr,
+       &dev_attr_hw_version.attr,
+       &dev_attr_info_csum.attr,
+       &dev_attr_matrix_size.attr,
        &dev_attr_object.attr,
        &dev_attr_update_fw.attr,
        NULL
@@ -1062,18 +1587,363 @@ static const struct attribute_group mxt_attr_group = {
        .attrs = mxt_attrs,
 };
 
+/*
+ **************************************************************
+ * debugfs helper functions
+ **************************************************************
+*/
+
+/*
+ * Print the formatted string into the end of string |*str| which has size
+ * |*str_size|. Extra space will be allocated to hold the formatted string
+ * and |*str_size| will be updated accordingly.
+ */
+static int mxt_asprintf(char **str, size_t *str_size, const char *fmt, ...)
+{
+       unsigned int len;
+       va_list ap, aq;
+       int ret;
+       char *str_tmp;
+
+       va_start(ap, fmt);
+       va_copy(aq, ap);
+       len = vsnprintf(NULL, 0, fmt, aq);
+       va_end(aq);
+
+       str_tmp = krealloc(*str, *str_size + len + 1, GFP_KERNEL);
+       if (str_tmp == NULL)
+               return -ENOMEM;
+
+       *str = str_tmp;
+
+       ret = vsnprintf(*str + *str_size, len + 1, fmt, ap);
+       va_end(ap);
+
+       if (ret != len)
+               return -EINVAL;
+
+       *str_size += len;
+
+       return 0;
+}
+
+static int mxt_object_fetch(struct mxt_data *data)
+{
+       size_t count = 0;
+       size_t i, j, k;
+       int ret = 0;
+       char *str = NULL;
+       u8 *obuf = NULL;
+       u8 *obuf_tmp = NULL;
+
+       if (data->object_str)
+               return -EINVAL;
+
+       for (i = 0; i < data->info.object_num; i++) {
+               struct mxt_object *object = &data->object_table[i];
+
+               if (!mxt_object_readable(object->type))
+                       continue;
+
+               ret = mxt_asprintf(&str, &count, "\nType: %u\n",
+                                  object->type);
+               if (ret)
+                       goto err;
+
+               obuf_tmp = krealloc(obuf, object->size, GFP_KERNEL);
+               if (!obuf_tmp) {
+                       ret = -ENOMEM;
+                       goto err;
+               }
+
+               obuf = obuf_tmp;
+
+               for (j = 0; j < object->instances; j++) {
+                       if (object->instances > 1) {
+                               ret = mxt_asprintf(&str, &count,
+                                                  "Instance: %zu\n", j);
+                               if (ret)
+                                       goto err;
+                       }
+
+                       ret = mxt_read_object(data, object, j, obuf);
+                       if (ret)
+                               goto err;
+
+                       for (k = 0; k < object->size; k++) {
+                               ret = mxt_asprintf(&str, &count,
+                                                  "\t[%2zu]: %02x (%d)\n",
+                                                  k, obuf[k], obuf[k]);
+                               if (ret)
+                                       goto err;
+                       }
+               }
+       }
+
+       goto done;
+
+err:
+       kfree(str);
+       str = NULL;
+       count = 0;
+done:
+       data->object_str = str;
+       data->object_str_size = count;
+       kfree(obuf);
+       return ret;
+}
+
+/*
+ **************************************************************
+ * debugfs interface
+ **************************************************************
+*/
+static int mxt_debugfs_T37_open(struct inode *inode, struct file *file)
+{
+       struct mxt_data *mxt = inode->i_private;
+       int ret;
+       u8 cmd;
+
+       if (file->f_dentry == mxt->dentry_deltas)
+               cmd = MXT_T6_CMD_DELTAS;
+       else if (file->f_dentry == mxt->dentry_refs)
+               cmd = MXT_T6_CMD_REFS;
+       else
+               return -EINVAL;
+
+       /* Only allow one T37 debugfs file to be opened at a time */
+       ret = mutex_lock_interruptible(&mxt->T37_buf_mutex);
+       if (ret)
+               return ret;
+
+       if (!i2c_use_client(mxt->client)) {
+               ret = -ENODEV;
+               goto err_unlock;
+       }
+
+       /* Fetch all T37 pages into mxt->T37_buf */
+       ret = mxt_T37_fetch(mxt, cmd);
+       if (ret)
+               goto err_release;
+
+       file->private_data = mxt;
+
+       return 0;
+
+err_release:
+       i2c_release_client(mxt->client);
+err_unlock:
+       mutex_unlock(&mxt->T37_buf_mutex);
+       return ret;
+}
+
+static int mxt_debugfs_T37_release(struct inode *inode, struct file *file)
+{
+       struct mxt_data *mxt = file->private_data;
+
+       file->private_data = NULL;
+
+       kfree(mxt->T37_buf);
+       mxt->T37_buf = NULL;
+       mxt->T37_buf_size = 0;
+
+       i2c_release_client(mxt->client);
+       mutex_unlock(&mxt->T37_buf_mutex);
+
+       return 0;
+}
+
+
+/* Return some bytes from the buffered T37 object, starting from *ppos */
+static ssize_t mxt_debugfs_T37_read(struct file *file, char __user *buffer,
+                                   size_t count, loff_t *ppos)
+{
+       struct mxt_data *mxt = file->private_data;
+
+       if (!mxt->T37_buf)
+               return -ENODEV;
+
+       if (*ppos >= mxt->T37_buf_size)
+               return 0;
+
+       if (count + *ppos > mxt->T37_buf_size)
+               count = mxt->T37_buf_size - *ppos;
+
+       if (copy_to_user(buffer, &mxt->T37_buf[*ppos], count))
+               return -EFAULT;
+
+       *ppos += count;
+
+       return count;
+}
+
+static const struct file_operations mxt_debugfs_T37_fops = {
+       .owner = THIS_MODULE,
+       .open = mxt_debugfs_T37_open,
+       .release = mxt_debugfs_T37_release,
+       .read = mxt_debugfs_T37_read
+};
+
+static int mxt_debugfs_object_open(struct inode *inode, struct file *file)
+{
+       struct mxt_data *mxt = inode->i_private;
+       int ret;
+
+       /* Only allow one object debugfs file to be opened at a time */
+       ret = mutex_lock_interruptible(&mxt->object_str_mutex);
+       if (ret)
+               return ret;
+
+       if (!i2c_use_client(mxt->client)) {
+               ret = -ENODEV;
+               goto err_object_unlock;
+       }
+
+       ret = mxt_object_fetch(mxt);
+       if (ret)
+               goto err_object_i2c_release;
+       file->private_data = mxt;
+
+       return 0;
+
+err_object_i2c_release:
+       i2c_release_client(mxt->client);
+err_object_unlock:
+       mutex_unlock(&mxt->object_str_mutex);
+       return ret;
+}
+
+static int mxt_debugfs_object_release(struct inode *inode, struct file *file)
+{
+       struct mxt_data *mxt = file->private_data;
+       file->private_data = NULL;
+
+       kfree(mxt->object_str);
+       mxt->object_str = NULL;
+       mxt->object_str_size = 0;
+
+       i2c_release_client(mxt->client);
+       mutex_unlock(&mxt->object_str_mutex);
+
+       return 0;
+}
+
+static ssize_t mxt_debugfs_object_read(struct file *file, char __user* buffer,
+                                  size_t count, loff_t *ppos)
+{
+       struct mxt_data *mxt = file->private_data;
+       if (!mxt->object_str)
+               return -ENODEV;
+
+       if (*ppos >= mxt->object_str_size)
+               return 0;
+
+       if (count + *ppos > mxt->object_str_size)
+               count = mxt->object_str_size - *ppos;
+
+       if (copy_to_user(buffer, &mxt->object_str[*ppos], count))
+               return -EFAULT;
+
+       *ppos += count;
+
+       return count;
+}
+
+static const struct file_operations mxt_debugfs_object_fops = {
+       .owner = THIS_MODULE,
+       .open = mxt_debugfs_object_open,
+       .release = mxt_debugfs_object_release,
+       .read = mxt_debugfs_object_read,
+};
+
+static int mxt_debugfs_init(struct mxt_data *mxt)
+{
+       struct device *dev = &mxt->client->dev;
+
+       if (!mxt_debugfs_root)
+               return -ENODEV;
+
+       mxt->dentry_dev = debugfs_create_dir(kobject_name(&dev->kobj),
+                                            mxt_debugfs_root);
+
+       if (!mxt->dentry_dev)
+               return -ENODEV;
+
+       mutex_init(&mxt->T37_buf_mutex);
+
+       mxt->dentry_deltas = debugfs_create_file("deltas", S_IRUSR,
+                                                mxt->dentry_dev, mxt,
+                                                &mxt_debugfs_T37_fops);
+       mxt->dentry_refs = debugfs_create_file("refs", S_IRUSR,
+                                              mxt->dentry_dev, mxt,
+                                              &mxt_debugfs_T37_fops);
+       mutex_init(&mxt->object_str_mutex);
+
+       mxt->dentry_object = debugfs_create_file("object", S_IRUGO,
+                                                mxt->dentry_dev, mxt,
+                                                &mxt_debugfs_object_fops);
+       return 0;
+}
+
+static void mxt_debugfs_remove(struct mxt_data *mxt)
+{
+       if (mxt->dentry_dev) {
+               debugfs_remove_recursive(mxt->dentry_dev);
+               mutex_destroy(&mxt->object_str_mutex);
+               kfree(mxt->object_str);
+               mutex_destroy(&mxt->T37_buf_mutex);
+               kfree(mxt->T37_buf);
+       }
+}
+
+static int mxt_save_regs(struct mxt_data *data, u8 type, u8 instance,
+                        u8 offset, u8 *val, u16 size)
+{
+       struct mxt_object *object;
+       u16 addr;
+       int ret;
+
+       object = mxt_get_object(data, type);
+       if (!object)
+               return -EINVAL;
+
+       addr = object->start_address + instance * object->size + offset;
+       ret = mxt_read_reg(data->client, addr, size, val);
+       if (ret)
+               return -EINVAL;
+
+       return 0;
+}
+
+static int mxt_set_regs(struct mxt_data *data, u8 type, u8 instance,
+                       u8 offset, const u8 *val, u16 size)
+{
+       struct mxt_object *object;
+       u16 addr;
+       int ret;
+
+       object = mxt_get_object(data, type);
+       if (!object)
+               return -EINVAL;
+
+       addr = object->start_address + instance * object->size + offset;
+       ret = mxt_write_reg(data->client, addr, size, val);
+       if (ret)
+               return -EINVAL;
+
+       return 0;
+}
+
 static void mxt_start(struct mxt_data *data)
 {
        /* Touch enable */
-       mxt_write_object(data,
-                       MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0x83);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0, MXT_TOUCH_CTRL, 0x83);
 }
 
 static void mxt_stop(struct mxt_data *data)
 {
        /* Touch disable */
-       mxt_write_object(data,
-                       MXT_TOUCH_MULTI_T9, MXT_TOUCH_CTRL, 0);
+       mxt_write_object(data, MXT_TOUCH_MULTI_T9, 0, MXT_TOUCH_CTRL, 0);
 }
 
 static int mxt_input_open(struct input_dev *dev)
@@ -1092,42 +1962,39 @@ static void mxt_input_close(struct input_dev *dev)
        mxt_stop(data);
 }
 
-static int __devinit mxt_probe(struct i2c_client *client,
-               const struct i2c_device_id *id)
+static int mxt_input_dev_create(struct mxt_data *data)
 {
-       const struct mxt_platform_data *pdata = client->dev.platform_data;
-       struct mxt_data *data;
        struct input_dev *input_dev;
        int error;
 
-       if (!pdata)
-               return -EINVAL;
-
-       data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
-       input_dev = input_allocate_device();
-       if (!data || !input_dev) {
-               dev_err(&client->dev, "Failed to allocate memory\n");
-               error = -ENOMEM;
-               goto err_free_mem;
-       }
+       data->input_dev = input_dev = input_allocate_device();
+       if (!input_dev)
+               return -ENOMEM;
 
-       input_dev->name = "Atmel maXTouch Touchscreen";
+       input_dev->name = (data->is_tp) ? "Atmel maXTouch Touchpad" :
+                                         "Atmel maXTouch Touchscreen";
+       input_dev->phys = data->client->adapter->name;
        input_dev->id.bustype = BUS_I2C;
-       input_dev->dev.parent = &client->dev;
+       input_dev->dev.parent = &data->client->dev;
        input_dev->open = mxt_input_open;
        input_dev->close = mxt_input_close;
 
-       data->client = client;
-       data->input_dev = input_dev;
-       data->pdata = pdata;
-       data->irq = client->irq;
-
-       mxt_calc_resolution(data);
-
        __set_bit(EV_ABS, input_dev->evbit);
        __set_bit(EV_KEY, input_dev->evbit);
        __set_bit(BTN_TOUCH, input_dev->keybit);
 
+       if (data->is_tp) {
+               __set_bit(INPUT_PROP_POINTER, input_dev->propbit);
+               __set_bit(INPUT_PROP_BUTTONPAD, input_dev->propbit);
+
+               __set_bit(BTN_LEFT, input_dev->keybit);
+               __set_bit(BTN_TOOL_FINGER, input_dev->keybit);
+               __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit);
+               __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit);
+               __set_bit(BTN_TOOL_QUADTAP, input_dev->keybit);
+               __set_bit(BTN_TOOL_QUINTTAP, input_dev->keybit);
+       }
+
        /* For single touch */
        input_set_abs_params(input_dev, ABS_X,
                             0, data->max_x, 0, 0);
@@ -1135,9 +2002,13 @@ static int __devinit mxt_probe(struct i2c_client *client,
                             0, data->max_y, 0, 0);
        input_set_abs_params(input_dev, ABS_PRESSURE,
                             0, 255, 0, 0);
+       input_abs_set_res(input_dev, ABS_X, MXT_PIXELS_PER_MM);
+       input_abs_set_res(input_dev, ABS_Y, MXT_PIXELS_PER_MM);
 
        /* For multi touch */
-       input_mt_init_slots(input_dev, MXT_MAX_FINGER);
+       error = input_mt_init_slots(input_dev, MXT_MAX_FINGER);
+       if (error)
+               goto err_free_device;
        input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR,
                             0, MXT_MAX_AREA, 0, 0);
        input_set_abs_params(input_dev, ABS_MT_POSITION_X,
@@ -1146,44 +2017,156 @@ static int __devinit mxt_probe(struct i2c_client *client,
                             0, data->max_y, 0, 0);
        input_set_abs_params(input_dev, ABS_MT_PRESSURE,
                             0, 255, 0, 0);
+       input_abs_set_res(input_dev, ABS_MT_POSITION_X, MXT_PIXELS_PER_MM);
+       input_abs_set_res(input_dev, ABS_MT_POSITION_Y, MXT_PIXELS_PER_MM);
 
        input_set_drvdata(input_dev, data);
+
+       error = input_register_device(input_dev);
+       if (error)
+               goto err_free_device;
+
+       return 0;
+
+err_free_device:
+       input_free_device(data->input_dev);
+       data->input_dev = NULL;
+       return error;
+}
+
+static int mxt_initialize(struct mxt_data *data)
+{
+       struct i2c_client *client = data->client;
+       struct device *dev = &client->dev;
+       struct mxt_info *info = &data->info;
+       int error;
+
+       /* Read 7-byte info block starting at address 0 */
+       error = mxt_read_reg(client, MXT_INFO, sizeof(*info), info);
+       if (error)
+               return error;
+
+       /* Get object table information */
+       error = mxt_get_object_table(data);
+       if (error)
+               return error;
+
+       /* Apply config from platform data */
+       error = mxt_handle_pdata(data);
+       if (error)
+               return error;
+
+       /* Backup to memory */
+       error = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,
+                                MXT_COMMAND_BACKUPNV, MXT_BACKUP_VALUE);
+       if (error)
+               return error;
+       msleep(MXT_BACKUP_TIME);
+
+       /* Soft reset */
+       error = mxt_write_object(data, MXT_GEN_COMMAND_T6, 0,
+                                MXT_COMMAND_RESET, 1);
+       if (error)
+               return error;
+       msleep(MXT_RESET_TIME);
+
+       dev_info(dev, "Family ID: %d Variant ID: %d Major.Minor.Build: %d.%d.%d\n",
+                info->family_id, info->variant_id, info->version >> 4,
+                info->version & 0xf, info->build);
+
+       dev_info(dev, "Matrix X Size: %d Matrix Y Size: %d Object Num: %d\n",
+                info->matrix_xsize, info->matrix_ysize, info->object_num);
+
+       error = mxt_calc_resolution(data);
+       if (error)
+               return error;
+
+       return 0;
+}
+
+static int __devinit mxt_probe(struct i2c_client *client,
+               const struct i2c_device_id *id)
+{
+       const struct mxt_platform_data *pdata = client->dev.platform_data;
+       struct mxt_data *data;
+       unsigned long irqflags;
+       int error;
+
+       data = kzalloc(sizeof(struct mxt_data), GFP_KERNEL);
+       if (!data) {
+               dev_err(&client->dev, "Failed to allocate memory\n");
+               return -ENOMEM;
+       }
+
+       data->is_tp = !strcmp(id->name, "atmel_mxt_tp");
+
+       data->client = client;
        i2c_set_clientdata(client, data);
 
-       error = mxt_initialize(data);
+       data->pdata = pdata;
+       data->irq = client->irq;
+
+       error = mxt_update_file_name(&client->dev, &data->fw_file, MXT_FW_NAME,
+                                    strlen(MXT_FW_NAME));
        if (error)
                goto err_free_object;
 
-       error = request_threaded_irq(client->irq, NULL, mxt_interrupt,
-                       pdata->irqflags, client->dev.driver->name, data);
-       if (error) {
-               dev_err(&client->dev, "Failed to register interrupt\n");
+       error = mxt_update_file_name(&client->dev, &data->config_file,
+                                    MXT_CONFIG_NAME, strlen(MXT_CONFIG_NAME));
+       if (error)
                goto err_free_object;
+
+       if (!mxt_in_bootloader(data)) {
+               error = mxt_initialize(data);
+               if (error)
+                       goto err_free_object;
+       } else {
+               dev_info(&client->dev, "device came up in bootloader mode.\n");
        }
+       init_completion(&data->bl_completion);
+       init_completion(&data->auto_cal_completion);
 
-       error = mxt_make_highchg(data);
+       error = mxt_input_dev_create(data);
        if (error)
-               goto err_free_irq;
+               goto err_free_object;
 
-       error = input_register_device(input_dev);
-       if (error)
-               goto err_free_irq;
+       /* Default to falling edge if no platform data provided */
+       irqflags = pdata ? pdata->irqflags : IRQF_TRIGGER_FALLING;
+       error = request_threaded_irq(client->irq,
+                                    NULL,
+                                    mxt_interrupt,
+                                    irqflags,
+                                    client->name,
+                                    data);
+       if (error) {
+               dev_err(&client->dev, "Failed to register interrupt\n");
+               goto err_unregister_device;
+       }
+
+       if (!mxt_in_bootloader(data)) {
+               error = mxt_handle_messages(data);
+               if (error)
+                       goto err_free_irq;
+       }
 
        error = sysfs_create_group(&client->dev.kobj, &mxt_attr_group);
        if (error)
-               goto err_unregister_device;
+               dev_warn(&client->dev, "error creating sysfs entries.\n");
+
+       error = mxt_debugfs_init(data);
+       if (error)
+               dev_warn(&client->dev, "error creating debugfs entries.\n");
 
        return 0;
 
-err_unregister_device:
-       input_unregister_device(input_dev);
-       input_dev = NULL;
 err_free_irq:
        free_irq(client->irq, data);
+err_unregister_device:
+       input_unregister_device(data->input_dev);
 err_free_object:
        kfree(data->object_table);
-err_free_mem:
-       input_free_device(input_dev);
+       kfree(data->fw_file);
+       kfree(data->config_file);
        kfree(data);
        return error;
 }
@@ -1192,26 +2175,97 @@ static int __devexit mxt_remove(struct i2c_client *client)
 {
        struct mxt_data *data = i2c_get_clientdata(client);
 
+       mxt_debugfs_remove(data);
        sysfs_remove_group(&client->dev.kobj, &mxt_attr_group);
        free_irq(data->irq, data);
        input_unregister_device(data->input_dev);
        kfree(data->object_table);
+       kfree(data->fw_file);
+       kfree(data->config_file);
        kfree(data);
 
        return 0;
 }
 
-#ifdef CONFIG_PM
+#ifdef CONFIG_PM_SLEEP
+
+static void mxt_suspend_enable_T9(struct mxt_data *data)
+{
+       struct device *dev = &data->client->dev;
+       u8 T9_ctrl = 0x03;
+       int ret;
+       unsigned long timeout = msecs_to_jiffies(350);
+
+       INIT_COMPLETION(data->auto_cal_completion);
+
+       /* Enable T9 object */
+       ret = mxt_set_regs(data, MXT_TOUCH_MULTI_T9, 0, 0,
+                          &T9_ctrl, 1);
+       if (ret) {
+               dev_err(dev, "Set T9 ctrl config failed, %d\n", ret);
+               return;
+       }
+
+       ret = wait_for_completion_interruptible_timeout(
+               &data->auto_cal_completion, timeout);
+       if (ret <= 0)
+               dev_err(dev, "Wait for auto cal completion failed.\n");
+}
+
 static int mxt_suspend(struct device *dev)
 {
        struct i2c_client *client = to_i2c_client(dev);
        struct mxt_data *data = i2c_get_clientdata(client);
        struct input_dev *input_dev = data->input_dev;
+       u8 T7_config_idle[3] = {0xfe, 0xfe, 0};
+       u8 T7_config_deepsleep[3] = {0x00, 0x00, 0};
+       u8 *power_config;
+       int ret;
 
        mutex_lock(&input_dev->mutex);
 
-       if (input_dev->users)
+       /* Save 3 bytes T7 Power config */
+       ret = mxt_save_regs(data, MXT_GEN_POWER_T7, 0, 0,
+                           data->T7_config, 3);
+       if (ret)
+               dev_err(dev, "Save T7 Power config failed, %d\n", ret);
+       data->T7_config_valid = (ret == 0);
+
+       /* Set T7 to idle mode if we allow wakeup from touch, otherwise
+        * put it into deepsleep mode.
+        */
+       power_config = device_may_wakeup(dev) ? T7_config_idle
+                                             : T7_config_deepsleep;
+
+       ret = mxt_set_regs(data, MXT_GEN_POWER_T7, 0, 0,
+                          power_config, 3);
+       if (ret)
+               dev_err(dev, "Set T7 Power config failed, %d\n", ret);
+
+       if (device_may_wakeup(dev)) {
+
+               /* If we allow waekup from touch, we have to enable T9 so
+                * that IRQ can be generated from touch
+                */
+
+               /* Save 1 byte T9 Ctrl config */
+               ret = mxt_save_regs(data, MXT_TOUCH_MULTI_T9, 0, 0,
+                                   &data->T9_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Save T9 ctrl config failed, %d\n", ret);
+               data->T9_ctrl_valid = (ret == 0);
+
+               /* Enable T9 only if it is not currently enabled */
+               if (data->T9_ctrl_valid && !(data->T9_ctrl & 0x01))
+                       mxt_suspend_enable_T9(data);
+
+               /* Enable wake from IRQ */
+               data->irq_wake = (enable_irq_wake(data->irq) == 0);
+       } else if (input_dev->users) {
                mxt_stop(data);
+       }
+
+       disable_irq(data->irq);
 
        mutex_unlock(&input_dev->mutex);
 
@@ -1223,32 +2277,50 @@ static int mxt_resume(struct device *dev)
        struct i2c_client *client = to_i2c_client(dev);
        struct mxt_data *data = i2c_get_clientdata(client);
        struct input_dev *input_dev = data->input_dev;
+       int ret;
 
-       /* Soft reset */
-       mxt_write_object(data, MXT_GEN_COMMAND_T6,
-                       MXT_COMMAND_RESET, 1);
-
-       msleep(MXT_RESET_TIME);
+       /* Process any pending message so that CHG line can be de-asserted */
+       ret = mxt_handle_messages(data);
+       if (ret)
+               dev_err(dev, "Handling message fails upon resume, %d\n", ret);
 
        mutex_lock(&input_dev->mutex);
 
-       if (input_dev->users)
+       enable_irq(data->irq);
+
+       if (device_may_wakeup(dev) && data->irq_wake)
+               disable_irq_wake(data->irq);
+
+       /* Restore the T9 Ctrl config to before-suspend value */
+       if (device_may_wakeup(dev) && data->T9_ctrl_valid) {
+               ret = mxt_set_regs(data, MXT_TOUCH_MULTI_T9, 0, 0,
+                                  &data->T9_ctrl, 1);
+               if (ret)
+                       dev_err(dev, "Set T9 ctrl config failed, %d\n", ret);
+       } else if (input_dev->users) {
                mxt_start(data);
+       }
+
+       /* Restore the T7 Power config to before-suspend value */
+       if (data->T7_config_valid) {
+               ret = mxt_set_regs(data, MXT_GEN_POWER_T7, 0, 0,
+                                  data->T7_config, 3);
+               if (ret)
+                       dev_err(dev, "Set T7 power config failed, %d\n", ret);
+       }
 
        mutex_unlock(&input_dev->mutex);
 
        return 0;
 }
-
-static const struct dev_pm_ops mxt_pm_ops = {
-       .suspend        = mxt_suspend,
-       .resume         = mxt_resume,
-};
 #endif
 
+static SIMPLE_DEV_PM_OPS(mxt_pm_ops, mxt_suspend, mxt_resume);
+
 static const struct i2c_device_id mxt_id[] = {
        { "qt602240_ts", 0 },
        { "atmel_mxt_ts", 0 },
+       { "atmel_mxt_tp", 0 },
        { "mXT224", 0 },
        { }
 };
@@ -1258,16 +2330,33 @@ static struct i2c_driver mxt_driver = {
        .driver = {
                .name   = "atmel_mxt_ts",
                .owner  = THIS_MODULE,
-#ifdef CONFIG_PM
                .pm     = &mxt_pm_ops,
-#endif
        },
        .probe          = mxt_probe,
        .remove         = __devexit_p(mxt_remove),
        .id_table       = mxt_id,
 };
 
-module_i2c_driver(mxt_driver);
+static int __init mxt_init(void)
+{
+       /* Create a global debugfs root for all atmel_mxt_ts devices */
+       mxt_debugfs_root = debugfs_create_dir(mxt_driver.driver.name, NULL);
+       if (mxt_debugfs_root == ERR_PTR(-ENODEV))
+               mxt_debugfs_root = NULL;
+
+       return i2c_add_driver(&mxt_driver);
+}
+
+static void __exit mxt_exit(void)
+{
+       if (mxt_debugfs_root)
+               debugfs_remove_recursive(mxt_debugfs_root);
+
+       i2c_del_driver(&mxt_driver);
+}
+
+module_init(mxt_init);
+module_exit(mxt_exit);
 
 /* Module information */
 MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
index 2e227fb..d54ca6c 100644 (file)
@@ -451,6 +451,63 @@ static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode,
        return 0;
 }
 
+static int match_dev_by_uuid(struct device *dev, void *data)
+{
+       u8 *uuid = data;
+       struct hd_struct *part = dev_to_part(dev);
+
+       if (!part->info)
+               goto no_match;
+
+       if (memcmp(uuid, part->info->uuid, sizeof(part->info->uuid)))
+               goto no_match;
+
+       return 1;
+no_match:
+       return 0;
+}
+
+/* Duplicated from /init/do_mounts.c. */
+static dev_t devt_from_partuuid(const char *uuid_str)
+{
+       dev_t res = 0;
+       struct device *dev = NULL;
+       struct gendisk *disk;
+       struct hd_struct *part;
+       u8 uuid[16];
+       int offset = 0;
+       char unreached;
+
+       if (strlen(uuid_str) < 36)
+               goto done;
+       part_pack_uuid(uuid_str, uuid);
+       if (uuid_str[36] && sscanf(uuid_str + 36, "/PARTNROFF=%d%c", &offset,
+                                  &unreached) != 1)
+               goto done;
+
+       dev = class_find_device(&block_class, NULL, uuid, &match_dev_by_uuid);
+       if (!dev)
+               goto done;
+
+       res = dev->devt;
+
+       if (!offset)
+               goto no_offset;
+
+       res = 0;
+       disk = part_to_disk(dev_to_part(dev));
+       part = disk_get_part(disk, dev_to_part(dev)->partno + offset);
+       if (part) {
+               res = part_devt(part);
+               put_device(part_to_dev(part));
+       }
+
+no_offset:
+       put_device(dev);
+done:
+       return res;
+}
+
 /*
  * Add a device to the list, or just increment the usage count if
  * it's already present.
@@ -472,6 +529,8 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
                dev = MKDEV(major, minor);
                if (MAJOR(dev) != major || MINOR(dev) != minor)
                        return -EOVERFLOW;
+       } else if (!strncmp(path, "PARTUUID=", 9)) {
+               dev = devt_from_partuuid(path + 9);
        } else {
                /* convert the path to a device */
                struct block_device *bdev = lookup_bdev(path);
index ce6b44d..5f8ba57 100644 (file)
@@ -704,6 +704,7 @@ struct rtl8169_private {
        u16 cp_cmd;
 
        u16 event_slow;
+       bool runtime_suspended;
 
        struct mdio_ops {
                void (*write)(void __iomem *, int, int);
@@ -756,6 +757,10 @@ struct rtl8169_private {
 #define RTL_FIRMWARE_UNKNOWN   ERR_PTR(-EAGAIN)
 };
 
+static int aspm_disable = 0;
+module_param(aspm_disable, bool, 0444);
+MODULE_PARM_DESC(aspm_disable, "Disable ASPM completely.");
+
 MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
 MODULE_DESCRIPTION("RealTek RTL-8169 Gigabit Ethernet driver");
 module_param(use_dac, int, 0);
@@ -5720,6 +5725,7 @@ static int rtl_open(struct net_device *dev)
        rtl_unlock_work(tp);
 
        tp->saved_wolopts = 0;
+       tp->runtime_suspended = false;
        pm_runtime_put_noidle(&pdev->dev);
 
        rtl8169_check_link_status(dev, tp, ioaddr);
@@ -5848,6 +5854,7 @@ static int rtl8169_runtime_suspend(struct device *device)
        rtl_lock_work(tp);
        tp->saved_wolopts = __rtl8169_get_wol(tp);
        __rtl8169_set_wol(tp, WAKE_ANY);
+       tp->runtime_suspended = true;
        rtl_unlock_work(tp);
 
        rtl8169_net_suspend(dev);
@@ -5867,6 +5874,7 @@ static int rtl8169_runtime_resume(struct device *device)
        rtl_lock_work(tp);
        __rtl8169_set_wol(tp, tp->saved_wolopts);
        tp->saved_wolopts = 0;
+       tp->runtime_suspended = false;
        rtl_unlock_work(tp);
 
        rtl8169_init_phy(dev, tp);
@@ -5882,6 +5890,7 @@ static int rtl8169_runtime_idle(struct device *device)
        struct net_device *dev = pci_get_drvdata(pdev);
        struct rtl8169_private *tp = netdev_priv(dev);
 
+       __rtl8169_check_link_status(dev, tp, tp->mmio_addr, true);
        return tp->TxDescArray ? -EBUSY : 0;
 }
 
@@ -5933,6 +5942,10 @@ static void rtl_shutdown(struct pci_dev *pdev)
 
        pm_runtime_get_sync(d);
 
+       /* Get the device back to D0 state if it was runtime suspended. */
+       if (tp->runtime_suspended)
+               pci_set_power_state(pdev, PCI_D0);
+
        rtl8169_net_suspend(dev);
 
        /* Restore original MAC address */
@@ -5940,6 +5953,10 @@ static void rtl_shutdown(struct pci_dev *pdev)
 
        rtl8169_hw_reset(tp);
 
+       /* Restore WOL flags if they were messed around with. */
+       if (tp->saved_wolopts)
+               __rtl8169_set_wol(tp, tp->saved_wolopts);
+
        if (system_state == SYSTEM_POWER_OFF) {
                if (__rtl8169_get_wol(tp) & WAKE_ANY) {
                        rtl_wol_suspend_quirk(tp);
@@ -6052,8 +6069,7 @@ static unsigned rtl_try_msi(struct rtl8169_private *tp,
                        msi = RTL_FEATURE_MSI;
                }
        }
-       if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
-               RTL_W8(Config2, cfg2);
+       RTL_W8(Config2, cfg2);
        return msi;
 }
 
@@ -6097,8 +6113,12 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        /* disable ASPM completely as that cause random device stop working
         * problems as well as full system hangs for some PCIe devices users */
-       pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
-                                    PCIE_LINK_STATE_CLKPM);
+       if (aspm_disable) {
+               pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S |
+                                      PCIE_LINK_STATE_L1 |
+                                      PCIE_LINK_STATE_CLKPM);
+               dprintk("ASPM disabled");
+       }
 
        /* enable device (incl. PCI PM wakeup and hotplug setup) */
        rc = pci_enable_device(pdev);
@@ -6190,11 +6210,8 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        RTL_W8(Cfg9346, Cfg9346_Unlock);
        RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
-       RTL_W8(Config5, RTL_R8(Config5) & PMEStatus);
-       if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
-               tp->features |= RTL_FEATURE_WOL;
-       if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
-               tp->features |= RTL_FEATURE_WOL;
+       RTL_W8(Config3, 0);
+       RTL_W8(Config5, PMEStatus);
        tp->features |= rtl_try_msi(tp, cfg);
        RTL_W8(Cfg9346, Cfg9346_Lock);
 
index 833e32f..0612a1d 100644 (file)
@@ -483,5 +483,10 @@ config USB_VL600
 
          http://ubuntuforums.org/showpost.php?p=10589647&postcount=17
 
+config USB_NET_GOBI
+       tristate "Qualcomm Gobi"
+       depends on USB_USBNET
+       help
+         Qualcomm Gobi 2k support.
 
 endmenu
index a2e2d72..20496eb 100644 (file)
@@ -30,4 +30,4 @@ obj-$(CONFIG_USB_NET_CX82310_ETH)     += cx82310_eth.o
 obj-$(CONFIG_USB_NET_CDC_NCM)  += cdc_ncm.o
 obj-$(CONFIG_USB_VL600)                += lg-vl600.o
 obj-$(CONFIG_USB_NET_QMI_WWAN) += qmi_wwan.o
-
+obj-$(CONFIG_USB_NET_GOBI)     += gobi/
diff --git a/drivers/net/usb/gobi/Makefile b/drivers/net/usb/gobi/Makefile
new file mode 100644 (file)
index 0000000..cb11b7c
--- /dev/null
@@ -0,0 +1,2 @@
+obj-$(CONFIG_USB_NET_GOBI) += gobi.o
+gobi-objs += buffer.o qcusbnet.o qmidevice.o qmi.o
diff --git a/drivers/net/usb/gobi/README b/drivers/net/usb/gobi/README
new file mode 100644 (file)
index 0000000..113c523
--- /dev/null
@@ -0,0 +1,30 @@
+Qualcomm Gobi 2000 driver
+-------------------------
+
+This directory contains a driver for the Qualcomm Gobi 2000 CDMA/GSM modem. The
+device speaks a protocol called QMI with its host; this driver's responsibility
+is to multiplex transactions over QMI connections. Note that the relatively
+simple encoding defined in qmi.h and qmi.c is only the encapsulating protocol;
+the device speaks a more complex set of protocols embodied in the closed-source
+Gobi SDK which are necessary to use advanced features of the device.
+Furthermore, firmware (also proprietary) is needed to make the device useful. An
+open-source firmware loader exists: http://www.codon.org.uk/~mjg59/gobi_loader/.
+
+Interfaces:
+This driver presents two separate interfaces to userspace:
+- usbN, an ordinary usb network interface
+- /dev/qcqmiN, a channel to speak to the device using QMI messages
+The latter is for use by the Gobi SDK.
+
+History:
+This driver's original incarnation (of which this is a rewrite) was released
+under GPLv2 by Qualcomm on their Code Aurora site:
+https://www.codeaurora.org/gitweb/quic/la/?p=kernel/msm.git;a=commit;h=b5135a880f8942f990e8c2e383f7f876beacc55b
+
+Issues:
+Help and commentary on any of the issues below would be appreciated.
+- The locking in devqmi_close() is not threadsafe: we're walking a list of tasks
+  without holding a lock on the list. The original driver did this and I have
+  left it intact because I do not fully understand what's going on here.
+- The driver seems to deadlock very occasionally (one in ~6000 reboots during
+  stress testing). I've had no luck tracking this problem down.
diff --git a/drivers/net/usb/gobi/buffer.c b/drivers/net/usb/gobi/buffer.c
new file mode 100644 (file)
index 0000000..1658c70
--- /dev/null
@@ -0,0 +1,61 @@
+/* buffer.c - refcounted buffer implementation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2011  The Chromium OS Authors
+ */
+
+#include <linux/kref.h>
+#include <linux/slab.h>
+
+#include "buffer.h"
+
+struct buffer {
+       struct kref ref;
+       size_t sz;
+       char data[0];
+};
+
+struct buffer *buffer_new(size_t sz)
+{
+       struct buffer *buf = kmalloc(sizeof(*buf) + sz, GFP_KERNEL);
+       if (!buf)
+               return NULL;
+       kref_init(&buf->ref);
+       buf->sz = sz;
+       return buf;
+}
+
+void buffer_get(struct buffer *buf)
+{
+       kref_get(&buf->ref);
+}
+
+static void free_buf(struct kref *ref)
+{
+       struct buffer *buf = container_of(ref, struct buffer, ref);
+       kfree(buf);
+}
+
+void buffer_put(struct buffer *buf)
+{
+       kref_put(&buf->ref, free_buf);
+}
+
+size_t buffer_size(struct buffer *buf)
+{
+       return buf->sz;
+}
+
+void *buffer_data(struct buffer *buf)
+{
+       return &buf->data[0];
+}
diff --git a/drivers/net/usb/gobi/buffer.h b/drivers/net/usb/gobi/buffer.h
new file mode 100644 (file)
index 0000000..5a1266c
--- /dev/null
@@ -0,0 +1,30 @@
+/* buffer.h - refcounted buffer implementation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2011  The Chromium OS Authors
+ */
+
+#ifndef GOBI_BUFFER_H
+#define GOBI_BUFFER_H
+
+#include <linux/kref.h>
+#include <linux/types.h>
+
+struct buffer;
+
+struct buffer *buffer_new(size_t sz);
+void buffer_get(struct buffer *buf);
+void buffer_put(struct buffer *buf);
+size_t buffer_size(struct buffer *buf);
+void *buffer_data(struct buffer *buf);
+
+#endif /* !GOBI_BUFFER_H */
diff --git a/drivers/net/usb/gobi/qcusbnet.c b/drivers/net/usb/gobi/qcusbnet.c
new file mode 100644 (file)
index 0000000..77716fe
--- /dev/null
@@ -0,0 +1,758 @@
+/* qcusbnet.c - gobi network device
+ * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "structs.h"
+#include "qmidevice.h"
+#include "qmi.h"
+#include "qcusbnet.h"
+
+#include <linux/module.h>
+#include <linux/ctype.h>
+
+#define DRIVER_VERSION "1.0.110+google+w0"
+#define DRIVER_AUTHOR "Qualcomm Innovation Center"
+#define DRIVER_DESC "gobi"
+
+static LIST_HEAD(qcusbnet_list);
+static DEFINE_MUTEX(qcusbnet_lock);
+
+int gobi_debug;
+static struct class *devclass;
+
+static void free_dev(struct kref *ref)
+{
+       struct qcusbnet *dev = container_of(ref, struct qcusbnet, refcount);
+       list_del(&dev->node);
+       kfree(dev);
+}
+
+static void free_urb_with_skb(struct urb *urb)
+{
+       struct sk_buff *skb = (struct sk_buff *)urb->context;
+       dev_kfree_skb_any(skb);
+       usb_free_urb(urb);
+}
+
+void qcusbnet_put(struct qcusbnet *dev)
+{
+       mutex_lock(&qcusbnet_lock);
+       kref_put(&dev->refcount, free_dev);
+       mutex_unlock(&qcusbnet_lock);
+}
+
+struct qcusbnet *qcusbnet_get(struct qcusbnet *key)
+{
+       /* Given a putative qcusbnet struct, return either the struct itself
+        * (with a ref taken) if the struct is still visible, or NULL if it's
+        * not. This prevents object-visibility races where someone is looking
+        * up an object as the last ref gets dropped; dropping the last ref and
+        * removing the object from the list are atomic with respect to getting
+        * a new ref. */
+       struct qcusbnet *entry;
+       mutex_lock(&qcusbnet_lock);
+       list_for_each_entry(entry, &qcusbnet_list, node) {
+               if (entry == key) {
+                       kref_get(&entry->refcount);
+                       mutex_unlock(&qcusbnet_lock);
+                       return entry;
+               }
+       }
+       mutex_unlock(&qcusbnet_lock);
+       return NULL;
+}
+
+int qc_suspend(struct usb_interface *iface, pm_message_t event)
+{
+       struct usbnet *usbnet;
+       struct qcusbnet *dev;
+
+       BUG_ON(!iface);
+
+       usbnet = usb_get_intfdata(iface);
+       BUG_ON(!usbnet || !usbnet->net);
+
+       dev = (struct qcusbnet *)usbnet->data[0];
+       BUG_ON(!dev);
+
+       if (!(event.event & PM_EVENT_AUTO)) {
+               GOBI_DEBUG("device suspended to power level %d",
+                   event.event);
+               qc_setdown(dev, DOWN_DRIVER_SUSPENDED);
+       } else {
+               GOBI_DEBUG("device autosuspend");
+       }
+
+       if (event.event & PM_EVENT_SUSPEND) {
+               qc_stopread(dev);
+               usbnet->udev->reset_resume = 0;
+               iface->dev.power.power_state.event = event.event;
+       } else {
+               usbnet->udev->reset_resume = 1;
+       }
+
+       return usbnet_suspend(iface, event);
+}
+
+static int qc_resume(struct usb_interface *iface)
+{
+       struct usbnet *usbnet;
+       struct qcusbnet *dev;
+       int ret;
+       int oldstate;
+
+       BUG_ON(!iface);
+
+       usbnet = usb_get_intfdata(iface);
+       BUG_ON(!usbnet || !usbnet->net);
+
+       dev = (struct qcusbnet *)usbnet->data[0];
+       BUG_ON(!dev);
+
+       oldstate = iface->dev.power.power_state.event;
+       iface->dev.power.power_state.event = PM_EVENT_ON;
+       GOBI_DEBUG("resuming from power mode %d", oldstate);
+
+       if (oldstate & PM_EVENT_SUSPEND) {
+               qc_cleardown(dev, DOWN_DRIVER_SUSPENDED);
+
+               ret = usbnet_resume(iface);
+               if (ret) {
+                       GOBI_ERROR("usbnet_resume failed: %d", ret);
+                       return ret;
+               }
+
+               ret = qc_startread(dev);
+               if (ret) {
+                       GOBI_ERROR("qc_startread failed: %d", ret);
+                       return ret;
+               }
+       } else {
+               GOBI_DEBUG("nothing to resume");
+               return 0;
+       }
+
+       return ret;
+}
+
+static int qcnet_bind(struct usbnet *usbnet, struct usb_interface *iface)
+{
+       int numends;
+       int i;
+       struct usb_host_endpoint *endpoint = NULL;
+       struct usb_host_endpoint *in = NULL;
+       struct usb_host_endpoint *out = NULL;
+       int dir_in, dir_out, xfer_int;
+
+       if (iface->num_altsetting != 1) {
+               GOBI_WARN("invalid num_altsetting %u", iface->num_altsetting);
+               return -ENODEV;
+       }
+
+       if (iface->cur_altsetting->desc.bInterfaceNumber != 0
+           && iface->cur_altsetting->desc.bInterfaceNumber != 5) {
+               GOBI_WARN("invalid interface %d",
+                         iface->cur_altsetting->desc.bInterfaceNumber);
+               return -ENODEV;
+       }
+
+       GOBI_DEBUG("interface number: %d",
+               iface->cur_altsetting->desc.bInterfaceNumber);
+
+       numends = iface->cur_altsetting->desc.bNumEndpoints;
+       for (i = 0; i < numends; i++) {
+               endpoint = iface->cur_altsetting->endpoint + i;
+
+               dir_in   = usb_endpoint_dir_in(&endpoint->desc);
+               dir_out  = usb_endpoint_dir_out(&endpoint->desc);
+               xfer_int = usb_endpoint_xfer_int(&endpoint->desc);
+
+               GOBI_DEBUG("endpoint %d: addr %u "
+                       "dir_in %d dir_out %d xfer_int %d",
+                       i, endpoint->desc.bEndpointAddress,
+                       dir_in, dir_out, xfer_int);
+
+               if (dir_in && !xfer_int) {
+                       if (in) {
+                               GOBI_WARN("multiple in endpoints");
+                               return -ENODEV;
+                       }
+                       GOBI_DEBUG("setting endpoint %d as in", i);
+                       in = endpoint;
+               } else if (dir_out && !xfer_int) {
+                       if (out) {
+                               GOBI_WARN("multiple out endpoints");
+                               return -ENODEV;
+                       }
+                       GOBI_DEBUG("setting endpoint %d as out", i);
+                       out = endpoint;
+               } else {
+                       GOBI_DEBUG("ignoring endpoint %d", i);
+               }
+       }
+
+       if (!in || !out) {
+               GOBI_WARN("missing endpoint(s)");
+               if (in)
+                       GOBI_WARN("found in endpoint: %u",
+                               in->desc.bEndpointAddress);
+               else
+                       GOBI_WARN("didn't find in endpoint");
+               if (out)
+                       GOBI_WARN("found out endpoint: %u",
+                               out->desc.bEndpointAddress);
+               else
+                       GOBI_WARN("didn't find out endpoint");
+               return -ENODEV;
+       }
+
+       if (usb_set_interface(usbnet->udev,
+                             iface->cur_altsetting->desc.bInterfaceNumber, 0)) {
+               GOBI_WARN("unable to set interface");
+               return -EINVAL;
+       }
+
+       GOBI_DEBUG("found endpoints: in %u, out %u",
+                  in->desc.bEndpointAddress,
+                  out->desc.bEndpointAddress);
+
+       usbnet->in = usb_rcvbulkpipe(usbnet->udev,
+               in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
+       usbnet->out = usb_sndbulkpipe(usbnet->udev,
+               out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
+
+       return 0;
+}
+
+static void qcnet_unbind(struct usbnet *usbnet, struct usb_interface *iface)
+{
+       struct qcusbnet *dev = (struct qcusbnet *)usbnet->data[0];
+
+       dev->dying = true;
+
+       kfree(usbnet->net->netdev_ops);
+       usbnet->net->netdev_ops = NULL;
+}
+
+static void qcnet_bg_complete(struct work_struct *work)
+{
+       unsigned long listflags;
+       struct qcusbnet *dev = container_of(work, struct qcusbnet, complete);
+
+       BUG_ON(!dev->active);
+       free_urb_with_skb(dev->active);
+       dev->active = NULL;
+
+       usb_autopm_put_interface(dev->iface);
+
+       spin_lock_irqsave(&dev->urbs_lock, listflags);
+       if (!list_empty(&dev->urbs))
+               queue_work(dev->workqueue, &dev->startxmit);
+       spin_unlock_irqrestore(&dev->urbs_lock, listflags);
+}
+
+static void qcnet_complete(struct urb *urb)
+{
+       struct sk_buff *skb = urb->context;
+       struct qcusbnet *dev = *(struct qcusbnet **)skb->cb;
+
+       BUG_ON(urb != dev->active);
+       queue_work(dev->workqueue, &dev->complete);
+}
+
+static void qcnet_bg_txtimeout(struct work_struct *work)
+{
+       struct qcusbnet *dev = container_of(work, struct qcusbnet, txtimeout);
+       struct list_head *node, *tmp;
+       struct urb *urb;
+       if (dev->active)
+               usb_kill_urb(dev->active);
+       list_for_each_safe(node, tmp, &dev->urbs) {
+               urb = list_entry(node, struct urb, urb_list);
+               list_del(&urb->urb_list);
+               free_urb_with_skb(urb);
+       }
+}
+
+static void qcnet_txtimeout(struct net_device *netdev)
+{
+       struct usbnet *usbnet = netdev_priv(netdev);
+       struct qcusbnet *dev = (struct qcusbnet *)usbnet->data[0];
+       queue_work(dev->workqueue, &dev->txtimeout);
+}
+
+static void qcnet_bg_startxmit(struct work_struct *work)
+{
+       unsigned long listflags;
+       struct qcusbnet *dev = container_of(work, struct qcusbnet, startxmit);
+       struct urb *urb = NULL;
+       int status;
+
+       if (dev->dying) {
+               GOBI_WARN("dying device");
+               /* Fear not; queued urbs will be freed in qcnet_disconnect. */
+               return;
+       }
+
+       if (dev->active)
+               return;
+
+       status = usb_autopm_get_interface(dev->iface);
+       if (status < 0) {
+               /* Should be ERROR, but it can spin, which floods logs. */
+               GOBI_WARN("failed to autoresume interface: %d", status);
+               if (status == -EPERM)
+                       qc_suspend(dev->iface, PMSG_SUSPEND);
+               /* We could just drop the packet here, right...? It seems like
+                * if this ever happens, we'll spin, but the old driver did that
+                * as well. */
+               queue_work(dev->workqueue, &dev->startxmit);
+               return;
+       }
+
+       spin_lock_irqsave(&dev->urbs_lock, listflags);
+       if (!list_empty(&dev->urbs)) {
+               urb = list_first_entry(&dev->urbs, struct urb, urb_list);
+               list_del(&urb->urb_list);
+       }
+       spin_unlock_irqrestore(&dev->urbs_lock, listflags);
+       if (urb == NULL) {
+               /* If we hit this case, it means that we added our urb to the
+                * list while there was an urb in flight, and that urb
+                * completed, causing our urb to be submitted; in addition, our
+                * urb completed too, all before we got to schedule this work.
+                * Unlikely, but possible. */
+               usb_autopm_put_interface(dev->iface);
+               return;
+       }
+
+       dev->active = urb;
+       status = usb_submit_urb(urb, GFP_KERNEL);
+       if (status < 0) {
+               GOBI_ERROR("failed to submit urb: %d (packet dropped)", status);
+               free_urb_with_skb(urb);
+               dev->active = NULL;
+               usb_autopm_put_interface(dev->iface);
+       }
+}
+
+static int qcnet_startxmit(struct sk_buff *skb, struct net_device *netdev)
+{
+       unsigned long listflags;
+       struct urb *urb;
+       struct usbnet *usbnet = netdev_priv(netdev);
+       struct qcusbnet *dev = (struct qcusbnet *)usbnet->data[0];
+
+       if (qc_isdown(dev, DOWN_DRIVER_SUSPENDED)) {
+               GOBI_ERROR("device is suspended (packet requeued)");
+               return NETDEV_TX_BUSY;
+       }
+
+       urb = usb_alloc_urb(0, GFP_ATOMIC);
+       if (!urb) {
+               GOBI_ERROR("failed to allocate urb (packet requeued)");
+               return NETDEV_TX_BUSY;
+       }
+
+       usb_fill_bulk_urb(urb, dev->usbnet->udev, dev->usbnet->out,
+                         skb->data, skb->len, qcnet_complete, skb);
+       *(struct qcusbnet **)skb->cb = dev;
+
+       spin_lock_irqsave(&dev->urbs_lock, listflags);
+       list_add_tail(&urb->urb_list, &dev->urbs);
+       spin_unlock_irqrestore(&dev->urbs_lock, listflags);
+
+       queue_work(dev->workqueue, &dev->startxmit);
+
+       netdev->trans_start = jiffies;
+
+       return NETDEV_TX_OK;
+}
+
+static int qcnet_open(struct net_device *netdev)
+{
+       int status = 0;
+       struct qcusbnet *dev;
+       struct usbnet *usbnet = netdev_priv(netdev);
+
+       BUG_ON(!usbnet);
+
+       dev = (struct qcusbnet *)usbnet->data[0];
+       BUG_ON(!dev);
+
+       qc_cleardown(dev, DOWN_NET_IFACE_STOPPED);
+       if (dev->open) {
+               status = dev->open(netdev);
+               if (status == 0) {
+                       usb_autopm_put_interface(dev->iface);
+               }
+       } else {
+               GOBI_WARN("no USBNetOpen defined");
+       }
+
+       return status;
+}
+
+int qcnet_stop(struct net_device *netdev)
+{
+       struct qcusbnet *dev;
+       struct usbnet *usbnet = netdev_priv(netdev);
+
+       BUG_ON(!usbnet);
+
+       dev = (struct qcusbnet *)usbnet->data[0];
+       BUG_ON(!dev);
+
+       qc_setdown(dev, DOWN_NET_IFACE_STOPPED);
+
+       if (dev->stop != NULL)
+               return dev->stop(netdev);
+       return 0;
+}
+
+static const struct driver_info qc_netinfo = {
+       .description   = "QCUSBNet Ethernet Device",
+       .flags         = FLAG_ETHER | FLAG_WWAN,
+       .bind          = qcnet_bind,
+       .unbind        = qcnet_unbind,
+       .data          = 0,
+};
+
+#define MKVIDPID(v, p)                                 \
+{                                                      \
+       USB_DEVICE(v, p),                               \
+       .driver_info = (unsigned long)&qc_netinfo,      \
+}
+
+static const struct usb_device_id qc_vidpids[] = {
+       MKVIDPID(0x05c6, 0x9215),       /* Acer Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9265),       /* Asus Gobi 2000 */
+       MKVIDPID(0x16d8, 0x8002),       /* CMOTech Gobi 2000 */
+       MKVIDPID(0x413c, 0x8186),       /* Dell Gobi 2000 */
+       MKVIDPID(0x1410, 0xa010),       /* Entourage Gobi 2000 */
+       MKVIDPID(0x1410, 0xa011),       /* Entourage Gobi 2000 */
+       MKVIDPID(0x1410, 0xa012),       /* Entourage Gobi 2000 */
+       MKVIDPID(0x1410, 0xa013),       /* Entourage Gobi 2000 */
+       MKVIDPID(0x03f0, 0x251d),       /* HP Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9205),       /* Lenovo Gobi 2000 */
+       MKVIDPID(0x05c6, 0x920b),       /* Generic Gobi 2000 */
+       MKVIDPID(0x04da, 0x250f),       /* Panasonic Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9245),       /* Samsung Gobi 2000 */
+       MKVIDPID(0x1199, 0x9001),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9002),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9003),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9004),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9005),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9006),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9007),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9008),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x9009),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x1199, 0x900a),       /* Sierra Wireless Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9225),       /* Sony Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9235),       /* Top Global Gobi 2000 */
+       MKVIDPID(0x05c6, 0x9275),       /* iRex Technologies Gobi 2000 */
+
+       MKVIDPID(0x05c6, 0x920d),       /* Qualcomm Gobi 3000 */
+       MKVIDPID(0x1410, 0xa021),       /* Novatel Gobi 3000 */
+       MKVIDPID(0x413c, 0x8194),       /* Dell Gobi 3000 */
+       MKVIDPID(0x12D1, 0x14F1),       /* Sony Gobi 3000 */
+       { }
+};
+
+MODULE_DEVICE_TABLE(usb, qc_vidpids);
+
+static u8 nibble(unsigned char c)
+{
+       if (likely(isdigit(c)))
+               return c - '0';
+       c = toupper(c);
+       if (likely(isxdigit(c)))
+               return 10 + c - 'A';
+       return 0;
+}
+
+static int discover_endpoints(struct qcusbnet *dev)
+{
+       int numends;
+       int i;
+       struct usb_host_endpoint *endpoint = NULL;
+       struct usb_host_endpoint *int_in   = NULL;
+       struct usb_host_endpoint *bulk_in  = NULL;
+       struct usb_host_endpoint *bulk_out = NULL;
+       int dir_in, dir_out, xfer_int;
+
+       GOBI_DEBUG("interface number: %d",
+               dev->iface->cur_altsetting->desc.bInterfaceNumber);
+
+       numends = dev->iface->cur_altsetting->desc.bNumEndpoints;
+       for (i = 0; i < numends; i++) {
+               endpoint = dev->iface->cur_altsetting->endpoint + i;
+
+               dir_in = usb_endpoint_dir_in(&endpoint->desc);
+               dir_out = usb_endpoint_dir_out(&endpoint->desc);
+               xfer_int = usb_endpoint_xfer_int(&endpoint->desc);
+
+               GOBI_DEBUG("endpoint %d: addr %x "
+                       "dir_in %d dir_out %d xfer_int %d",
+                       i, endpoint->desc.bEndpointAddress,
+                       dir_in, dir_out, xfer_int);
+
+               if (dir_in && xfer_int) {
+                       if (int_in) {
+                               GOBI_ERROR("multiple int_in endpoints");
+                               return -ENODEV;
+                       }
+                       GOBI_DEBUG("setting endpoint %d as int in", i);
+                       int_in = endpoint;
+               } else if (dir_in && !xfer_int) {
+                       if (bulk_in) {
+                               GOBI_ERROR("multiple bulk_in endpoints");
+                               return -ENODEV;
+                       }
+                       GOBI_DEBUG("setting endpoint %d as bulk in", i);
+                       bulk_in = endpoint;
+               } else if (dir_out && !xfer_int) {
+                       if (bulk_out) {
+                               GOBI_ERROR("multiple bulk_out endpoints");
+                               return -ENODEV;
+                       }
+                       GOBI_DEBUG("setting endpoint %d as bulk out", i);
+                       bulk_out = endpoint;
+               } else {
+                       GOBI_DEBUG("ignoring endpoint %d", i);
+               }
+       }
+
+       if (!int_in || !bulk_in || !bulk_out) {
+               GOBI_ERROR("missing endpoint(s)");
+               if (int_in)
+                       GOBI_ERROR("found int_in endpoint: %u",
+                               int_in->desc.bEndpointAddress);
+               else
+                       GOBI_ERROR("didn't find int_in endpoint");
+               if (bulk_in)
+                       GOBI_ERROR("found bulk_in endpoint: %u",
+                               bulk_in->desc.bEndpointAddress);
+               else
+                       GOBI_ERROR("didn't find bulk_in endpoint");
+               if (bulk_out)
+                       GOBI_ERROR("found bulk_out endpoint: %u",
+                               bulk_out->desc.bEndpointAddress);
+               else
+                       GOBI_ERROR("didn't find bulk_out endpoint");
+               return -ENODEV;
+       }
+
+       dev->iface_num     = dev->iface->cur_altsetting->desc.bInterfaceNumber;
+       dev->int_in_endp   = int_in->desc.bEndpointAddress;
+       dev->bulk_in_endp  = bulk_in->desc.bEndpointAddress;
+       dev->bulk_out_endp = bulk_out->desc.bEndpointAddress;
+
+       GOBI_DEBUG("found endpoints: iface_num %u "
+               "int_in %u bulk_in %u bulk_out %u",
+               dev->iface_num,
+               dev->int_in_endp, dev->bulk_in_endp, dev->bulk_out_endp);
+
+       return 0;
+}
+
+int qcnet_probe(struct usb_interface *iface, const struct usb_device_id *vidpids)
+{
+       int status;
+       struct usbnet *usbnet;
+       struct qcusbnet *dev;
+       struct net_device_ops *netdevops;
+       int i;
+       u8 *addr;
+
+       status = usbnet_probe(iface, vidpids);
+       if (status < 0) {
+               GOBI_WARN("usbnet_probe failed: %d", status);
+               goto fail;
+       }
+
+       usbnet = usb_get_intfdata(iface);
+
+       if (!usbnet) {
+               GOBI_ERROR("usbnet is NULL");
+               status = -ENXIO;
+               goto fail_disconnect;
+       }
+
+       if (!usbnet->net) {
+               GOBI_ERROR("usbnet->net is NULL");
+               status = -ENXIO;
+               goto fail_disconnect;
+       }
+
+       dev = kmalloc(sizeof(struct qcusbnet), GFP_KERNEL);
+       if (!dev) {
+               GOBI_ERROR("failed to allocate struct qcusbnet");
+               status = -ENOMEM;
+               goto fail_disconnect;
+       }
+
+       dev->dying = false;
+       dev->iface = iface;
+
+       status = discover_endpoints(dev);
+       if (status) {
+               GOBI_ERROR("discover_endpoints failed: %d", status);
+               goto fail_free;
+       }
+
+       usbnet->data[0] = (unsigned long)dev;
+
+       dev->usbnet = usbnet;
+
+       netdevops = kmalloc(sizeof(struct net_device_ops), GFP_KERNEL);
+       if (!netdevops) {
+               GOBI_ERROR("failed to allocate net device ops");
+               status = -ENOMEM;
+               goto fail_free;
+       }
+       memcpy(netdevops, usbnet->net->netdev_ops, sizeof(struct net_device_ops));
+
+       /* TODO(ttuttle): Can we just make a static copy of this? */
+       dev->open = netdevops->ndo_open;
+       netdevops->ndo_open = qcnet_open;
+       dev->stop = netdevops->ndo_stop;
+       netdevops->ndo_stop = qcnet_stop;
+       netdevops->ndo_start_xmit = qcnet_startxmit;
+       netdevops->ndo_tx_timeout = qcnet_txtimeout;
+
+       usbnet->net->netdev_ops = netdevops;
+
+       memset(&(dev->usbnet->net->stats), 0, sizeof(struct net_device_stats));
+
+       memset(&(dev->meid), '0', 14);
+
+       dev->valid = false;
+       memset(&dev->qmi, 0, sizeof(dev->qmi));
+
+       dev->qmi.devclass = devclass;
+
+       kref_init(&dev->refcount);
+       INIT_LIST_HEAD(&dev->node);
+       INIT_LIST_HEAD(&dev->qmi.clients);
+       dev->workqueue = alloc_ordered_workqueue("gobi", 0);
+
+       spin_lock_init(&dev->urbs_lock);
+       INIT_LIST_HEAD(&dev->urbs);
+       dev->active = NULL;
+       INIT_WORK(&dev->startxmit, qcnet_bg_startxmit);
+       INIT_WORK(&dev->txtimeout, qcnet_bg_txtimeout);
+       INIT_WORK(&dev->complete, qcnet_bg_complete);
+
+       spin_lock_init(&dev->qmi.clients_lock);
+
+       dev->down = 0;
+       qc_setdown(dev, DOWN_NO_NDIS_CONNECTION);
+       qc_setdown(dev, DOWN_NET_IFACE_STOPPED);
+
+       status = qc_register(dev);
+       if (status) {
+               GOBI_ERROR("qc_register failed: %d", status);
+               goto fail_destroy;
+       }
+
+       iface->needs_remote_wakeup = 1;
+
+       mutex_lock(&qcusbnet_lock);
+       /* Give our initial ref to the list */
+       list_add(&dev->node, &qcusbnet_list);
+       mutex_unlock(&qcusbnet_lock);
+
+       /* After calling qc_register, MEID is valid */
+       addr = &usbnet->net->dev_addr[0];
+       for (i = 0; i < 6; i++)
+               addr[i] = (nibble(dev->meid[i*2+2]) << 4)+
+                       nibble(dev->meid[i*2+3]);
+       addr[0] &= 0xfe;                /* clear multicast bit */
+       addr[0] |= 0x02;                /* set local assignment bit (IEEE802) */
+
+       return 0;
+
+fail_destroy:
+       destroy_workqueue(dev->workqueue);
+fail_free:
+       kfree(dev);
+fail_disconnect:
+       usbnet_disconnect(iface);
+fail:
+       return status;
+}
+EXPORT_SYMBOL_GPL(qcnet_probe);
+
+static void qcnet_disconnect(struct usb_interface *intf)
+{
+       struct usbnet *usbnet = usb_get_intfdata(intf);
+       struct qcusbnet *dev = (struct qcusbnet *)usbnet->data[0];
+       struct list_head *node, *tmp;
+       struct urb *urb;
+
+       intf->needs_remote_wakeup = 0;
+       netif_carrier_off(usbnet->net);
+       usbnet_disconnect(intf);
+
+       qc_deregister(dev);
+
+       destroy_workqueue(dev->workqueue);
+       list_for_each_safe(node, tmp, &dev->urbs) {
+               urb = list_entry(node, struct urb, urb_list);
+               list_del(&urb->urb_list);
+               free_urb_with_skb(urb);
+       }
+       qcusbnet_put(dev);
+}
+
+static struct usb_driver qcusbnet = {
+       .name       = "gobi",
+       .id_table   = qc_vidpids,
+       .probe      = qcnet_probe,
+       .disconnect = qcnet_disconnect,
+       .suspend    = qc_suspend,
+       .resume     = qc_resume,
+       .supports_autosuspend = true,
+};
+
+static int __init modinit(void)
+{
+       devclass = class_create(THIS_MODULE, "QCQMI");
+       if (IS_ERR(devclass)) {
+               GOBI_ERROR("class_create failed: %ld", PTR_ERR(devclass));
+               return -ENOMEM;
+       }
+       printk(KERN_INFO "%s: %s", DRIVER_DESC, DRIVER_VERSION);
+       return usb_register(&qcusbnet);
+}
+module_init(modinit);
+
+static void __exit modexit(void)
+{
+       usb_deregister(&qcusbnet);
+       class_destroy(devclass);
+}
+module_exit(modexit);
+
+MODULE_VERSION(DRIVER_VERSION);
+MODULE_AUTHOR(DRIVER_AUTHOR);
+MODULE_DESCRIPTION(DRIVER_DESC);
+MODULE_LICENSE("Dual BSD/GPL");
+
+module_param(gobi_debug, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(gobi_debug, "Debugging level");
diff --git a/drivers/net/usb/gobi/qcusbnet.h b/drivers/net/usb/gobi/qcusbnet.h
new file mode 100644 (file)
index 0000000..00c3a7e
--- /dev/null
@@ -0,0 +1,28 @@
+/* qcusbnet.h - gobi network device header
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef QCUSBNET_QCUSBNET_H
+#define QCUSBNET_QCUSBNET_H
+
+#include "structs.h"
+
+extern int qc_suspend(struct usb_interface *iface, pm_message_t event);
+extern void qcusbnet_put(struct qcusbnet *dev);
+extern struct qcusbnet *qcusbnet_get(struct qcusbnet *dev);
+
+#endif /* !QCUSBNET_QCUSBNET_H */
diff --git a/drivers/net/usb/gobi/qmi.c b/drivers/net/usb/gobi/qmi.c
new file mode 100644 (file)
index 0000000..f825e9c
--- /dev/null
@@ -0,0 +1,449 @@
+/* qmi.c - QMI protocol implementation
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "qmi.h"
+#include "buffer.h"
+#include "structs.h"
+
+#include <linux/string.h>
+
+struct qmux {
+       u8 tf;  /* always 1 */
+       u16 len;
+       u8 ctrl;
+       u8 service;
+       u8 qmicid;
+} __attribute__((__packed__));
+
+struct getcid_req {
+       struct qmux header;
+       u8 req;
+       u8 tid;
+       u16 msgid;
+       u16 tlvsize;
+       u8 service;
+       u16 size;
+       u8 qmisvc;
+} __attribute__((__packed__));
+
+struct releasecid_req {
+       struct qmux header;
+       u8 req;
+       u8 tid;
+       u16 msgid;
+       u16 tlvsize;
+       u8 rlscid;
+       u16 size;
+       u16 cid;
+} __attribute__((__packed__));
+
+struct ready_req {
+       struct qmux header;
+       u8 req;
+       u8 tid;
+       u16 msgid;
+       u16 tlvsize;
+} __attribute__((__packed__));
+
+struct seteventreport_req {
+       struct qmux header;
+       u8 req;
+       u16 tid;
+       u16 msgid;
+       u16 tlvsize;
+       u8 reportchanrate;
+       u16 size;
+       u8 period;
+       u32 mask;
+} __attribute__((__packed__));
+
+struct getpkgsrvcstatus_req {
+       struct qmux header;
+       u8 req;
+       u16 tid;
+       u16 msgid;
+       u16 tlvsize;
+} __attribute__((__packed__));
+
+struct getmeid_req {
+       struct qmux header;
+       u8 req;
+       u16 tid;
+       u16 msgid;
+       u16 tlvsize;
+} __attribute__((__packed__));
+
+const size_t qmux_size = sizeof(struct qmux);
+
+struct buffer *qmictl_new_getcid(u8 tid, u8 svctype)
+{
+       struct getcid_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x0022;
+       req->tlvsize = 0x0004;
+       req->service = 0x01;
+       req->size = 0x0001;
+       req->qmisvc = svctype;
+       return buf;
+}
+
+struct buffer *qmictl_new_releasecid(u8 tid, u16 cid)
+{
+       struct releasecid_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x0023;
+       req->tlvsize = 0x05;
+       req->rlscid = 0x01;
+       req->size = 0x0002;
+       req->cid = cid;
+       return buf;
+}
+
+struct buffer *qmictl_new_ready(u8 tid)
+{
+       struct ready_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x21;
+       req->tlvsize = 0;
+       return buf;
+}
+
+struct buffer *qmiwds_new_seteventreport(u8 tid)
+{
+       struct seteventreport_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x0001;
+       req->tlvsize = 0x0008;
+       req->reportchanrate = 0x11;
+       req->size = 0x0005;
+       req->period = 0x01;
+       req->mask = 0x000000ff;
+       return buf;
+}
+
+struct buffer *qmiwds_new_getpkgsrvcstatus(u8 tid)
+{
+       struct getpkgsrvcstatus_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x22;
+       req->tlvsize = 0x0000;
+       return buf;
+}
+
+struct buffer *qmidms_new_getmeid(u8 tid)
+{
+       struct getmeid_req *req;
+       struct buffer *buf = buffer_new(sizeof *req);
+       if (!buf)
+               return NULL;
+       req = buffer_data(buf);
+       req->req = 0x00;
+       req->tid = tid;
+       req->msgid = 0x25;
+       req->tlvsize = 0x0000;
+       return buf;
+}
+
+int qmux_parse(u16 *cid, void *buf, size_t size)
+{
+       struct qmux *qmux = buf;
+
+       BUG_ON(!buf);
+
+       if (size < 12)
+               return -ENOMEM;
+
+       if (qmux->tf != 1 || qmux->len != size - 1 || qmux->ctrl != 0x80)
+               return -EINVAL;
+
+       *cid = (qmux->qmicid << 8) + qmux->service;
+       return sizeof(*qmux);
+}
+
+int qmux_fill(u16 cid, struct buffer *buf)
+{
+       struct qmux *qmux = buffer_data(buf);
+
+       if (buffer_size(buf) < sizeof(*qmux))
+               return -ENOMEM;
+
+       qmux->tf = 1;
+       qmux->len = buffer_size(buf) - 1;
+       qmux->ctrl = 0;
+       qmux->service = cid & 0xff;
+       qmux->qmicid = cid >> 8;
+       return 0;
+}
+
+static int tlv_get(void *msg, u16 msgsize, u8 type, void *buf, u16 bufsize)
+{
+       u16 pos;
+       u16 msize = 0;
+
+       BUG_ON(!msg || !buf);
+
+       for (pos = 4; pos + 3 < msgsize; pos += msize + 3) {
+               msize = *(u16 *)(msg + pos + 1);
+
+               if (*(u8 *)(msg + pos) != type)
+                       continue;
+
+               if (bufsize < msize) {
+                       GOBI_ERROR("found type 0x%02x, "
+                           "but value too big (%d > %d)",
+                           type, msize, bufsize);
+                       return -ENOMEM;
+               }
+
+               memcpy(buf, msg + pos + 3, msize);
+
+               return msize;
+       }
+
+       GOBI_WARN("didn't find type 0x%02x", type);
+       return -ENOMSG;
+}
+
+int qmi_msgisvalid(void *msg, u16 size)
+{
+       u16 tlv[2];
+       int result;
+       u16 tsize;
+
+       BUG_ON(!msg);
+
+       result = tlv_get(msg, size, 2, tlv, 4);
+       if (result < 0) {
+               GOBI_ERROR("tlv_get failed: %d", result);
+               return result;
+       }
+       tsize = result;
+
+       if (tsize != 4) {
+               GOBI_ERROR("size is wrong (%d != 4)", tsize);
+               return -ENOMSG;
+       }
+
+       if (tlv[0] != 0) {
+               GOBI_WARN("tlv[0]=%d, tlv[1]=%d", tlv[0], tlv[1]);
+               return tlv[1];
+       } else {
+               return 0;
+       }
+}
+
+int qmi_msgid(void *msg, u16 size)
+{
+       BUG_ON(!msg);
+
+       if (size < 2) {
+               GOBI_ERROR("message too short (%d < 2)", size);
+               return -ENODATA;
+       }
+
+       return *(u16 *)msg;
+}
+
+int qmictl_alloccid_resp(void *buf, u16 size, u16 *cid)
+{
+       int result;
+       u8 offset = sizeof(struct qmux) + 2;
+
+       BUG_ON(!buf);
+
+       if (size < offset) {
+               GOBI_ERROR("message too short (%d < %d)", size, offset);
+               return -ENOMEM;
+       }
+
+       buf = buf + offset;
+       size -= offset;
+
+       result = qmi_msgid(buf, size);
+       if (result != 0x22) {
+               GOBI_ERROR("wrong message ID (0x%02x != 0x22)", result);
+               return -EFAULT;
+       }
+
+       result = qmi_msgisvalid(buf, size);
+       if (result != 0) {
+               GOBI_WARN("invalid message");
+               return -EFAULT;
+       }
+
+       result = tlv_get(buf, size, 0x01, cid, 2);
+       if (result < 0) {
+               GOBI_ERROR("tlv_get failed: %d", result);
+               return result;
+       }
+       if (result != 2) {
+               GOBI_ERROR("size is wrong (%d != 2)", result);
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+int qmictl_freecid_resp(void *buf, u16 size)
+{
+       int result;
+       u8 offset = sizeof(struct qmux) + 2;
+
+       BUG_ON(!buf);
+
+       if (size < offset) {
+               GOBI_ERROR("message too short (%d < %d)", size, offset);
+               return -ENOMEM;
+       }
+
+       buf = buf + offset;
+       size -= offset;
+
+       result = qmi_msgid(buf, size);
+       if (result != 0x23) {
+               GOBI_ERROR("wrong message ID (0x%02x != 0x23)", result);
+               return -EFAULT;
+       }
+
+       result = qmi_msgisvalid(buf, size);
+       if (result != 0) {
+               GOBI_ERROR("invalid message");
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+int qmiwds_event_resp(void *buf, u16 size, struct qmiwds_stats *stats)
+{
+       int result;
+       u8 status[2];
+
+       u8 offset = sizeof(struct qmux) + 3;
+
+       BUG_ON(!buf || !stats);
+
+       if (size < offset) {
+               GOBI_ERROR("message too short (%d < %d)", size, offset);
+               return -ENOMEM;
+       }
+
+       buf = buf + offset;
+       size -= offset;
+
+       result = qmi_msgid(buf, size);
+       if (result == 0x01) {
+               /* TODO(ttuttle): Error checking? */
+               /* TODO(ttuttle): Endianness? */
+               tlv_get(buf, size, 0x10, &stats->txok, 4);
+               tlv_get(buf, size, 0x11, &stats->rxok, 4);
+               tlv_get(buf, size, 0x12, &stats->txerr, 4);
+               tlv_get(buf, size, 0x13, &stats->rxerr, 4);
+               tlv_get(buf, size, 0x14, &stats->txofl, 4);
+               tlv_get(buf, size, 0x15, &stats->rxofl, 4);
+               tlv_get(buf, size, 0x19, &stats->txbytesok, 8);
+               tlv_get(buf, size, 0x1A, &stats->rxbytesok, 8);
+       } else if (result == 0x22) {
+               result = tlv_get(buf, size, 0x01, &status[0], 2);
+               if (result < 0) {
+                       GOBI_ERROR("tlv_get failed: %d", result);
+                       return result;
+               }
+
+               if (result >= 1)
+                       stats->linkstate = status[0] == 0x02;
+               if (result == 2)
+                       stats->reconfigure = status[1] == 0x01;
+       } else {
+               GOBI_ERROR("wrong message ID (0x%02x != 0x01, 0x22)", result);
+               return -EFAULT;
+       }
+
+       return 0;
+}
+
+int qmidms_meid_resp(void *buf,        u16 size, char *meid, int meidsize)
+{
+       int result;
+
+       u8 offset = sizeof(struct qmux) + 3;
+
+       BUG_ON(!buf);
+
+       if (size < offset) {
+               GOBI_ERROR("message too short (%d < %d)", size, offset);
+               return -ENOMEM;
+       }
+
+       if (meidsize < 14) {
+               GOBI_ERROR("buffer too small (%d < %d)", meidsize, 14);
+               return -ENOMEM;
+       }
+
+       buf = buf + offset;
+       size -= offset;
+
+       result = qmi_msgid(buf, size);
+       if (result != 0x25) {
+               GOBI_ERROR("wrong message ID (0x%02x != 0x25)", result);
+               return -EFAULT;
+       }
+
+       result = qmi_msgisvalid(buf, size);
+       if (result) {
+               GOBI_ERROR("invalid message");
+               return -EFAULT;
+       }
+
+       result = tlv_get(buf, size, 0x12, meid, 14);
+       if (result < 0) {
+               GOBI_ERROR("tlv_get failed: %d", result);
+               return -EFAULT;
+       }
+       if (result != 14) {
+               GOBI_ERROR("size is wrong (%d != 14)", result);
+               return -EFAULT;
+       }
+
+       return 0;
+}
diff --git a/drivers/net/usb/gobi/qmi.h b/drivers/net/usb/gobi/qmi.h
new file mode 100644 (file)
index 0000000..f9a0742
--- /dev/null
@@ -0,0 +1,69 @@
+/* qmi.h - QMI protocol header
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef QCUSBNET_QMI_H
+#define QCUSBNET_QMI_H
+
+#include <linux/types.h>
+
+struct buffer;
+
+#define QMICTL 0
+#define QMIWDS 1
+#define QMIDMS 2
+
+#define true      1
+#define false     0
+
+#define ENOMEM    12
+#define EFAULT    14
+#define EINVAL    22
+#define ENOMSG    42
+#define ENODATA   61
+
+int qmux_parse(u16 *cid, void *buf, size_t size);
+int qmux_fill(u16 cid, struct buffer *buf);
+
+extern const size_t qmux_size;
+
+struct buffer *qmictl_new_getcid(u8 tid, u8 svctype);
+struct buffer *qmictl_new_releasecid(u8 tid, u16 cid);
+struct buffer *qmictl_new_ready(u8 tid);
+struct buffer *qmiwds_new_seteventreport(u8 tid);
+struct buffer *qmiwds_new_getpkgsrvcstatus(u8 tid);
+struct buffer *qmidms_new_getmeid(u8 tid);
+
+struct qmiwds_stats {
+       u32 txok;
+       u32 rxok;
+       u32 txerr;
+       u32 rxerr;
+       u32 txofl;
+       u32 rxofl;
+       u64 txbytesok;
+       u64 rxbytesok;
+       bool linkstate;
+       bool reconfigure;
+};
+
+int qmictl_alloccid_resp(void *buf, u16 size, u16 *cid);
+int qmictl_freecid_resp(void *buf, u16 size);
+int qmiwds_event_resp(void *buf, u16 size, struct qmiwds_stats *stats);
+int qmidms_meid_resp(void *buf, u16 size, char *meid, int meidsize);
+
+#endif /* !QCUSBNET_QMI_H */
diff --git a/drivers/net/usb/gobi/qmidevice.c b/drivers/net/usb/gobi/qmidevice.c
new file mode 100644 (file)
index 0000000..712a48d
--- /dev/null
@@ -0,0 +1,1896 @@
+/* qmidevice.c - gobi QMI device
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#include "buffer.h"
+#include "qmidevice.h"
+#include "qcusbnet.h"
+
+#include <linux/module.h>
+#include <linux/compat.h>
+#include <linux/poll.h>
+#include <asm/byteorder.h>
+
+struct readreq {
+       struct list_head node;
+       void *data;
+       u16 tid;
+       u16 size;
+};
+
+struct notifyreq {
+       struct list_head node;
+       void (*func)(struct qcusbnet *, u16, void *);
+       u16  cid;
+       u16  tid;
+       void *data;
+};
+
+struct client {
+       struct list_head node;
+       u16 cid;
+       struct list_head reads;
+       struct list_head notifies;
+       struct list_head urbs;
+       wait_queue_head_t poll_queue;
+};
+
+struct urbsetup {
+       u8 type;
+       u8 code;
+       u16 value;
+       u16 index;
+       u16 len;
+};
+
+struct qmihandle {
+       u16 cid;
+       struct qcusbnet *dev;
+};
+
+#define CID_NONE ((u16)-1)
+
+enum {
+       SYNC_INTERRUPTIBLE = 0x0,
+       SYNC_TIMEOUT = 0x1,
+       SYNC_UNINTERRUPTIBLE = 0x2
+};
+
+#define QMI_SYNC_TIMEOUT_MSEC 2000
+#define QMI_SYNC_TIMEOUT_JIFFIES msecs_to_jiffies(QMI_SYNC_TIMEOUT_MSEC)
+
+static int qcusbnet2k_fwdelay;
+
+static bool device_valid(struct qcusbnet *dev);
+static struct client *client_bycid(struct qcusbnet *dev, u16 cid);
+static bool client_addread(struct qcusbnet *dev, u16 cid, u16 tid, void *data, u16 size);
+static bool client_delread(struct qcusbnet *dev, u16 cid, u16 tid, void **data, u16 *size);
+static bool client_addnotify(struct qcusbnet *dev, u16 cid, u16 tid,
+                            void (*hook)(struct qcusbnet *, u16 cid, void *),
+                            void *data);
+static struct notifyreq *client_remove_notify(struct client *client, u16 tid);
+static void client_notify_and_free(struct qcusbnet *dev,
+                                  struct notifyreq *notify);
+static void client_notify_list(struct qcusbnet *dev,
+                              struct list_head *notifies);
+static bool client_addurb(struct qcusbnet *dev, u16 cid, struct urb *urb);
+static struct urb *client_delurb(struct qcusbnet *dev, u16 cid,
+                                struct urb *urb);
+
+static int resubmit_int_urb(struct urb *urb);
+
+static int devqmi_open(struct inode *inode, struct file *file);
+static long devqmi_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
+#ifdef CONFIG_COMPAT
+static long devqmi_compat_ioctl(struct file *file, unsigned int cmd,
+                               unsigned long arg);
+#endif
+static int devqmi_release(struct inode *inode, struct file *file);
+static ssize_t devqmi_read(struct file *file, char __user *buf, size_t size,
+                          loff_t *pos);
+static ssize_t devqmi_write(struct file *file, const char __user *buf,
+                           size_t size, loff_t *pos);
+static unsigned devqmi_poll(struct file *file,
+                           struct poll_table_struct *poll_table);
+
+static bool qmi_ready(struct qcusbnet *dev, u16 timeout);
+static void wds_callback(struct qcusbnet *dev, u16 cid, void *data);
+static int setup_wds_callback(struct qcusbnet *dev, int sync_flags);
+static int qmidms_getmeid(struct qcusbnet *dev, int sync_flags);
+
+#define IOCTL_QMI_GET_SERVICE_FILE     (0x8BE0 + 1)
+#define IOCTL_QMI_GET_DEVICE_VIDPID    (0x8BE0 + 2)
+#define IOCTL_QMI_GET_DEVICE_MEID      (0x8BE0 + 3)
+#define IOCTL_QMI_CLOSE                (0x8BE0 + 4)
+
+static const struct file_operations devqmi_fops = {
+       .owner   = THIS_MODULE,
+       .read    = devqmi_read,
+       .write   = devqmi_write,
+       .poll    = devqmi_poll,
+       .unlocked_ioctl   = devqmi_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = devqmi_compat_ioctl,
+#endif
+       .open    = devqmi_open,
+       .release = devqmi_release,
+};
+
+#ifdef CONFIG_SMP
+static inline void assert_locked(struct qcusbnet *dev)
+{
+       BUG_ON(!spin_is_locked(&dev->qmi.clients_lock));
+}
+#else
+static inline void assert_locked(struct qcusbnet *dev)
+{
+
+}
+#endif
+
+static bool device_valid(struct qcusbnet *dev)
+{
+       return dev && dev->valid;
+}
+
+void qc_setdown(struct qcusbnet *dev, u8 reason)
+{
+       set_bit(reason, &dev->down);
+       netif_carrier_off(dev->usbnet->net);
+}
+
+void qc_cleardown(struct qcusbnet *dev, u8 reason)
+{
+       clear_bit(reason, &dev->down);
+       if (!dev->down)
+               netif_carrier_on(dev->usbnet->net);
+}
+
+bool qc_isdown(struct qcusbnet *dev, u8 reason)
+{
+       return test_bit(reason, &dev->down);
+}
+
+static int resubmit_int_urb(struct urb *urb)
+{
+       int status;
+       int interval;
+
+       BUG_ON(!urb);
+       BUG_ON(!urb->dev);
+
+       interval = urb->dev->speed == USB_SPEED_HIGH ? 7 : 3;
+       usb_fill_int_urb(urb, urb->dev, urb->pipe, urb->transfer_buffer,
+                        urb->transfer_buffer_length, urb->complete,
+                        urb->context, interval);
+       status = usb_submit_urb(urb, GFP_ATOMIC);
+       if (status)
+               GOBI_ERROR("failed to resubmit int urb: %d", status);
+       return status;
+}
+
+static void read_callback(struct urb *urb)
+{
+       struct list_head *node;
+       int result;
+       u16 cid;
+       struct client *client;
+       void *data;
+       void *copy;
+       u16 size;
+       struct qcusbnet *dev;
+       unsigned long flags;
+       u16 tid;
+       LIST_HEAD(notifies);
+
+       BUG_ON(!urb);
+
+       dev = urb->context;
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return;
+       }
+
+       if (urb->status) {
+               GOBI_ERROR("urb status = %d", urb->status);
+               resubmit_int_urb(dev->qmi.inturb);
+               return;
+       }
+
+       GOBI_DEBUG("read %d bytes", urb->actual_length);
+
+       data = urb->transfer_buffer;
+       size = urb->actual_length;
+
+       if (gobi_debug >= 2)
+               print_hex_dump(KERN_INFO, "gobi-read: ", DUMP_PREFIX_OFFSET,
+                              16, 1, data, size, true);
+
+       result = qmux_parse(&cid, data, size);
+       if (result < 0) {
+               GOBI_ERROR("failed to parse read: %d", result);
+               resubmit_int_urb(dev->qmi.inturb);
+               return;
+       }
+
+       if (size < result + 3) {
+               GOBI_ERROR("data buffer too small (%d < %d)", size, result + 3);
+               resubmit_int_urb(dev->qmi.inturb);
+               return;
+       }
+
+       if (cid == QMICTL)
+               tid = *(u8 *)(data + result + 1);
+       else
+               tid = *(u16 *)(data + result + 1);
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       list_for_each(node, &dev->qmi.clients) {
+               client = list_entry(node, struct client, node);
+               if (client->cid == cid || (client->cid | 0xff00) == cid) {
+                       struct notifyreq *notify;
+
+                       copy = kmalloc(size, GFP_ATOMIC);
+                       memcpy(copy, data, size);
+                       if (!client_addread(dev, client->cid, tid, copy, size)) {
+                               GOBI_ERROR("failed to add read; discarding "
+                                          "read of cid=0x%04x tid=0x%04x",
+                                          cid, tid);
+                               kfree(copy);
+                               break;
+                       }
+
+                       /* TODO(ttuttle): Should we do this only if a
+                          notify is not registered? */
+                       wake_up_interruptible(&client->poll_queue);
+
+                       notify = client_remove_notify(client, tid);
+                       if (notify)
+                               list_add(&notify->node, &notifies);
+                       if (cid >> 8 != 0xff)
+                               break;
+               }
+       }
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       client_notify_list(dev, &notifies);
+       resubmit_int_urb(dev->qmi.inturb);
+}
+
+static void int_callback(struct urb *urb)
+{
+       struct qcusbnet *dev = (struct qcusbnet *)urb->context;
+       int status;
+       int len;
+       u8 *buf;
+       u8 req_type, request;
+       u16 iface_num;
+       u32 upstream, downstream;
+
+       static const u8 GET_ENCAPSULATED_RESPONSE = 0x01;
+       static const u8 CONNECTION_SPEED_CHANGE   = 0x2A;
+
+       if (!device_valid(dev)) {
+               GOBI_WARN("invalid device");
+               return;
+       }
+
+       if (urb->status) {
+               GOBI_ERROR("urb status = %d", urb->status);
+               if (urb->status == -EOVERFLOW)
+                       goto resubmit;
+               else
+                       return;
+       }
+
+       buf = urb->transfer_buffer;
+       len = urb->actual_length;
+
+       if (len < 8) {
+               GOBI_ERROR("urb too short (%d < 8)", len);
+               goto resubmit;
+       }
+
+       req_type  = buf[0];
+       request   = buf[1];
+       iface_num = le16_to_cpup((__le16 *)(buf + 4));
+
+       /* 0xA1 = dir: device-to-host, type: class, recipient: interface */
+       if (req_type != 0xA1) {
+               GOBI_ERROR("wrong request type (0x%02x != 0x%02x)",
+                       req_type, 0xA1);
+               goto resubmit;
+       }
+
+       if (iface_num != dev->iface_num) {
+               GOBI_ERROR("wrong interface number (0x%04x != 0x%04x)",
+                       iface_num, dev->iface_num);
+               goto resubmit;
+       }
+
+       if (request == GET_ENCAPSULATED_RESPONSE) {
+               if (len != 8) {
+                       GOBI_ERROR("wrong length (%d != 8)", len);
+                       goto resubmit;
+               }
+
+               GOBI_DEBUG("GET_ENCAPSULATED_RESPONSE");
+
+               usb_fill_control_urb(dev->qmi.readurb, dev->usbnet->udev,
+                                    usb_rcvctrlpipe(dev->usbnet->udev, 0),
+                                    (unsigned char *)dev->qmi.readsetup,
+                                    dev->qmi.readbuf,
+                                    DEFAULT_READ_URB_LENGTH,
+                                    read_callback, dev);
+               status = usb_submit_urb(dev->qmi.readurb, GFP_ATOMIC);
+               if (status) {
+                       GOBI_ERROR("failed to submit read urb: %d", status);
+                       goto resubmit;
+               }
+               /* Do not resubmit the int_urb because
+                * it will be resubmitted in read_callback */
+               return;
+       } else if (request == CONNECTION_SPEED_CHANGE) {
+               if (len != 16) {
+                       GOBI_ERROR("wrong length (%d != 16)", len);
+                       goto resubmit;
+               }
+
+               upstream   = le32_to_cpup((__le32 *)(buf +  8));
+               downstream = le32_to_cpup((__le32 *)(buf + 12));
+
+               GOBI_DEBUG("CONNECTION_SPEED_CHANGE: %d/%d",
+                       upstream, downstream);
+
+               if (upstream == 0 || downstream == 0) {
+                       qc_setdown(dev, DOWN_CDC_CONNECTION_SPEED);
+                       GOBI_DEBUG("traffic stopping due to "
+                                  "CONNECTION_SPEED_CHANGE");
+               } else {
+                       qc_cleardown(dev, DOWN_CDC_CONNECTION_SPEED);
+                       GOBI_DEBUG("resuming traffic due to "
+                                  "CONNECTION_SPEED_CHANGE");
+               }
+               goto resubmit;
+       } else {
+               GOBI_ERROR("invalid request: 0x%02x", request);
+               goto resubmit;
+       }
+
+resubmit:
+       resubmit_int_urb(dev->qmi.inturb);
+}
+
+int qc_startread(struct qcusbnet *dev)
+{
+       int interval;
+       int status;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return -ENXIO;
+       }
+
+       dev->qmi.readurb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!dev->qmi.readurb) {
+               GOBI_ERROR("failed to allocate read urb");
+               return -ENOMEM;
+       }
+
+       dev->qmi.inturb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!dev->qmi.inturb) {
+               GOBI_ERROR("failed to allocate int urb");
+               usb_free_urb(dev->qmi.readurb);
+               return -ENOMEM;
+       }
+
+       dev->qmi.readbuf = kmalloc(DEFAULT_READ_URB_LENGTH, GFP_KERNEL);
+       if (!dev->qmi.readbuf) {
+               GOBI_ERROR("failed to allocate read buffer");
+               usb_free_urb(dev->qmi.readurb);
+               usb_free_urb(dev->qmi.inturb);
+               return -ENOMEM;
+       }
+
+       dev->qmi.intbuf = kmalloc(DEFAULT_READ_URB_LENGTH, GFP_KERNEL);
+       if (!dev->qmi.intbuf) {
+               GOBI_ERROR("failed to allocate int buffer");
+               usb_free_urb(dev->qmi.readurb);
+               usb_free_urb(dev->qmi.inturb);
+               kfree(dev->qmi.readbuf);
+               return -ENOMEM;
+       }
+
+       dev->qmi.readsetup = kmalloc(sizeof(*dev->qmi.readsetup), GFP_KERNEL);
+       if (!dev->qmi.readsetup) {
+               GOBI_ERROR("failed to allocate setup packet buffer");
+               usb_free_urb(dev->qmi.readurb);
+               usb_free_urb(dev->qmi.inturb);
+               kfree(dev->qmi.readbuf);
+               kfree(dev->qmi.intbuf);
+               return -ENOMEM;
+       }
+
+       dev->qmi.readsetup->type = 0xA1;
+       dev->qmi.readsetup->code = 1;
+       dev->qmi.readsetup->value = 0;
+       dev->qmi.readsetup->index = dev->iface_num;
+       dev->qmi.readsetup->len = DEFAULT_READ_URB_LENGTH;
+
+       interval = (dev->usbnet->udev->speed == USB_SPEED_HIGH) ? 7 : 3;
+
+       usb_fill_int_urb(dev->qmi.inturb, dev->usbnet->udev,
+                        usb_rcvintpipe(dev->usbnet->udev, dev->int_in_endp),
+                        dev->qmi.intbuf, DEFAULT_READ_URB_LENGTH,
+                        int_callback, dev, interval);
+       status = usb_submit_urb(dev->qmi.inturb, GFP_KERNEL);
+       if (status != 0)
+               GOBI_ERROR("failed to submit int urb: %d", status);
+       return status;
+}
+
+void qc_stopread(struct qcusbnet *dev)
+{
+       if (dev->qmi.readurb) {
+               GOBI_DEBUG("poisoning read urb");
+               usb_poison_urb(dev->qmi.readurb);
+       }
+
+       if (dev->qmi.inturb) {
+               GOBI_DEBUG("poisoning int urb");
+               usb_poison_urb(dev->qmi.inturb);
+       }
+
+       kfree(dev->qmi.readsetup);
+       dev->qmi.readsetup = NULL;
+       kfree(dev->qmi.readbuf);
+       dev->qmi.readbuf = NULL;
+       kfree(dev->qmi.intbuf);
+       dev->qmi.intbuf = NULL;
+
+       usb_free_urb(dev->qmi.readurb);
+       dev->qmi.readurb = NULL;
+       usb_free_urb(dev->qmi.inturb);
+       dev->qmi.inturb = NULL;
+}
+
+static int read_async(struct qcusbnet *dev, u16 cid, u16 tid,
+                     void (*hook)(struct qcusbnet *, u16, void *),
+                     void *data)
+{
+       struct list_head *node;
+       struct client *client;
+       struct readreq *readreq;
+
+       unsigned long flags;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device (cid=0x%04x, tid=0x%04x)", cid, tid);
+               return -ENXIO;
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("could not find client (cid=0x%04x, tid=0x%04x)",
+                          cid, tid);
+               return -ENXIO;
+       }
+
+       list_for_each(node, &client->reads) {
+               readreq = list_entry(node, struct readreq, node);
+               if (!tid || tid == readreq->tid) {
+                       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                       hook(dev, cid, data);
+                       return 0;
+               }
+       }
+
+       if (!client_addnotify(dev, cid, tid, hook, data)) {
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("failed to add notify (cid=0x%04x, tid=0x%04x)",
+                          cid, tid);
+               /* TODO(ttuttle): return error? */
+               return 0;
+       }
+
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       return 0;
+}
+
+static int down_sync_flags(struct semaphore *sem, int sync_flags)
+{
+       if (sync_flags == SYNC_INTERRUPTIBLE) {
+               return down_interruptible(sem);
+       } else if (sync_flags == SYNC_TIMEOUT) {
+               return down_timeout(sem, QMI_SYNC_TIMEOUT_JIFFIES);
+       } else if (sync_flags == SYNC_UNINTERRUPTIBLE) {
+               down(sem);
+               return 0;
+       } else {
+               BUG_ON(1);
+               return -EINVAL;
+       }
+}
+
+static void upsem(struct qcusbnet *dev, u16 cid, void *data)
+{
+       GOBI_DEBUG("(cid=0x%04x)", cid);
+       up((struct semaphore *)data);
+}
+
+static int read_sync(struct qcusbnet *dev, void **buf, u16 cid, u16 tid,
+                    int sync_flags)
+{
+       struct list_head *node;
+       int result;
+       struct client *client;
+       struct notifyreq *notify;
+       struct semaphore sem;
+       void *data;
+       unsigned long flags;
+       u16 size;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return -ENXIO;
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("could not find client (cid=0x%04x, tid=0x%04x)",
+                          cid, tid);
+               return -ENXIO;
+       }
+
+       while (!client_delread(dev, cid, tid, &data, &size)) {
+               sema_init(&sem, 0);
+               if (!client_addnotify(dev, cid, tid, upsem, &sem)) {
+                       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                       GOBI_WARN("failed to register for notification "
+                                 "(cid=0x%04x, tid=0x%04x)", cid, tid);
+                       return -EFAULT;
+               }
+
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+               result = down_sync_flags(&sem, sync_flags);
+               if (result) {
+                       GOBI_WARN("down failed: %d (cid=0x%04x, tid=0x%04x)",
+                           result, cid, tid);
+
+                       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+                       list_for_each(node, &client->notifies) {
+                               notify = list_entry(node, struct notifyreq, node);
+                               if (notify->data == &sem) {
+                                       list_del(&notify->node);
+                                       kfree(notify);
+                                       break;
+                               }
+                       }
+                       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+                       return -EINTR;
+               }
+
+               if (!device_valid(dev)) {
+                       GOBI_ERROR("invalid device (cid=0x%04x, tid=0x%04x)",
+                                  cid, tid);
+                       return -ENXIO;
+               }
+
+               spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       }
+
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+       *buf = data;
+       return size;
+}
+
+struct writectx {
+       struct semaphore sem;
+       struct kref ref;
+       struct urbsetup setup;
+       struct buffer *data;
+};
+
+static void writectx_release(struct kref *ref)
+{
+       struct writectx *ctx = container_of(ref, struct writectx, ref);
+       buffer_put(ctx->data);
+       kfree(ctx);
+}
+
+static void write_callback(struct urb *urb)
+{
+       struct writectx *ctx = urb->context;
+
+       GOBI_DEBUG("%p %d %d", ctx, urb->status, urb->actual_length);
+       up(&ctx->sem);
+       kref_put(&ctx->ref, writectx_release);
+}
+
+/** @brief Synchronously (probably) sends a data buffer to the card.
+ *
+ *  @param dev
+ *  @param data_buf Borrowed reference to data buffer
+ *  @param cid Client ID
+ */
+static int write_sync(struct qcusbnet *dev, struct buffer *data_buf, u16 cid,
+                     int sync_flags)
+{
+       int result;
+       struct writectx *ctx;
+       struct urb *urb;
+       struct urb *removed_urb;
+       unsigned long flags;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device (cid=0x%04x)", cid);
+               return -ENXIO;
+       }
+
+       ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
+       if (!ctx) {
+               GOBI_ERROR("failed to allocate write context (cid=0x%04x)",
+                          cid);
+               return -ENOMEM;
+       }
+
+       urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!urb) {
+               kfree(ctx);
+               GOBI_ERROR("failed to allocate urb (cid=0x%04x)", cid);
+               return -ENOMEM;
+       }
+
+       result = qmux_fill(cid, data_buf);
+       if (result < 0) {
+               usb_free_urb(urb);
+               kfree(ctx);
+               return result;
+       }
+
+       /* CDC Send Encapsulated Request packet */
+       ctx->setup.type = 0x21;
+       ctx->setup.code = 0;
+       ctx->setup.value = 0;
+       ctx->setup.index = dev->iface_num;
+       ctx->setup.len = buffer_size(data_buf);
+
+       usb_fill_control_urb(urb, dev->usbnet->udev,
+                            usb_sndctrlpipe(dev->usbnet->udev, 0),
+                            (unsigned char *)&ctx->setup,
+                            buffer_data(data_buf), buffer_size(data_buf),
+                            NULL, dev);
+
+       if (gobi_debug >= 2)
+               print_hex_dump(KERN_INFO,  "gobi-write: ", DUMP_PREFIX_OFFSET,
+                              16, 1, buffer_data(data_buf),
+                              buffer_size(data_buf), true);
+
+       sema_init(&ctx->sem, 0);
+       kref_init(&ctx->ref);
+       kref_get(&ctx->ref);    /* get a ref to the context for the urb */
+
+       /* The context now has another ref to the data buffer */
+       buffer_get(data_buf);
+       ctx->data = data_buf;
+
+       urb->complete = write_callback;
+       urb->context = ctx;
+
+       result = usb_autopm_get_interface(dev->iface);
+       if (result < 0) {
+               GOBI_ERROR("unable to resume interface: %d (cid=0x%04x)",
+                          result, cid);
+               if (result == -EPERM) {
+                       qc_suspend(dev->iface, PMSG_SUSPEND);
+               }
+               usb_free_urb(urb);
+               kref_put(&ctx->ref, writectx_release);
+               return result;
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       if (!client_addurb(dev, cid, urb)) {
+               usb_free_urb(urb);
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("failed to add urb (cid=0x%04x)", cid);
+               usb_autopm_put_interface(dev->iface);
+               kref_put(&ctx->ref, writectx_release);
+               return -EINVAL;
+       }
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       result = usb_submit_urb(urb, GFP_KERNEL);
+       if (result < 0) {
+               GOBI_ERROR("failed to submit urb: %d (cid=0x%04x)",
+                          result, cid);
+
+               spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+               removed_urb = client_delurb(dev, cid, urb);
+               if (urb == removed_urb)
+                       usb_free_urb(urb);
+               else
+                       GOBI_ERROR("didn't get write urb back (cid=0x%04x)",
+                                  cid);
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+               usb_autopm_put_interface(dev->iface);
+               kref_put(&ctx->ref, writectx_release);
+               return result;
+       }
+
+       result = down_sync_flags(&ctx->sem, sync_flags);
+       kref_put(&ctx->ref, writectx_release);
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device (cid=0x%04x)", cid);
+               return -ENXIO;
+       }
+
+       usb_autopm_put_interface(dev->iface);
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       if (client_delurb(dev, cid, urb) != urb) {
+               GOBI_ERROR("didn't get write urb back (cid=0x%04x)", cid);
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               return -EINVAL;
+       }
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       if (!result) {
+               if (!urb->status) {
+                       result = buffer_size(data_buf);
+               } else {
+                       GOBI_ERROR("urb status = %d (cid=0x%04x)",
+                                  urb->status, cid);
+                       result = urb->status;
+               }
+       } else {
+               GOBI_ERROR("down failed: %d (cid=0x%04x)", result, cid);
+               GOBI_ERROR("(modem may need to be reset)");
+       }
+
+       usb_free_urb(urb);
+       return result;
+}
+
+static int cid_alloc(struct qcusbnet *dev, u8 type, int sync_flags)
+{
+       struct buffer *wbuf;
+       void *rbuf;
+       u16 cid;
+       u8 tid;
+       u16 size;
+       int result;
+
+       do {
+               tid = atomic_add_return(1, &dev->qmi.qmitid);
+       } while (tid == 0);
+
+       wbuf = qmictl_new_getcid(tid, type);
+       if (!wbuf) {
+               GOBI_ERROR("failed to create getcid request");
+               return -ENOMEM;
+       }
+
+       result = write_sync(dev, wbuf, QMICTL, sync_flags);
+       buffer_put(wbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to write getcid request: %d", result);
+               return result;
+       }
+
+       result = read_sync(dev, &rbuf, QMICTL, tid, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("failed to read alloccid response: %d", result);
+               return result;
+       }
+
+       size = result;
+
+       result = qmictl_alloccid_resp(rbuf, size, &cid);
+       kfree(rbuf);
+       if (result < 0) {
+               GOBI_WARN("failed to parse alloccid response: %d", result);
+               return result;
+       }
+
+       return cid;
+}
+
+static int cid_free(struct qcusbnet *dev, u16 cid, int sync_flags)
+{
+       struct buffer *wbuf;
+       void *rbuf;
+       u8 tid;
+       u16 size;
+       int result;
+
+       do {
+               tid = atomic_add_return(1, &dev->qmi.qmitid);
+       } while (tid == 0);
+
+       wbuf = qmictl_new_releasecid(tid, cid);
+       if (!wbuf) {
+               GOBI_ERROR("failed to create releasecid request");
+               return -ENOMEM;
+       }
+
+       result = write_sync(dev, wbuf, QMICTL, sync_flags);
+       buffer_put(wbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to write releasecid request: %d", result);
+               return result;
+       }
+
+       result = read_sync(dev, &rbuf, QMICTL, tid, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("failed to read freecid response: %d", result);
+               return result;
+       }
+
+       size = result;
+
+       result = qmictl_freecid_resp(rbuf, size);
+       kfree(rbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to parse freecid response: %d", result);
+               return result;
+       }
+
+       return 0;
+}
+
+static int client_alloc(struct qcusbnet *dev, u8 type, int sync_flags)
+{
+       u16 cid;
+       struct client *client;
+       int result;
+       unsigned long flags;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device (type=0x%02x)", type);
+               return -ENXIO;
+       }
+
+       if (type) {
+               result = cid_alloc(dev, type, sync_flags);
+               if (result < 0) {
+                       GOBI_WARN("failed to allocate cid: %d (type=0x%02x)",
+                                 result, type);
+                       return result;
+               }
+               cid = result;
+       } else {
+               cid = 0;
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+
+       if (client_bycid(dev, cid)) {
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("duplicate cid 0x%04x (type=0x%02x)", cid, type);
+               return -ETOOMANYREFS;
+       }
+
+       client = kmalloc(sizeof(*client), GFP_ATOMIC);
+       if (!client) {
+               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+               GOBI_ERROR("failed to allocate client (type=0x%02x)", type);
+               return -ENOMEM;
+       }
+
+       list_add_tail(&client->node, &dev->qmi.clients);
+       client->cid = cid;
+       INIT_LIST_HEAD(&client->reads);
+       INIT_LIST_HEAD(&client->notifies);
+       INIT_LIST_HEAD(&client->urbs);
+       init_waitqueue_head(&client->poll_queue);
+
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       return cid;
+}
+
+static void client_free(struct qcusbnet *dev, u16 cid, int sync_flags)
+{
+       struct list_head *node, *tmp;
+       struct client *client;
+       struct urb *urb;
+       void *data;
+       u16 size;
+       unsigned long flags;
+       int result;
+
+       if (cid != QMICTL) {
+               result = cid_free(dev, cid, sync_flags);
+               if (result)
+                       GOBI_ERROR("failed to free cid: %d (ignoring)", result);
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       list_for_each_safe(node, tmp, &dev->qmi.clients) {
+               struct notifyreq *notify;
+
+               client = list_entry(node, struct client, node);
+               if (client->cid != cid)
+                       continue;
+
+               while ((notify = client_remove_notify(client, 0)) != NULL) {
+                       /* release lock during notification */
+                       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                       client_notify_and_free(dev, notify);
+                       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+               }
+               urb = client_delurb(dev, cid, NULL);
+               while (urb != NULL) {
+                       usb_kill_urb(urb);
+                       usb_free_urb(urb);
+                       urb = client_delurb(dev, cid, NULL);
+               }
+               while (client_delread(dev, cid, 0, &data, &size))
+                       kfree(data);
+
+               wake_up_all(&client->poll_queue);
+
+               list_del(&client->node);
+               kfree(client);
+               break;
+       }
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+}
+
+struct client *client_bycid(struct qcusbnet *dev, u16 cid)
+{
+       struct list_head *node;
+       struct client *client;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return NULL;
+       }
+
+       assert_locked(dev);
+
+       list_for_each(node, &dev->qmi.clients) {
+               client = list_entry(node, struct client, node);
+               if (client->cid == cid)
+                       return client;
+       }
+
+       return NULL;
+}
+
+static bool client_addread(struct qcusbnet *dev, u16 cid, u16 tid, void *data,
+                          u16 size)
+{
+       struct client *client;
+       struct readreq *req;
+
+       assert_locked(dev);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               GOBI_ERROR("failed to find client");
+               return false;
+       }
+
+       req = kmalloc(sizeof(*req), GFP_ATOMIC);
+       if (!req) {
+               GOBI_ERROR("failed to allocate req");
+               return false;
+       }
+
+       req->data = data;
+       req->size = size;
+       req->tid = tid;
+
+       list_add_tail(&req->node, &client->reads);
+
+       return true;
+}
+
+static bool client_delread(struct qcusbnet *dev, u16 cid, u16 tid, void **data,
+                          u16 *size)
+{
+       struct client *client;
+       struct readreq *req;
+       struct list_head *node;
+
+       assert_locked(dev);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               GOBI_WARN("failed to find client (cid=0x%04x, tid=0x%04x)",
+                         cid, tid);
+               return false;
+       }
+
+       list_for_each(node, &client->reads) {
+               req = list_entry(node, struct readreq, node);
+               if (!tid || tid == req->tid) {
+                       *data = req->data;
+                       *size = req->size;
+                       list_del(&req->node);
+                       kfree(req);
+                       return true;
+               }
+
+               GOBI_DEBUG("skipping 0x%04x data TID = %x", cid, req->tid);
+       }
+
+       GOBI_DEBUG("no read to delete (cid=0x%04x, tid=0x%04x)", cid, tid);
+       return false;
+}
+
+static bool client_addnotify(struct qcusbnet *dev, u16 cid, u16 tid,
+                            void (*hook)(struct qcusbnet *, u16, void *),
+                            void *data)
+{
+       struct client *client;
+       struct notifyreq *req;
+
+       assert_locked(dev);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               GOBI_WARN("failed to find client (cid=0x%04x, tid=0x%04x)",
+                         cid, tid);
+               return false;
+       }
+
+       req = kmalloc(sizeof(*req), GFP_ATOMIC);
+       if (!req) {
+               GOBI_ERROR("failed to allocate req (cid=0x%04x, tid=0x%04x)",
+                          cid, tid);
+               return false;
+       }
+
+       list_add_tail(&req->node, &client->notifies);
+       req->func = hook;
+       req->data = data;
+       req->cid = cid;
+       req->tid = tid;
+
+       return true;
+}
+
+static struct notifyreq *client_remove_notify(struct client *client, u16 tid)
+{
+       struct notifyreq *notify;
+       struct list_head *node;
+
+       list_for_each(node, &client->notifies) {
+               notify = list_entry(node, struct notifyreq, node);
+               if (!tid || !notify->tid || tid == notify->tid) {
+                       list_del(&notify->node);
+                       return notify;
+               }
+               GOBI_DEBUG("skipping data TID = %x", notify->tid);
+       }
+       GOBI_WARN("no notify to call (cid=0x%04x, tid=0x%04x)",
+                 client->cid, tid);
+       return NULL;
+}
+
+static void client_notify_and_free(struct qcusbnet *dev,
+                                  struct notifyreq *notify)
+{
+       if (notify->func)
+               notify->func(dev, notify->cid, notify->data);
+       kfree(notify);
+}
+
+static void client_notify_list(struct qcusbnet *dev,
+                              struct list_head *notifies)
+{
+       struct list_head *node, *tmp;
+       struct notifyreq *notify;
+
+       /* The calling thread must not hold any qmidevice spinlocks */
+       list_for_each_safe(node, tmp, notifies) {
+               notify = list_entry(node, struct notifyreq, node);
+               list_del(&notify->node);
+               client_notify_and_free(dev, notify);
+       }
+}
+
+static bool client_addurb(struct qcusbnet *dev, u16 cid, struct urb *urb)
+{
+       struct client *client;
+       struct urbreq *req;
+
+       assert_locked(dev);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               GOBI_ERROR("failed to find client (cid=0x%04x)", cid);
+               return false;
+       }
+
+       req = kmalloc(sizeof(*req), GFP_ATOMIC);
+       if (!req) {
+               GOBI_ERROR("failed to allocate req (cid=0x%04x)", cid);
+               return false;
+       }
+
+       req->urb = urb;
+       list_add(&req->node, &client->urbs);
+
+       return true;
+}
+
+static struct urb *client_delurb(struct qcusbnet *dev, u16 cid, struct urb *urb)
+{
+       struct client *client;
+       struct urbreq *req;
+       struct list_head *node;
+
+       assert_locked(dev);
+
+       client = client_bycid(dev, cid);
+       if (!client) {
+               GOBI_ERROR("failed to find client (cid=0x%04x)", cid);
+               return NULL;
+       }
+
+       list_for_each(node, &client->urbs) {
+               req = list_entry(node, struct urbreq, node);
+               if (urb == NULL || req->urb == urb) {
+                       list_del(&req->node);
+                       urb = req->urb;
+                       kfree(req);
+                       return urb;
+               }
+       }
+       if (urb) {
+               /* Only warn if we didn't find a specific URB we were looking
+                  for. */
+               GOBI_ERROR("no matching urb to delete (cid=0x%04x)", cid);
+       }
+       return NULL;
+}
+
+static int devqmi_open(struct inode *inode, struct file *file)
+{
+       struct qmihandle *handle;
+       struct qmidev *qmidev = container_of(inode->i_cdev, struct qmidev, cdev);
+       struct qcusbnet *dev = container_of(qmidev, struct qcusbnet, qmi);
+
+       /* We need an extra ref on the device per fd, since we stash a ref
+        * inside the handle. If qcusbnet_get() returns NULL, that means the
+        * device has been removed from the list - no new refs for us. */
+       struct qcusbnet *ref = qcusbnet_get(dev);
+
+       if (!ref)
+               return -ENXIO;
+
+       file->private_data = kmalloc(sizeof(struct qmihandle), GFP_KERNEL);
+       if (!file->private_data) {
+               GOBI_ERROR("failed to allocate struct qmihandle");
+               return -ENOMEM;
+       }
+
+       handle = (struct qmihandle *)file->private_data;
+       handle->cid = CID_NONE;
+       handle->dev = ref;
+
+       GOBI_DEBUG("%p %04x", handle, handle->cid);
+
+       return 0;
+}
+
+static long devqmi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       int result;
+       u32 vidpid;
+
+       struct qmihandle *handle = (struct qmihandle *)file->private_data;
+
+       GOBI_DEBUG("%p %04x %08x", handle, handle->cid, cmd);
+
+       if (!device_valid(handle->dev)) {
+               GOBI_WARN("invalid device");
+               return -ENXIO;
+       }
+
+       if (handle->dev->dying) {
+               GOBI_WARN("dying device");
+               return -ENXIO;
+       }
+
+       switch (cmd) {
+
+       case IOCTL_QMI_GET_SERVICE_FILE:
+               GOBI_DEBUG("Setting up QMI for service %lu", arg);
+               if (((u8)arg) == 0) {
+                       GOBI_WARN("cannot use QMICTL from userspace");
+                       return -EINVAL;
+               }
+
+               if (handle->cid != CID_NONE) {
+                       GOBI_WARN("cid already set");
+                       return -EBADR;
+               }
+
+               result = client_alloc(handle->dev, (u8)arg, SYNC_INTERRUPTIBLE);
+               if (result < 0) {
+                       GOBI_WARN("failed to allocate client: %d", result);
+                       return result;
+               }
+
+               handle->cid = result;
+
+               return 0;
+
+       /* Okay, all aboard the nasty hack express. If we don't have this
+        * ioctl() (and we just rely on userspace to close() the file
+        * descriptors), if userspace has any refs left to this fd (like, say, a
+        * pending read()), then the read might hang around forever. Userspace
+        * needs a way to cause us to kick people off those waitqueues before
+        * closing the fd for good.
+        *
+        * If this driver used workqueues, the correct approach here would
+        * instead be to make the file descriptor select()able, and then just
+        * use select() instead of aio in userspace (thus allowing us to get
+        * away with one thread total and avoiding the recounting mess
+        * altogether).
+        */
+       case IOCTL_QMI_CLOSE:
+               if (handle->cid == CID_NONE) {
+                       GOBI_WARN("no cid");
+                       return -EBADR;
+               }
+
+               file->private_data = NULL;
+               client_free(handle->dev, handle->cid, SYNC_TIMEOUT);
+               kfree(handle);
+
+               return 0;
+
+       case IOCTL_QMI_GET_DEVICE_VIDPID:
+               if (!arg) {
+                       GOBI_WARN("GET_DEVICE_VIDPID: bad VIDPID buffer");
+                       return -EINVAL;
+               }
+
+               if (!handle->dev->usbnet) {
+                       GOBI_ERROR("GET_DEVICE_VIDPID: dev->usbnet is NULL");
+                       return -ENOMEM;
+               }
+
+               if (!handle->dev->usbnet->udev) {
+                       GOBI_ERROR("GET_DEVICE_VIDPID: dev->usbnet->udev "
+                                  "is NULL");
+                       return -ENOMEM;
+               }
+
+               vidpid = ((le16_to_cpu(handle->dev->usbnet->udev->descriptor.idVendor) << 16)
+                         + le16_to_cpu(handle->dev->usbnet->udev->descriptor.idProduct));
+
+               result = copy_to_user((unsigned int *)arg, &vidpid, 4);
+               if (result) {
+                       GOBI_WARN("GET_DEVICE_VIDPID: copy_to_user failed: %d",
+                                 result);
+                       return result;
+               }
+
+               return 0;
+
+       case IOCTL_QMI_GET_DEVICE_MEID:
+               if (!arg) {
+                       GOBI_WARN("GET_DEVICE_MEID: bad MEID buffer");
+                       return -EINVAL;
+               }
+
+               result = copy_to_user((unsigned int *)arg, &handle->dev->meid[0], 14);
+               if (result) {
+                       GOBI_WARN("GET_DEVICE_MEID: copy_to_user failed: %d",
+                                 result);
+                       return result;
+               }
+
+               return 0;
+
+       default:
+               GOBI_WARN("I don't even know *how* to %08x!", cmd);
+               return -EBADRQC;
+
+       }
+}
+
+#ifdef CONFIG_COMPAT
+static long devqmi_compat_ioctl(struct file *file, unsigned int cmd,
+                               unsigned long arg)
+{
+       return devqmi_ioctl(file, cmd, arg);
+}
+#endif
+
+static int devqmi_release(struct inode *inode, struct file *file)
+{
+       struct qmihandle *handle = (struct qmihandle *)file->private_data;
+
+       if (handle) {
+               file->private_data = NULL;
+               if (handle->cid != CID_NONE)
+                       client_free(handle->dev, handle->cid,
+                                   SYNC_TIMEOUT);
+               qcusbnet_put(handle->dev);
+               kfree(handle);
+       }
+
+       return 0;
+}
+
+static ssize_t devqmi_read(struct file *file, char __user *buf, size_t size,
+                          loff_t *pos)
+{
+       int result, status;
+       void *data = NULL;
+       void *smalldata;
+       struct qmihandle *handle = (struct qmihandle *)file->private_data;
+
+       if (!handle) {
+               GOBI_WARN("handle is NULL");
+               return -EBADF;
+       }
+
+       if (handle->dev->dying) {
+               GOBI_WARN("dying device");
+               return -ENXIO;
+       }
+
+       if (!device_valid(handle->dev)) {
+               GOBI_WARN("invalid device");
+               return -ENXIO;
+       }
+
+       if (handle->cid == CID_NONE) {
+               GOBI_WARN("cid is not set");
+               return -EBADR;
+       }
+
+       result = read_sync(handle->dev, &data, handle->cid, 0,
+                          SYNC_INTERRUPTIBLE);
+       if (result <= 0) {
+               GOBI_WARN("read_sync failed: %d", result);
+               return result;
+       }
+
+       result -= qmux_size;
+       smalldata = data + qmux_size;
+
+       if (result > size) {
+               GOBI_WARN("read data is too large (%d > %zu)", result, size);
+               kfree(data);
+               return -EOVERFLOW;
+       }
+
+       status = copy_to_user(buf, smalldata, result);
+       if (status) {
+               GOBI_ERROR("copy_to_user failed: %d", status);
+               result = status;
+       }
+
+       kfree(data);
+       return result;
+}
+
+static ssize_t devqmi_write(struct file *file, const char __user * buf,
+                           size_t size, loff_t *pos)
+{
+       int status;
+       struct buffer *wbuf;
+       struct qmihandle *handle = (struct qmihandle *)file->private_data;
+
+       if (!handle) {
+               GOBI_WARN("handle is NULL");
+               return -EBADF;
+       }
+
+       if (!device_valid(handle->dev)) {
+               GOBI_WARN("invalid device");
+               /* TODO(ttuttle): what the heck is this for: */
+               file->f_op = file->f_dentry->d_inode->i_fop;
+               return -ENXIO;
+       }
+
+       if (handle->cid == CID_NONE) {
+               GOBI_WARN("cid is not set");
+               return -EBADR;
+       }
+
+       if (size + qmux_size <= size) {
+               GOBI_WARN("size too big");
+               return -EINVAL;
+       }
+
+       wbuf = buffer_new(size + qmux_size);
+       if (!wbuf) {
+               GOBI_ERROR("failed to allocate buffer");
+               return -ENOMEM;
+       }
+       status = copy_from_user(buffer_data(wbuf) + qmux_size, buf, size);
+       if (status) {
+               GOBI_ERROR("copy_from_user failed: %d", status);
+               buffer_put(wbuf);
+               return status;
+       }
+
+       status = write_sync(handle->dev, wbuf, handle->cid, SYNC_INTERRUPTIBLE);
+       buffer_put(wbuf);
+
+       if (status == size + qmux_size)
+               return size;
+       return status;
+}
+
+static unsigned devqmi_poll(struct file *file,
+                           struct poll_table_struct *poll_table)
+{
+       struct qmihandle *handle = (struct qmihandle *)file->private_data;
+       struct client *client;
+       unsigned long flags;
+       unsigned status;
+
+       /* Always ready to write. */
+       status = POLLOUT | POLLWRNORM;
+
+       if (!handle) {
+               GOBI_WARN("handle is NULL");
+               return POLLERR;
+       }
+
+       if (!device_valid(handle->dev)) {
+               GOBI_WARN("invalid device");
+               return POLLERR;
+       }
+
+       if (handle->cid == CID_NONE) {
+               GOBI_WARN("cid is not set");
+               return POLLERR;
+       }
+
+       spin_lock_irqsave(&handle->dev->qmi.clients_lock, flags);
+
+       client = client_bycid(handle->dev, handle->cid);
+       if (!client) {
+               status = POLLERR;
+               goto out;
+       }
+
+       poll_wait(file, &client->poll_queue, poll_table);
+
+       if (!list_empty(&client->reads))
+               status |= POLLIN | POLLRDNORM;
+
+out:
+       spin_unlock_irqrestore(&handle->dev->qmi.clients_lock, flags);
+
+       return status;
+}
+
+int qc_register(struct qcusbnet *dev)
+{
+       int result;
+       int qmiidx = 0;
+       dev_t devno;
+       char *name;
+       struct device *d;
+       int sync_flags = SYNC_TIMEOUT;
+
+       dev->valid = true;
+       result = client_alloc(dev, QMICTL, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("client_alloc failed: %d", result);
+               goto fail;
+       }
+       if (result > 0) {
+               GOBI_ERROR("client_alloc assigned nonzero cid %d", result);
+               result = -ENXIO;
+               goto fail;
+       }
+       atomic_set(&dev->qmi.qmitid, 1);
+
+       result = qc_startread(dev);
+       if (result) {
+               GOBI_ERROR("qc_startread failed: %d", result);
+               goto fail_client_free;
+       }
+
+       if (!qmi_ready(dev, 30000)) {
+               GOBI_ERROR("device unresponsive to QMI");
+               result = -ETIMEDOUT;
+               goto fail_stopread;
+       }
+
+       result = setup_wds_callback(dev, sync_flags);
+       if (result) {
+               GOBI_ERROR("setup_wds_callback_failed: %d", result);
+               goto fail_stopread;
+       }
+
+       result = qmidms_getmeid(dev, sync_flags);
+       if (result) {
+               GOBI_ERROR("qmidms_getmeid failed: %d", result);
+               goto fail_stopread;
+       }
+
+       result = alloc_chrdev_region(&devno, 0, 1, "qcqmi");
+       if (result < 0) {
+               GOBI_ERROR("alloc_chrdev_region failed: %d", result);
+               goto fail_stopread;
+       }
+
+       cdev_init(&dev->qmi.cdev, &devqmi_fops);
+       dev->qmi.cdev.owner = THIS_MODULE;
+       dev->qmi.cdev.ops = &devqmi_fops;
+
+       result = cdev_add(&dev->qmi.cdev, devno, 1);
+       if (result) {
+               GOBI_ERROR("failed to add cdev: %d", result);
+               goto fail_unregister_chrdev_region;
+       }
+
+       name = strstr(dev->usbnet->net->name, "wwan");
+       if (!name) {
+               GOBI_ERROR("bad net name: %s (expected wwan%%d)",
+                          dev->usbnet->net->name);
+               result = -ENXIO;
+               goto fail_cdev_del;
+       }
+       name += strlen("wwan");
+       qmiidx = simple_strtoul(name, NULL, 10);
+       if (qmiidx < 0) {
+               GOBI_ERROR("bad minor number: %s", name);
+               result = -ENXIO;
+               goto fail_cdev_del;
+       }
+
+       d = device_create(dev->qmi.devclass, &dev->iface->dev, devno, NULL,
+                         "qcqmi%d", qmiidx);
+       if (IS_ERR(d)) {
+               GOBI_ERROR("device_create failed: %ld", PTR_ERR(d));
+               goto fail_cdev_del;
+       }
+
+       printk(KERN_INFO "gobi: registered qcqmi%d", qmiidx);
+
+       dev->qmi.devnum = devno;
+       return 0;
+
+fail_cdev_del:
+       cdev_del(&dev->qmi.cdev);
+fail_unregister_chrdev_region:
+       unregister_chrdev_region(devno, 1);
+fail_stopread:
+       qc_stopread(dev);
+fail_client_free:
+       client_free(dev, 0, sync_flags);
+fail:
+       dev->valid = false;
+       return result;
+}
+
+void qc_deregister(struct qcusbnet *dev)
+{
+       struct list_head *node, *tmp;
+       struct client *client;
+       int sync_flags = SYNC_TIMEOUT;
+
+       list_for_each_safe(node, tmp, &dev->qmi.clients) {
+               client = list_entry(node, struct client, node);
+               client_free(dev, client->cid, sync_flags);
+       }
+
+       device_destroy(dev->qmi.devclass, dev->qmi.devnum);
+       cdev_del(&dev->qmi.cdev);
+       unregister_chrdev_region(dev->qmi.devnum, 1);
+       qc_stopread(dev);
+       dev->valid = false;
+}
+
+static bool qmi_ready(struct qcusbnet *dev, u16 timeout)
+{
+       int result;
+       struct buffer *wbuf;
+       void *rbuf;
+       u16 rbufsize;
+       struct semaphore sem;
+       u16 now;
+       unsigned long flags;
+       u8 tid;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return -EFAULT;
+       }
+
+
+       for (now = 0; now < timeout; now += 100) {
+               sema_init(&sem, 0);
+
+               tid = atomic_add_return(1, &dev->qmi.qmitid);
+               if (!tid)
+                       tid = atomic_add_return(1, &dev->qmi.qmitid);
+               wbuf = qmictl_new_ready(tid);
+               if (!wbuf)
+                       return -ENOMEM;
+
+               result = read_async(dev, QMICTL, tid, upsem, &sem);
+               if (result) {
+                       buffer_put(wbuf);
+                       return false;
+               }
+
+               /* TODO: Convert to use SYNC_TIMEOUT */
+               write_sync(dev, wbuf, QMICTL, SYNC_INTERRUPTIBLE);
+               buffer_put(wbuf);
+
+               msleep(100);
+               if (!down_trylock(&sem)) {
+                       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+                       if (client_delread(dev, QMICTL, tid, &rbuf, &rbufsize)) {
+                               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                               kfree(rbuf);
+                               break;
+                       } else {
+                               spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                       }
+               } else {
+                       struct notifyreq *notify = NULL;
+                       struct client *client;
+
+                       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+                       client = client_bycid(dev, QMICTL);
+                       if (client)
+                               notify = client_remove_notify(client, tid);
+                       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+                       if (notify)
+                               client_notify_and_free(dev, notify);
+               }
+       }
+
+       if (now >= timeout)
+               return false;
+
+       GOBI_DEBUG("ready after %u milliseconds", now);
+
+       /* 3580 and newer doesn't need a delay; older needs 5000ms */
+       if (qcusbnet2k_fwdelay)
+               msleep(qcusbnet2k_fwdelay * 1000);
+
+       return true;
+}
+
+static void wds_callback(struct qcusbnet *dev, u16 cid, void *data)
+{
+       bool ret;
+       int result;
+       void *rbuf;
+       u16 rbufsize;
+
+       struct net_device_stats *stats = &(dev->usbnet->net->stats);
+
+       struct qmiwds_stats dstats = {
+               .txok      = (u32)-1,      .rxok = (u32)-1,
+               .txerr     = (u32)-1,     .rxerr = (u32)-1,
+               .txofl     = (u32)-1,     .rxofl = (u32)-1,
+               .txbytesok = (u64)-1, .rxbytesok = (u64)-1,
+       };
+       unsigned long flags;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return;
+       }
+
+       spin_lock_irqsave(&dev->qmi.clients_lock, flags);
+       ret = client_delread(dev, cid, 0, &rbuf, &rbufsize);
+       spin_unlock_irqrestore(&dev->qmi.clients_lock, flags);
+
+       if (!ret) {
+               GOBI_ERROR("no read found");
+               return;
+       }
+
+       dstats.linkstate = !qc_isdown(dev, DOWN_NO_NDIS_CONNECTION);
+       dstats.reconfigure = false;
+
+       result = qmiwds_event_resp(rbuf, rbufsize, &dstats);
+       if (result < 0) {
+               GOBI_ERROR("failed to parse event response");
+       } else {
+               if (dstats.txofl != (u32)-1)
+                       stats->tx_fifo_errors = dstats.txofl;
+
+               if (dstats.rxofl != (u32)-1)
+                       stats->rx_fifo_errors = dstats.rxofl;
+
+               if (dstats.txerr != (u32)-1)
+                       stats->tx_errors = dstats.txerr;
+
+               if (dstats.rxerr != (u32)-1)
+                       stats->rx_errors = dstats.rxerr;
+
+               if (dstats.txok != (u32)-1)
+                       stats->tx_packets = dstats.txok + stats->tx_errors;
+
+               if (dstats.rxok != (u32)-1)
+                       stats->rx_packets = dstats.rxok + stats->rx_errors;
+
+               if (dstats.txbytesok != (u64)-1)
+                       stats->tx_bytes = dstats.txbytesok;
+
+               if (dstats.rxbytesok != (u64)-1)
+                       stats->rx_bytes = dstats.rxbytesok;
+
+               if (dstats.reconfigure) {
+                       GOBI_DEBUG("Net device link reset");
+                       qc_setdown(dev, DOWN_NO_NDIS_CONNECTION);
+                       qc_cleardown(dev, DOWN_NO_NDIS_CONNECTION);
+               } else {
+                       if (dstats.linkstate) {
+                               GOBI_DEBUG("Net device link is connected");
+                               qc_cleardown(dev, DOWN_NO_NDIS_CONNECTION);
+                       } else {
+                               GOBI_DEBUG("Net device link is disconnected");
+                               qc_setdown(dev, DOWN_NO_NDIS_CONNECTION);
+                       }
+               }
+       }
+
+       kfree(rbuf);
+
+       result = read_async(dev, cid, 0, wds_callback, data);
+       if (result != 0) {
+               GOBI_ERROR("failed to set up async read: %d", result);
+       }
+}
+
+static int setup_wds_callback(struct qcusbnet *dev, int sync_flags)
+{
+       struct buffer *wbuf;
+       u16 cid;
+       int result;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               return -EFAULT;
+       }
+
+       result = client_alloc(dev, QMIWDS, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("failed to allocate client");
+               return result;
+       }
+       cid = result;
+
+       wbuf = qmiwds_new_seteventreport(1);
+       if (!wbuf) {
+               GOBI_ERROR("failed to create seteventreport request");
+               return -ENOMEM;
+       }
+
+       result = write_sync(dev, wbuf, cid, sync_flags);
+       buffer_put(wbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to write seteventreport request: %d",
+                          result);
+               return result;
+       }
+
+       wbuf = qmiwds_new_getpkgsrvcstatus(2);
+       if (!wbuf) {
+               GOBI_ERROR("failed to create getpkgsrvcstatus request");
+               return -ENOMEM;
+       }
+
+       result = write_sync(dev, wbuf, cid, sync_flags);
+       buffer_put(wbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to write getpkgsrvcstatus request: %d",
+                          result);
+               return result;
+       }
+
+       result = read_async(dev, cid, 0, wds_callback, NULL);
+       if (result) {
+               GOBI_ERROR("failed to set up async read: %d", result);
+               return result;
+       }
+
+       /* TODO(ttuttle): magic numbers? */
+       result = usb_control_msg(dev->usbnet->udev,
+                                usb_sndctrlpipe(dev->usbnet->udev, 0),
+                                0x22, 0x21, 1, 0, NULL, 0, 100);
+       if (result < 0) {
+               /* TODO(ttuttle): what does this message mean? */
+               GOBI_ERROR("Bad SetControlLineState status %d", result);
+               return result;
+       }
+
+       return 0;
+}
+
+static int qmidms_getmeid(struct qcusbnet *dev, int sync_flags)
+{
+       u16 cid = CID_NONE;
+       struct buffer *wbuf;
+       void *rbuf = NULL;
+       u16 size;
+       int result;
+
+       if (!device_valid(dev)) {
+               GOBI_ERROR("invalid device");
+               result = -EFAULT;
+               goto out;
+       }
+
+       result = client_alloc(dev, QMIDMS, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("failed to allocate client: %d", result);
+               goto out;
+       }
+       cid = result;
+
+       wbuf = qmidms_new_getmeid(1);
+       if (!wbuf) {
+               GOBI_ERROR("failed to create getmeid request: %d", result);
+               result = -ENOMEM;
+               goto out;
+       }
+
+       result = write_sync(dev, wbuf, cid, sync_flags);
+       buffer_put(wbuf);
+       if (result < 0) {
+               GOBI_ERROR("failed to write getmeid request: %d", result);
+               goto out;
+       }
+
+       result = read_sync(dev, &rbuf, cid, 1, sync_flags);
+       if (result < 0) {
+               GOBI_ERROR("failed to read meid response: %d", result);
+               goto out;
+       }
+       size = result;
+
+       result = qmidms_meid_resp(rbuf, size, &dev->meid[0], 14);
+       if (result < 0) {
+               GOBI_ERROR("failed to parse meid response: %d", result);
+               goto out;
+       }
+
+       result = 0;
+
+out:
+       kfree(rbuf);
+       if (cid != CID_NONE)
+               client_free(dev, cid, sync_flags);
+       return result;
+}
+
+module_param(qcusbnet2k_fwdelay, int, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(qcusbnet2k_fwdelay, "Delay for old firmware");
diff --git a/drivers/net/usb/gobi/qmidevice.h b/drivers/net/usb/gobi/qmidevice.h
new file mode 100644 (file)
index 0000000..5274a0d
--- /dev/null
@@ -0,0 +1,35 @@
+/* qmidevice.h - gobi QMI device header
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef QCUSBNET_QMIDEVICE_H
+#define QCUSBNET_QMIDEVICE_H
+
+#include "structs.h"
+#include "qmi.h"
+
+void qc_setdown(struct qcusbnet *dev, u8 reason);
+void qc_cleardown(struct qcusbnet *dev, u8 reason);
+bool qc_isdown(struct qcusbnet *dev, u8 reason);
+
+int qc_startread(struct qcusbnet *dev);
+void qc_stopread(struct qcusbnet *dev);
+
+int qc_register(struct qcusbnet *dev);
+void qc_deregister(struct qcusbnet *dev);
+
+#endif /* !QCUSBNET_QMIDEVICE_H */
diff --git a/drivers/net/usb/gobi/structs.h b/drivers/net/usb/gobi/structs.h
new file mode 100644 (file)
index 0000000..f05fb48
--- /dev/null
@@ -0,0 +1,106 @@
+/* structs.h - shared structures
+ * Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifndef QCUSBNET_STRUCTS_H
+#define QCUSBNET_STRUCTS_H
+
+#include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/version.h>
+#include <linux/cdev.h>
+#include <linux/kobject.h>
+#include <linux/kthread.h>
+#include <linux/wait.h>
+
+#include <linux/usb/usbnet.h>
+
+#include <linux/fdtable.h>
+
+extern int gobi_debug;
+
+#define GOBI_LOG(lvl, fmt, arg...) \
+do { \
+       if (lvl <= gobi_debug) \
+               printk(KERN_INFO "gobi: %s: " fmt, __func__, ##arg); \
+} while (0)
+
+#define GOBI_ERROR(fmt, arg...) GOBI_LOG(0, fmt, ##arg)
+#define GOBI_WARN(fmt, arg...)  GOBI_LOG(1, fmt, ##arg)
+#define GOBI_DEBUG(fmt, arg...) GOBI_LOG(2, fmt, ##arg)
+
+struct qcusbnet;
+
+struct urbreq {
+       struct list_head node;
+       struct urb *urb;
+};
+
+#define DEFAULT_READ_URB_LENGTH 0x1000
+
+struct qmidev {
+       dev_t devnum;
+       struct class *devclass;
+       struct cdev cdev;
+       struct urb *readurb;
+       struct urbsetup *readsetup;
+       void *readbuf;
+       struct urb *inturb;
+       void *intbuf;
+       struct list_head clients;
+       spinlock_t clients_lock;
+       atomic_t qmitid;
+};
+
+enum {
+       DOWN_NO_NDIS_CONNECTION = 0,
+       DOWN_CDC_CONNECTION_SPEED = 1,
+       DOWN_DRIVER_SUSPENDED = 2,
+       DOWN_NET_IFACE_STOPPED = 3,
+};
+
+struct qcusbnet {
+       struct list_head node;
+       struct kref refcount;
+       struct usbnet *usbnet;
+       struct usb_interface *iface;
+       int (*open)(struct net_device *);
+       int (*stop)(struct net_device *);
+       unsigned long down;
+       bool valid;
+       bool dying;
+       struct qmidev qmi;
+       char meid[14];
+
+       struct workqueue_struct *workqueue;
+       spinlock_t urbs_lock;
+       struct list_head urbs;
+       struct urb *active;
+
+       struct work_struct startxmit;
+       struct work_struct txtimeout;
+       struct work_struct complete;
+
+       unsigned int iface_num;
+       unsigned int int_in_endp;
+       unsigned int bulk_in_endp;
+       unsigned int bulk_out_endp;
+};
+
+#endif /* !QCUSBNET_STRUCTS_H */
index b38db48..853b946 100644 (file)
@@ -1111,6 +1111,17 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
        }
        length = skb->len;
 
+#ifdef CONFIG_ARCH_TEGRA
+       // check and do the proper 32 byte alignment for sk buff
+       if ((int)skb->data & 0x0000001F) {
+               struct sk_buff *new_skb = skb_copy_expand(skb, 32, 0, GFP_ATOMIC);
+               if(unlikely(!(new_skb)))
+                       return -1;
+               kfree_skb(skb);
+               skb = new_skb;
+       }
+#endif
+
        if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) {
                netif_dbg(dev, tx_err, dev->net, "no urb\n");
                goto drop;
index b500840..e78afcf 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/pci.h>
+#include <linux/dmi.h>
 #include <linux/pci_regs.h>
 #include <linux/errno.h>
 #include <linux/pm.h>
@@ -502,11 +503,13 @@ static void free_link_state(struct pcie_link_state *link)
        kfree(link);
 }
 
+
 static int pcie_aspm_sanity_check(struct pci_dev *pdev)
 {
        struct pci_dev *child;
        int pos;
        u32 reg32;
+       extern const struct dmi_system_id acpi_pci_retain_aspm[];
 
        /*
         * Some functions in a slot might not all be PCIe functions,
@@ -531,7 +534,8 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev)
                 * RBER bit to determine if a function is 1.1 version device
                 */
                pci_read_config_dword(child, pos + PCI_EXP_DEVCAP, &reg32);
-               if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force) {
+               if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force
+                               && !dmi_check_system(acpi_pci_retain_aspm)) {
                        dev_printk(KERN_INFO, &child->dev, "disabling ASPM"
                                " on pre-1.1 PCIe device.  You can enable it"
                                " with 'pcie_aspm=force'\n");
index 8390dca..7e4a85d 100644 (file)
@@ -1,3 +1,67 @@
+# drivers/platform/Kconfig
+
 if X86
 source "drivers/platform/x86/Kconfig"
 endif
+
+if ARM
+source "drivers/platform/arm/Kconfig"
+endif
+
+config CHROMEOS
+       bool
+       depends on ARM_CHROMEOS_FIRMWARE || (NVRAM && ACPI_CHROMEOS)
+
+       ---help---
+         Provides abstracted interfaces to the firmware features provided on
+         ChromeOS devices. It depends on a lowlevel driver to implement the
+         firmware interface on the platform.
+
+config CHROMEOS_RAMOOPS_RAM_START
+        hex "Physical address of preserved RAM"
+       depends on RAMOOPS && CHROMEOS
+        default "0"
+
+        ---help---
+          Address of the memory area that is used for logging using ramoops.
+         This value can also be set through platform data.
+
+          For this feature to be useful, the selected memory area must be
+          preserved across reboot, so not used by the boot loader, for example.
+
+config CHROMEOS_RAMOOPS_RAM_SIZE
+        hex "Size of preserved RAM"
+       depends on RAMOOPS && CHROMEOS
+        default "0"
+
+        ---help---
+          Size of the memory area that is used for logging using ramoops.
+         This value can also be set through platform data.
+
+          For this feature to be useful, the selected memory area must be
+          preserved across reboot, so not used by the boot loader, for example.
+
+config CHROMEOS_RAMOOPS_RECORD_SIZE
+        hex "Size of a single dump logged in RAM"
+       depends on RAMOOPS && CHROMEOS
+        default "0x00001000"
+
+        ---help---
+          This is the size of a single dump which is logged in RAM. Should be
+         set according to the level of detail needed in the dump.
+         This value can also be set through platform data.
+
+         Must be divisible by CHROMEOS_RAMOOPS_RAM_SIZE.
+
+config CHROMEOS_RAMOOPS_DUMP_OOPS
+        hex "Flag to dump oopses and panics or only panics"
+       depends on RAMOOPS && CHROMEOS
+        default "1"
+
+        ---help---
+         If flag is set to 0 dump oopses and panics.
+         If flag is set to 1 dump only panics.
+
+         This value can also be set through platform data.
+          For this feature to be useful, the selected memory area must be
+          preserved across reboot, so not used by the boot loader, for example.
index 782953a..189556a 100644 (file)
@@ -1,5 +1,6 @@
 #
 # Makefile for linux/drivers/platform
 #
-
+obj-$(CONFIG_ARM)              += arm/
 obj-$(CONFIG_X86)              += x86/
+obj-$(CONFIG_CHROMEOS)         += chromeos.o
diff --git a/drivers/platform/arm/Kconfig b/drivers/platform/arm/Kconfig
new file mode 100644 (file)
index 0000000..816b682
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# ARM Platform Specific Drivers
+#
+
+menuconfig ARM_PLATFORM_DEVICES
+       bool "ARM Specific Device Drivers"
+       default n
+       ---help---
+         Say Y here to get to see options for device drivers for various
+         ARM platforms. This option alone does not add any kernel code.
+
+         If you say N, all options in this submenu will be skipped and disabled.
+
+if ARM_PLATFORM_DEVICES
+
+config ARM_CHROMEOS_FIRMWARE
+       bool "ChromeOS firmware interface driver"
+       select CHROMEOS
+       ---help---
+         This driver provides an interface to ChromeOS firmware.
+
+         Say Y here if you are building for a ChromeOS device.
+
+endif # CROS_PLATFORM_DEVICES
diff --git a/drivers/platform/arm/Makefile b/drivers/platform/arm/Makefile
new file mode 100644 (file)
index 0000000..67814b4
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for linux/drivers/platform/arm
+# arm Platform-Specific Drivers
+#
+obj-$(CONFIG_ARM_CHROMEOS_FIRMWARE) += chromeos_arm.o
diff --git a/drivers/platform/arm/chromeos_arm.c b/drivers/platform/arm/chromeos_arm.c
new file mode 100644 (file)
index 0000000..e7e9c3e
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ *  ChromeOS platform support code. Glue layer between higher level functions
+ *  and per-platform firmware interfaces.
+ *
+ *  Copyright (C) 2011 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#define pr_fmt(fmt) "chromeos_arm: " fmt
+
+#include <linux/chromeos_platform.h>
+#include <linux/ide.h>
+#include <linux/of.h>
+
+
+#include "../chromeos.h"
+
+/* TODO:
+ * Do a proper search for the right mmc device to use
+ */
+
+#define BLKNV_MAJOR MMC_BLOCK_MAJOR
+#define BLKNV_MINOR 0
+
+/* location where the nvram data blends into the sector on the MMC device */
+static u16 nv_offset, nv_size;
+static u64 nv_lba;
+
+/*
+ * Functions to support nvram on block device. The actual device used is minor
+ * 0 of MMC device class, the sector to use is as encoded in
+ * firmware_shared_data->nvcxt_lba, the nvram buffer in the sector starts at
+ * offset nv_offset and takes nv_size bytes.
+ */
+static void blknv_endio(struct bio *bio, int err)
+{
+       struct completion *c = bio->bi_private;
+       bio->bi_private = (void *)err;
+       complete(c);
+}
+
+static void blknv_submit_bio(struct bio *bio, int rq)
+{
+       DECLARE_COMPLETION_ONSTACK(wait);
+
+       bio->bi_end_io  = blknv_endio;
+       bio->bi_private = &wait;
+       submit_bio(rq, bio);
+       wait_for_completion(&wait);
+}
+
+static int chromeos_access_nvram_block(struct page *page,
+                                      sector_t sector,
+                                      bool is_read)
+{
+       struct block_device *bdev;
+       struct bio *bio = NULL;
+       dev_t mdev;
+       fmode_t devmode = is_read ? FMODE_READ : FMODE_WRITE;
+       int rq, ret;
+
+       mdev = MKDEV(BLKNV_MAJOR, BLKNV_MINOR);
+       bdev = blkdev_get_by_dev(mdev, devmode, NULL);
+       if (IS_ERR(bdev)) {
+               pr_err("could not open dev=[%d:%d]\n",
+                      BLKNV_MAJOR, BLKNV_MINOR);
+               ret = -EFAULT;
+               goto out;
+       }
+
+       /* map the sector to page */
+       bio = bio_alloc(GFP_NOIO, 1);
+       if (!bio) {
+               ret = -ENOMEM;
+               goto out;
+       }
+       bio->bi_bdev    = bdev;
+       bio->bi_sector  = sector;
+       bio->bi_vcnt    = 1;
+       bio->bi_idx     = 0;
+       bio->bi_size    = SECTOR_SIZE;
+       bio->bi_io_vec[0].bv_page       = page;
+       bio->bi_io_vec[0].bv_len        = SECTOR_SIZE;
+       bio->bi_io_vec[0].bv_offset     = 0;
+
+       /* submit bio */
+       rq = REQ_SYNC | REQ_SOFTBARRIER | REQ_NOIDLE;
+       if (!is_read)
+               rq |= REQ_WRITE;
+
+       blknv_submit_bio(bio, rq);
+
+       /* nvblk_endio passes up any error in bi_private */
+       ret = (int)bio->bi_private;
+out:
+       if (bio)
+               bio_put(bio);
+       if (!is_read) {
+               fsync_bdev(bdev);
+               invalidate_bdev(bdev);
+       }
+       if (bdev)
+               blkdev_put(bdev, devmode);
+       return ret;
+}
+
+static int chromeos_read_nvram_block(struct page *page, sector_t sector)
+{
+       return chromeos_access_nvram_block(page, sector, 1);
+}
+
+static int chromeos_write_nvram_block(struct page *page, sector_t sector)
+{
+       return chromeos_access_nvram_block(page, sector, 0);
+}
+
+/*
+ * This function accepts a buffer with exactly nv_size bytes. It reads the
+ * appropriate mmc one sector block, extacts the nonvolatile data from there
+ * and copies it to the provided buffer.
+ */
+static int _chromeos_read(u8 *data)
+{
+       struct page *page;
+       char *virtual_addr;
+       int ret;
+
+       page = alloc_page(GFP_NOIO);
+       if (!page) {
+               pr_err("page allocation failed\n");
+               return -ENOMEM;
+       }
+
+       virtual_addr = page_address(page);
+       if (!virtual_addr) {
+               pr_err("page not mapped!\n");
+               __free_page(page);
+               return -EFAULT;
+       }
+
+       ret = chromeos_read_nvram_block(page, nv_lba);
+       if (ret)
+               goto out;
+
+       memcpy(data, virtual_addr + nv_offset, nv_size);
+       ret = nv_size;
+
+out:
+       __free_page(page);
+       return ret;
+}
+
+/*
+ * This function accepts a buffer with exactly nv_size bytes. It reads the
+ * appropriate mmc one sector block, blends in the new nvram contents and then
+ * writes the sector back.
+ */
+static int _chromeos_write(const u8 *data)
+{
+       struct page *page;
+       char *virtual_addr;
+       int ret;
+
+       page = alloc_page(GFP_NOIO);
+       if (!page) {
+               pr_err("page allocation failed\n");
+               return -ENOMEM;
+       }
+
+       virtual_addr = page_address(page);
+       if (!virtual_addr) {
+               pr_err("page not mapped!\n");
+               __free_page(page);
+               return -EFAULT;
+       }
+
+       ret = chromeos_read_nvram_block(page, nv_lba);
+       if (ret)
+               goto out;
+
+       /*
+        * Sector has been read, lets blend in nvram data and write the sector
+        * back.
+        */
+       memcpy(virtual_addr + nv_offset, data, nv_size);
+
+       ret = chromeos_write_nvram_block(page, nv_lba);
+       if (!ret)
+               ret = nv_size;
+
+out:
+       __free_page(page);
+       return ret;
+}
+
+/*
+ * Read the nvram buffer contents into the user provided space.
+ *
+ * returns number of bytes copied, or negative error.
+ */
+int chromeos_platform_read_nvram(u8 *nvram_buffer, int buf_size)
+{
+       if (!nv_size) {
+               pr_err("%s nonvolatile context not configured!\n", __func__);
+               return -ENODEV;
+       }
+
+       if (buf_size < nv_size) {
+               pr_err("not enough room to read nvram (%d < %d)\n",
+                      buf_size, nv_size);
+               return -ENOSPC;
+       }
+
+       return _chromeos_read(nvram_buffer);
+}
+
+int chromeos_platform_write_nvram(u8 *nvram_buffer, int buf_size)
+{
+       if (!nv_size) {
+               pr_err("%s nonvolatile context not configured!\n", __func__);
+               return -ENODEV;
+       }
+
+       if (buf_size != nv_size) {
+               pr_err("wrong write buffer size (%d != %d)\n",
+                      buf_size, nv_size);
+               return -ENOSPC;
+       }
+
+       return _chromeos_write(nvram_buffer);
+}
+
+static int __init chromeos_arm_init(void)
+{
+       int proplen, err, size;
+       const int *prop;
+       struct device_node *fw_dn;
+
+       fw_dn = of_find_compatible_node(NULL, NULL, "chromeos-firmware");
+       if (!fw_dn)
+               return -ENODEV;
+
+       prop = of_get_property(fw_dn, "nonvolatile-context-offset", &proplen);
+       if (!prop || proplen != 4) {
+               pr_err("can't find nonvolatile memory offset\n");
+               err = -ENODEV;
+               goto err;
+       }
+       nv_offset = be32_to_cpup(prop);
+
+       prop = of_get_property(fw_dn, "boot-nonvolatile-cache", &proplen);
+       if (!prop) {
+               pr_err("can't find boot copy of nonvolatile cache\n");
+               err = -ENODEV;
+               goto err;
+       }
+       nv_size = proplen;
+
+       prop = of_get_property(fw_dn, "nonvolatile-context-size", &proplen);
+       if (!prop || proplen != 4) {
+               pr_err("can't find size of nonvolatile memory\n");
+               err = -ENODEV;
+               goto err;
+       }
+       size = be32_to_cpup(prop);
+
+       if (size != nv_size) {
+               pr_err("nvram size and cache mismatch\n");
+               err = -EINVAL;
+               goto err;
+       }
+
+       if ((nv_offset + nv_size > SECTOR_SIZE) ||
+           (nv_size > MAX_NVRAM_BUFFER_SIZE)) {
+               /* nvram block won't fit into a sector */
+               pr_err("bad nvram location: %d:%d!\n", nv_offset, nv_size);
+               err = -EINVAL;
+               goto err;
+       }
+
+       prop = of_get_property(fw_dn, "nonvolatile-context-lba", &proplen);
+       if (!prop) {
+               pr_err("can't find nvcontext lba\n");
+               err = -ENODEV;
+               goto err;
+       }
+       switch (proplen) {
+       case 4:
+               nv_lba = be32_to_cpup(prop);
+               break;
+       case 8:
+               nv_lba = be64_to_cpup((const __be64 *)prop);
+               break;
+       default:
+               pr_err("invalid nvcontext lba\n");
+               err = -EINVAL;
+               goto err;
+       }
+
+       /* XXXOJN FIXME: There should be a search for the right block device to
+        * use for volatile storage here, not just assume mmcblk0. This should
+        * include comparing the cached context passed in through the property.
+        */
+
+       pr_info("chromeos system detected\n");
+
+       err = 0;
+err:
+       of_node_put(fw_dn);
+
+       return err;
+}
+subsys_initcall(chromeos_arm_init);
diff --git a/drivers/platform/chromeos.c b/drivers/platform/chromeos.c
new file mode 100644 (file)
index 0000000..7198e05
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ *  ChromeOS platform support code. Glue layer between higher level functions
+ *  and per-platform firmware interfaces.
+ *
+ *  Copyright (C) 2010 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * This module isolates ChromeOS platform specific behavior.  In particular,
+ * it uses calls from chromeos_acpi.c to control the boot flow, and exports some
+ * helper functions for kernel-side consumers of platform configuration, such
+ * as nvram flags.
+ */
+
+#include <linux/types.h>
+#include <linux/chromeos_platform.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/ramoops.h>
+#include "chromeos.h"
+
+static int chromeos_read_nvram(u8 *nvram_buffer, int buf_size);
+static int chromeos_write_nvram_byte(unsigned offset, u8 value);
+
+/* the following defines are copied from
+ * vboot_reference:firmware/lib/vboot_nvstorage.c.
+ */
+#define RECOVERY_OFFSET              2
+#define VBNV_RECOVERY_RW_INVALID_OS  0x43
+
+int chromeos_set_need_recovery(void)
+{
+       if (!chromeos_legacy_set_need_recovery())
+               return 0;
+
+       return chromeos_write_nvram_byte(RECOVERY_OFFSET,
+                                        VBNV_RECOVERY_RW_INVALID_OS);
+}
+
+/*
+ * Lifted from vboot_reference:firmware/lib/vboot_nvstorage.c and formatted.
+ *
+ * Return CRC-8 of the data, using x^8 + x^2 + x + 1 polynomial. A table-based
+ * algorithm would be faster, but for only 15 bytes isn't worth the code size.
+ */
+static u8 crc8(const u8 *data, int len)
+{
+       unsigned crc = 0;
+       int i, j;
+
+       for (j = len; j; j--, data++) {
+               crc ^= (*data << 8);
+               for (i = 8; i; i--) {
+                       if (crc & 0x8000)
+                               crc ^= (0x1070 << 3);
+                       crc <<= 1;
+               }
+       }
+       return (u8)(crc >> 8);
+}
+
+static int chromeos_write_nvram_byte(unsigned offset, u8 value)
+{
+       u8 nvram_buffer[MAX_NVRAM_BUFFER_SIZE];
+
+       int size = chromeos_read_nvram(nvram_buffer, sizeof(nvram_buffer));
+
+       if (size <= 0)
+               return -EINVAL;
+
+       if (offset >= (size - 1))
+               return -EINVAL;
+
+       if (nvram_buffer[offset] == value)
+               return 0;
+
+       nvram_buffer[offset] = value;
+       nvram_buffer[size - 1] = crc8(nvram_buffer, size - 1);
+
+       return chromeos_platform_write_nvram(nvram_buffer, size);
+}
+
+/*
+ * Read nvram buffer contents and verify it. Return 0 on success and -1 on
+ * failure (uninitialized subsystem, corrupted crc8 value, not enough room in
+ * the buffer, etc.).
+ *
+ * If everything checks out - return number of bytes in the NVRAM buffer, -1
+ * on any error.
+ */
+static int chromeos_read_nvram(u8 *nvram_buffer, int buf_size)
+{
+       int size = chromeos_platform_read_nvram(nvram_buffer, buf_size);
+
+       if (size <= 0)
+               return -1;
+
+       if (nvram_buffer[size - 1] != crc8(nvram_buffer, size - 1)) {
+               pr_err("%s: NVRAM contents corrupted\n", __func__);
+               return -1;
+       }
+       return size;
+}
+
+/* Set the platform dependent parameters using kernel config parameters */
+static struct ramoops_platform_data chromeos_ramoops_data = {
+       .mem_size               = CONFIG_CHROMEOS_RAMOOPS_RAM_SIZE,
+       .mem_address            = CONFIG_CHROMEOS_RAMOOPS_RAM_START,
+       .record_size            = CONFIG_CHROMEOS_RAMOOPS_RECORD_SIZE,
+       .dump_oops              = CONFIG_CHROMEOS_RAMOOPS_DUMP_OOPS,
+};
+
+static struct platform_device chromeos_ramoops = {
+       .name = "ramoops",
+       .dev = {
+               .platform_data = &chromeos_ramoops_data,
+       },
+};
+
+/*
+ * If you don't set the ramoops module parameters then ramoops needs a
+ * platform device in order to run. So a platform device is registered
+ * which sets the needed parameters.
+ */
+static int __init chromeos_ramoops_init(void)
+{
+       int ret;
+
+       ret = platform_device_register(&chromeos_ramoops);
+       if (ret) {
+               printk(KERN_ERR "unable to register platform device\n");
+               return ret;
+       }
+
+       return 0;
+}
+
+subsys_initcall(chromeos_ramoops_init);
diff --git a/drivers/platform/chromeos.h b/drivers/platform/chromeos.h
new file mode 100644 (file)
index 0000000..7c2d8fa
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  Copyright (C) 2011 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * This module isolates ChromeOS platform specific behavior.  In particular,
+ * it uses calls from chromeos_acpi.c to control the boot flow, and exports some
+ * helper functions for kernel-side consumers of platform configuration, such
+ * as nvram flags.
+ */
+#ifndef _DRIVERS_PLATFORM_CHROMEOS_H
+#define _DRIVERS_PLATFORM_CHROMEOS_H
+
+#define MAX_NVRAM_BUFFER_SIZE 64  /* Should be enough for anything. */
+
+#ifdef CONFIG_ACPI_CHROMEOS
+extern int chromeos_legacy_set_need_recovery(void);
+#else
+static inline int chromeos_legacy_set_need_recovery(void) { return -ENODEV; }
+#endif
+
+extern int chromeos_platform_read_nvram(u8 *nvram_buffer, int buf_size);
+extern int chromeos_platform_write_nvram(u8 *nvram_buffer, int buf_size);
+
+#endif /* _DRIVERS_PLATFORM_CHROMEOS_H */
index 2a262f5..288c157 100644 (file)
@@ -680,6 +680,24 @@ config INTEL_IPS
          along with the CPU frequency and i915 drivers, provides that
          functionality.  If in doubt, say Y here; it will only load on
          supported platforms.
+config ACPI_CHROMEOS
+       bool "ChromeOS specific ACPI extensions"
+       depends on ACPI
+       select CHROMEOS
+       ---help---
+         This driver provides the firmware interface for the services exported
+         through the CHROMEOS interfaces when using ChromeOS ACPI firmware.
+
+config CHROMEOS_LAPTOP
+       tristate "ChromeOS Laptop"
+       depends on DMI
+       ---help---
+         This driver configures interrupts and instantiates i2c and smbus
+         devices on Chrome OS laptops. Should be used only with supported
+         Chrome OS laptops.
+
+         To compile this driver as a module, choose M here: the module will be
+         called chromeos_laptop.
 
 config IBM_RTL
        tristate "Device driver to enable PRTL support"
index bf7e4f9..17d38cb 100644 (file)
@@ -50,3 +50,5 @@ obj-$(CONFIG_INTEL_MID_POWER_BUTTON)  += intel_mid_powerbtn.o
 obj-$(CONFIG_INTEL_OAKTRAIL)   += intel_oaktrail.o
 obj-$(CONFIG_SAMSUNG_Q10)      += samsung-q10.o
 obj-$(CONFIG_APPLE_GMUX)       += apple-gmux.o
+obj-$(CONFIG_ACPI_CHROMEOS)    += chromeos_acpi.o
+obj-$(CONFIG_CHROMEOS_LAPTOP)  += chromeos_laptop.o
diff --git a/drivers/platform/x86/chromeos_acpi.c b/drivers/platform/x86/chromeos_acpi.c
new file mode 100644 (file)
index 0000000..aa4b9ca
--- /dev/null
@@ -0,0 +1,781 @@
+ /*
+ *  chromeos_acpi.c - ChromeOS specific ACPI support
+ *
+ *
+ * Copyright (C) 2011 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * This driver attaches to the ChromeOS ACPI device and the exports the values
+ * reported by the ACPI in a sysfs directory
+ * (/sys/devices/platform/chromeos_acpi).
+ *
+ * The first version of the driver provides only static information; the
+ * values reported by the driver are the snapshot reported by the ACPI at
+ * driver installation time.
+ *
+ * All values are presented in the string form (numbers as decimal values) and
+ * can be accessed as the contents of the appropriate read only files in the
+ * sysfs directory tree originating in /sys/devices/platform/chromeos_acpi.
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/nvram.h>
+#include <linux/platform_device.h>
+#include <linux/acpi.h>
+
+#define CHNV_DEBUG_RESET_FLAG  0x40         /* flag for S3 reboot */
+#define CHNV_RECOVERY_FLAG     0x80         /* flag for recovery reboot */
+
+#define CHSW_RECOVERY_FW       0x00000002   /* recovery button depressed */
+#define CHSW_RECOVERY_EC       0x00000004   /* recovery button depressed */
+#define CHSW_DEVELOPER_MODE    0x00000020   /* developer switch set */
+#define CHSW_WP                        0x00000200   /* write-protect (optional) */
+
+/*
+ * Structure containing one ACPI exported integer along with the validity
+ * flag.
+ */
+struct chromeos_acpi_datum {
+       unsigned cad_value;
+       bool     cad_is_set;
+};
+
+/*
+ * Structure containing the set of ACPI exported integers required by chromeos
+ * wrapper.
+ */
+struct chromeos_acpi_if {
+       struct chromeos_acpi_datum      switch_state;
+
+       /* chnv is a single byte offset in nvram. exported by older firmware */
+       struct chromeos_acpi_datum      chnv;
+
+       /* vbnv is an address range in nvram, exported by newer firmware */
+       struct chromeos_acpi_datum      nv_base;
+       struct chromeos_acpi_datum      nv_size;
+};
+
+#define MY_LOGPREFIX "chromeos_acpi: "
+#define MY_ERR KERN_ERR MY_LOGPREFIX
+#define MY_NOTICE KERN_NOTICE MY_LOGPREFIX
+#define MY_INFO KERN_INFO MY_LOGPREFIX
+
+/* ACPI method name for MLST; the response for this method is a
+ * package of strings listing the methods which should be reflected in
+ * sysfs. */
+#define MLST_METHOD "MLST"
+
+static const struct acpi_device_id chromeos_device_ids[] = {
+       {"GGL0001", 0}, /* Google's own */
+       {"", 0},
+};
+
+MODULE_DEVICE_TABLE(acpi, chromeos_device_ids);
+
+static int chromeos_device_add(struct acpi_device *device);
+static int chromeos_device_remove(struct acpi_device *device, int type);
+
+static struct chromeos_acpi_if chromeos_acpi_if_data;
+static struct acpi_driver chromeos_acpi_driver = {
+       .name = "ChromeOS Device",
+       .class = "ChromeOS",
+       .ids = chromeos_device_ids,
+       .ops = {
+               .add = chromeos_device_add,
+               .remove = chromeos_device_remove,
+               },
+       .owner = THIS_MODULE,
+};
+
+/* The default list of methods the chromeos ACPI device is supposed to export,
+ * if the MLST method is not present or is poorly formed.  The MLST method
+ * itself is included, to aid in debugging. */
+static char *default_methods[] = {
+       "CHSW", "HWID", "BINF", "GPIO", "CHNV", "FWID", "FRID", MLST_METHOD
+};
+
+/*
+ * Representation of a single sys fs attribute. In addition to the standard
+ * device_attribute structure has a link field, allowing to create a list of
+ * these structures (to keep track for de-allocation when removing the driver)
+ * and a pointer to the actual attribute value, reported when accessing the
+ * appropriate sys fs file
+ */
+struct acpi_attribute {
+       struct device_attribute dev_attr;
+       struct acpi_attribute *next_acpi_attr;
+       char *value;
+};
+
+/*
+ * Representation of a sys fs attribute group (a sub directory in the device's
+ * sys fs directory). In addition to the standard structure has a link to
+ * allow to keep track of the allocated structures.
+ */
+struct acpi_attribute_group {
+       struct attribute_group ag;
+       struct acpi_attribute_group *next_acpi_attr_group;
+};
+
+/*
+ * ChromeOS ACPI device wrapper adds links pointing at lists of allocated
+ * attributes and attribute groups.
+ */
+struct chromeos_acpi_dev {
+       struct platform_device *p_dev;
+       struct acpi_attribute *attributes;
+       struct acpi_attribute_group *groups;
+};
+
+static struct chromeos_acpi_dev chromeos_acpi = { };
+
+static bool chromeos_on_legacy_firmware(void)
+{
+       /*
+        * Presense of the CHNV ACPI element implies running on a legacy
+        * firmware
+        */
+       return chromeos_acpi_if_data.chnv.cad_is_set;
+}
+
+/*
+ * This function operates on legacy BIOSes which do not export VBNV element
+ * through ACPI. These BIOSes use a fixed location in NVRAM to contain a
+ * bitmask of known flags.
+ *
+ * @flag - the bitmask to set, it is the responsibility of the caller to set
+ *         the proper bits.
+ *
+ * returns 0 on success (is running in legacy mode and chnv is initialized) or
+ *         -1 otherwise.
+ */
+static int chromeos_set_nvram_flag(u8 flag)
+{
+       u8 cur;
+       unsigned index = chromeos_acpi_if_data.chnv.cad_value;
+
+       if (!chromeos_on_legacy_firmware())
+               return -ENODEV;
+
+       cur = nvram_read_byte(index);
+
+       if ((cur & flag) != flag)
+               nvram_write_byte(cur | flag, index);
+       return 0;
+}
+
+int chromeos_legacy_set_need_recovery(void)
+{
+       return chromeos_set_nvram_flag(CHNV_RECOVERY_FLAG);
+}
+
+/*
+ * Read the nvram buffer contents into the user provided space.
+ *
+ * retrun number of bytes copied, or -1 on any error.
+ */
+int chromeos_platform_read_nvram(u8 *nvram_buffer, int buf_size)
+{
+
+       int base, size, i;
+
+       if (!chromeos_acpi_if_data.nv_base.cad_is_set ||
+           !chromeos_acpi_if_data.nv_size.cad_is_set) {
+               printk(MY_ERR "%s: NVRAM not configured!\n", __func__);
+               return -ENODEV;
+       }
+
+       base = chromeos_acpi_if_data.nv_base.cad_value;
+       size = chromeos_acpi_if_data.nv_size.cad_value;
+
+       if (buf_size < size) {
+               pr_err("%s: not enough room to read nvram (%d < %d)\n",
+                      __func__, buf_size, size);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < size; i++)
+               nvram_buffer[i] = nvram_read_byte(base++);
+
+       return size;
+}
+
+int chromeos_platform_write_nvram(u8 *nvram_buffer, int buf_size)
+{
+       unsigned base, size, i;
+
+       if (!chromeos_acpi_if_data.nv_base.cad_is_set ||
+           !chromeos_acpi_if_data.nv_size.cad_is_set) {
+               printk(MY_ERR "%s: NVRAM not configured!\n", __func__);
+               return -ENODEV;
+       }
+
+       size = chromeos_acpi_if_data.nv_size.cad_value;
+       base = chromeos_acpi_if_data.nv_base.cad_value;
+
+       if (buf_size != size) {
+               printk(MY_ERR "%s: wrong buffer size (%d != %d)!\n", __func__,
+                      buf_size, size);
+               return -EINVAL;
+       }
+
+       for (i = 0; i < size; i++) {
+               u8 c;
+
+               c = nvram_read_byte(base + i);
+               if (c == nvram_buffer[i])
+                       continue;
+               nvram_write_byte(nvram_buffer[i], base + i);
+       }
+       return 0;
+}
+
+/*
+ * To show attribute value just access the container structure's `value'
+ * field.
+ */
+static ssize_t show_acpi_attribute(struct device *dev,
+                                  struct device_attribute *attr, char *buf)
+{
+       struct acpi_attribute *paa;
+
+       paa = container_of(attr, struct acpi_attribute, dev_attr);
+       return snprintf(buf, PAGE_SIZE, paa->value);
+}
+
+/*
+ * create_sysfs_attribute() create and initialize an ACPI sys fs attribute
+ *                         structure.
+ * @value: attribute value
+ * @name: base attribute name
+ * @count: total number of instances of this attribute
+ * @instance: instance number of this particular attribute
+ *
+ * This function allocates and initializes the structure containing all
+ * information necessary to add a sys fs attribute. In case the attribute has
+ * just a single instance, the attribute file name is equal to the @name
+ * parameter . In case the attribute has several instances, the attribute
+ * file name is @name.@instance.
+ *
+ * Returns: a pointer to the allocated and initialized structure, or null if
+ * allocation failed.
+ *
+ * As a side effect, the allocated structure is added to the list in the
+ * chromeos_acpi structure. Note that the actual attribute creation is not
+ * attempted yet, in case of creation error the structure would not have an
+ * actual attribute associated with it, so when de-installing the driver this
+ * structure would be used to try to remove an attribute which does not exist.
+ * This is considered acceptable, as there is no reason for sys fs attribute
+ * creation failure.
+ */
+static struct acpi_attribute *create_sysfs_attribute(char *value, char *name,
+                                                    int count, int instance)
+{
+       struct acpi_attribute *paa;
+       int total_size, room_left;
+       int value_len = strlen(value);
+
+       if (!value_len)
+               return NULL;
+
+       value_len++; /* include the terminating zero */
+
+       /*
+        * total allocation size includes (all strings with including
+        * terminating zeros):
+        *
+        * - value string
+        * - attribute structure size
+        * - name string
+        * - suffix string (in case there are multiple instances)
+        * - dot separating the instance suffix
+        */
+
+       total_size = value_len + sizeof(struct acpi_attribute) +
+                       strlen(name) + 1;
+
+       if (count != 1) {
+               if (count >= 1000) {
+                       printk(MY_ERR "%s: too many (%d) instances of %s\n",
+                              __func__, count, name);
+                       return NULL;
+               }
+               /* allow up to three digits and the dot */
+               total_size += 4;
+       }
+
+       paa = kzalloc(total_size, GFP_KERNEL);
+       if (!paa) {
+               printk(MY_ERR "out of memory in %s!\n", __func__);
+               return NULL;
+       }
+
+       sysfs_attr_init(&paa->dev_attr.attr);
+       paa->dev_attr.attr.mode = 0444;  /* read only */
+       paa->dev_attr.show = show_acpi_attribute;
+       paa->value = (char *)(paa + 1);
+       strcpy(paa->value, value);
+       paa->dev_attr.attr.name = paa->value + value_len;
+
+       room_left = total_size - value_len -
+                       offsetof(struct acpi_attribute, value);
+
+       if (count == 1) {
+               snprintf((char *)paa->dev_attr.attr.name, room_left, name);
+       } else {
+               snprintf((char *)paa->dev_attr.attr.name, room_left,
+                        "%s.%d", name, instance);
+       }
+
+       paa->next_acpi_attr = chromeos_acpi.attributes;
+       chromeos_acpi.attributes = paa;
+
+       return paa;
+}
+
+/*
+ * add_sysfs_attribute() create and initialize an ACPI sys fs attribute
+ *                         structure and create the attribute.
+ * @value: attribute value
+ * @name: base attribute name
+ * @count: total number of instances of this attribute
+ * @instance: instance number of this particular attribute
+ */
+
+static void add_sysfs_attribute(char *value, char *name,
+                               int count, int instance)
+{
+       struct acpi_attribute *paa =
+           create_sysfs_attribute(value, name, count, instance);
+
+       if (!paa)
+               return;
+
+       if (device_create_file(&chromeos_acpi.p_dev->dev, &paa->dev_attr))
+               printk(MY_ERR "failed to create attribute for %s\n", name);
+}
+
+/*
+ * handle_nested_acpi_package() create sysfs group including attributes
+ *                             representing a nested ACPI package.
+ *
+ * @po: package contents as returned by ACPI
+ * @pm: name of the group
+ * @total: number of instances of this package
+ * @instance: instance number of this particular group
+ *
+ * The created group is called @pm in case there is a single instance, or
+ * @pm.@instance otherwise.
+ *
+ * All group and attribute storage allocations are included in the lists for
+ * tracking of allocated memory.
+ */
+static void handle_nested_acpi_package(union acpi_object *po, char *pm,
+                                      int total, int instance)
+{
+       int i, size, count, j;
+       struct acpi_attribute_group *aag;
+
+       count = po->package.count;
+
+       size = strlen(pm) + 1 + sizeof(struct acpi_attribute_group) +
+           sizeof(struct attribute *) * (count + 1);
+
+       if (total != 1) {
+               if (total >= 1000) {
+                       printk(MY_ERR "%s: too many (%d) instances of %s\n",
+                              __func__, total, pm);
+                       return;
+               }
+               /* allow up to three digits and the dot */
+               size += 4;
+       }
+
+       aag = kzalloc(size, GFP_KERNEL);
+       if (!aag) {
+               printk(MY_ERR "out of memory in %s!\n", __func__);
+               return;
+       }
+
+       aag->next_acpi_attr_group = chromeos_acpi.groups;
+       chromeos_acpi.groups = aag->next_acpi_attr_group;
+       aag->ag.attrs = (struct attribute **)(aag + 1);
+       aag->ag.name = (const char *)&aag->ag.attrs[count + 1];
+
+       /* room left in the buffer */
+       size = size - (aag->ag.name - (char *)aag);
+
+       if (total != 1)
+               snprintf((char *)aag->ag.name, size, "%s.%d", pm, instance);
+       else
+               snprintf((char *)aag->ag.name, size, "%s", pm);
+
+       j = 0;                  /* attribute index */
+       for (i = 0; i < count; i++) {
+               union acpi_object *element = po->package.elements + i;
+               int copy_size = 0;
+               char attr_value[40];    /* 40 chars be enough for names */
+               struct acpi_attribute *paa;
+
+               switch (element->type) {
+               case ACPI_TYPE_INTEGER:
+                       copy_size = snprintf(attr_value, sizeof(attr_value),
+                                            "%d", (int)element->integer.value);
+                       paa = create_sysfs_attribute(attr_value, pm, count, i);
+                       break;
+
+               case ACPI_TYPE_STRING:
+                       copy_size = min(element->string.length,
+                                       sizeof(attr_value) - 1);
+                       memcpy(attr_value, element->string.pointer, copy_size);
+                       attr_value[copy_size] = '\0';
+                       paa = create_sysfs_attribute(attr_value, pm, count, i);
+                       break;
+
+               default:
+                       printk(MY_ERR "ignoring nested type %d\n",
+                              element->type);
+                       continue;
+               }
+               aag->ag.attrs[j++] = &paa->dev_attr.attr;
+       }
+
+       if (sysfs_create_group(&chromeos_acpi.p_dev->dev.kobj, &aag->ag))
+               printk(MY_ERR "failed to create group %s.%d\n", pm, instance);
+}
+
+/*
+ * maybe_export_acpi_int() export a single int value when required
+ *
+ * @pm: name of the package
+ * @index: index of the element of the package
+ * @value: value of the element
+ */
+static void maybe_export_acpi_int(const char *pm, int index, unsigned value)
+{
+       int i;
+       struct chromeos_acpi_exported_ints {
+               const char *acpi_name;
+               int acpi_index;
+               struct chromeos_acpi_datum *cad;
+       } exported_ints[] = {
+               { "VBNV", 0, &chromeos_acpi_if_data.nv_base },
+               { "VBNV", 1, &chromeos_acpi_if_data.nv_size },
+               { "CHSW", 0, &chromeos_acpi_if_data.switch_state },
+               { "CHNV", 0, &chromeos_acpi_if_data.chnv }
+       };
+
+       for (i = 0; i < ARRAY_SIZE(exported_ints); i++) {
+               struct chromeos_acpi_exported_ints *exported_int;
+
+               exported_int = exported_ints + i;
+
+               if (!strncmp(pm, exported_int->acpi_name, 4) &&
+                   (exported_int->acpi_index == index)) {
+                       printk(MY_NOTICE "registering %s %d\n", pm, index);
+                       exported_int->cad->cad_value = value;
+                       exported_int->cad->cad_is_set = true;
+                       return;
+               }
+       }
+}
+
+/*
+ * acpi_buffer_to_string() convert contents of an ACPI buffer element into a
+ *             hex string truncating it if necessary to fit into one page.
+ *
+ * @element: an acpi element known to contain an ACPI buffer.
+ *
+ * Returns: pointer to an ASCII string containing the buffer representation
+ *         (whatever fit into PAGE_SIZE). The caller is responsible for
+ *         freeing the memory.
+ */
+static char *acpi_buffer_to_string(union acpi_object *element)
+{
+       char *base, *p;
+       int i;
+       unsigned room_left;
+       /* Include this many characters per line */
+       unsigned char_per_line = 16;
+       unsigned blob_size;
+       unsigned string_buffer_size;
+
+       /*
+        * As of now the VDAT structure can supply as much as 3700 bytes. When
+        * expressed as a hex dump it becomes 3700 * 3 + 3700/16 + .. which
+        * clearly exceeds the maximum allowed sys fs buffer size of one page
+        * (4k).
+        *
+        * What this means is that we can't keep the entire blob in one sysfs
+        * file. Currently verified boot (the consumer of the VDAT contents)
+        * does not care about the most of the data, so as a quick fix we will
+        * truncate it here. Once the blob data beyond the 4K boundary is
+        * required this approach will have to be reworked.
+        *
+        * TODO(vbendeb): Split the data into multiple VDAT instances, each
+        * not exceeding 4K or consider exporting as a binary using
+        * sysfs_create_bin_file().
+        */
+
+       /*
+        * X, the maximum number of bytes which will fit into a sysfs file
+        * (one memory page) can be derived from the following equation (where
+        * N is number of bytes included in every hex string):
+        *
+        * 3X + X/N + 4 <= PAGE_SIZE.
+        *
+        * Solving this for X gives the following
+        */
+       blob_size = ((PAGE_SIZE - 4) * char_per_line) / (char_per_line * 3 + 1);
+
+       if (element->buffer.length > blob_size)
+               printk(MY_INFO "truncating buffer from %d to %d\n",
+                      element->buffer.length, blob_size);
+       else
+               blob_size = element->buffer.length;
+
+       string_buffer_size =
+               /* three characters to display one byte */
+               blob_size * 3 +
+               /* one newline per line, all rounded up, plus
+                * extra newline in the end, plus terminating
+                * zero, hence + 4
+                */
+               blob_size/char_per_line + 4;
+
+       p = kzalloc(string_buffer_size, GFP_KERNEL);
+       if (!p) {
+               printk(MY_ERR "out of memory in %s!\n", __func__);
+               return NULL;
+       }
+
+       base = p;
+       room_left = string_buffer_size;
+       for (i = 0; i < blob_size; i++) {
+               int printed;
+               printed = snprintf(p, room_left, " %2.2x",
+                                  element->buffer.pointer[i]);
+               room_left -= printed;
+               p += printed;
+               if (((i + 1) % char_per_line) == 0) {
+                       if (!room_left)
+                               break;
+                       room_left--;
+                       *p++ = '\n';
+               }
+       }
+       if (room_left < 2) {
+               printk(MY_ERR "%s: no room in the buffer!\n", __func__);
+               *p = '\0';
+       } else {
+               *p++ = '\n';
+               *p++ = '\0';
+       }
+       return base;
+}
+
+/*
+ * handle_acpi_package() create sysfs group including attributes
+ *                      representing an ACPI package.
+ *
+ * @po: package contents as returned by ACPI
+ * @pm: name of the group
+ *
+ * Scalar objects included in the package get sys fs attributes created for
+ * them. Nested packages are passed to a function creating a sys fs group per
+ * package.
+ */
+static void handle_acpi_package(union acpi_object *po, char *pm)
+{
+       int j;
+       int count = po->package.count;
+       for (j = 0; j < count; j++) {
+               union acpi_object *element = po->package.elements + j;
+               int copy_size = 0;
+               char attr_value[256];   /* strings could be this long */
+
+               switch (element->type) {
+               case ACPI_TYPE_INTEGER:
+                       copy_size = snprintf(attr_value, sizeof(attr_value),
+                                            "%d", (int)element->integer.value);
+                       add_sysfs_attribute(attr_value, pm, count, j);
+                       maybe_export_acpi_int(pm, j, (unsigned)
+                                             element->integer.value);
+                       break;
+
+               case ACPI_TYPE_STRING:
+                       copy_size = min(element->string.length,
+                                       sizeof(attr_value) - 1);
+                       memcpy(attr_value, element->string.pointer, copy_size);
+                       attr_value[copy_size] = '\0';
+                       add_sysfs_attribute(attr_value, pm, count, j);
+                       break;
+
+               case ACPI_TYPE_BUFFER: {
+                       char *buf_str;
+                       buf_str = acpi_buffer_to_string(element);
+                       if (buf_str) {
+                               add_sysfs_attribute(buf_str, pm, count, j);
+                               kfree(buf_str);
+                       }
+                       break;
+               }
+               case ACPI_TYPE_PACKAGE:
+                       handle_nested_acpi_package(element, pm, count, j);
+                       break;
+
+               default:
+                       printk(MY_ERR "ignoring type %d (%s)\n",
+                              element->type, pm);
+                       break;
+               }
+       }
+}
+
+
+/*
+ * add_acpi_method() evaluate an ACPI method and create sysfs attributes.
+ *
+ * @device: ACPI device
+ * @pm: name of the method to evaluate
+ */
+static void add_acpi_method(struct acpi_device *device, char *pm)
+{
+       acpi_status status;
+       struct acpi_buffer output;
+       union acpi_object *po;
+
+       output.length = ACPI_ALLOCATE_BUFFER;
+       output.pointer = NULL;
+
+       status = acpi_evaluate_object(device->handle, pm, NULL, &output);
+
+       if (!ACPI_SUCCESS(status)) {
+               printk(MY_ERR "failed to retrieve %s (%d)\n", pm, status);
+               return;
+       }
+
+       po = output.pointer;
+
+       if (po->type != ACPI_TYPE_PACKAGE)
+               printk(MY_ERR "%s is not a package, ignored\n", pm);
+       else
+               handle_acpi_package(po, pm);
+       kfree(output.pointer);
+}
+
+/*
+ * chromeos_process_mlst() Evaluate the MLST method and add methods listed
+ *                         in the response.
+ *
+ * @device: ACPI device
+ *
+ * Returns: 0 if successful, non-zero if error.
+ */
+static int chromeos_process_mlst(struct acpi_device *device)
+{
+       acpi_status status;
+       struct acpi_buffer output;
+       union acpi_object *po;
+       int j;
+
+       output.length = ACPI_ALLOCATE_BUFFER;
+       output.pointer = NULL;
+
+       status = acpi_evaluate_object(device->handle, MLST_METHOD, NULL,
+                                     &output);
+       if (!ACPI_SUCCESS(status)) {
+               pr_debug(MY_LOGPREFIX "failed to retrieve MLST (%d)\n",
+                        status);
+               return 1;
+       }
+
+       po = output.pointer;
+       if (po->type != ACPI_TYPE_PACKAGE) {
+               printk(MY_ERR MLST_METHOD "is not a package, ignored\n");
+               kfree(output.pointer);
+               return -EINVAL;
+       }
+
+       for (j = 0; j < po->package.count; j++) {
+               union acpi_object *element = po->package.elements + j;
+               int copy_size = 0;
+               char method[ACPI_NAME_SIZE + 1];
+
+               if (element->type == ACPI_TYPE_STRING) {
+                       copy_size = min(element->string.length,
+                                       (u32)ACPI_NAME_SIZE);
+                       memcpy(method, element->string.pointer, copy_size);
+                       method[copy_size] = '\0';
+                       add_acpi_method(device, method);
+               } else {
+                       pr_debug(MY_LOGPREFIX "ignoring type %d\n",
+                                element->type);
+               }
+       }
+
+       kfree(output.pointer);
+       return 0;
+}
+
+static int chromeos_device_add(struct acpi_device *device)
+{
+       int i;
+
+       /* Attempt to add methods by querying the device's MLST method
+        * for the list of methods. */
+       if (!chromeos_process_mlst(device))
+               return 0;
+
+       printk(MY_INFO "falling back to default list of methods\n");
+       for (i = 0; i < ARRAY_SIZE(default_methods); i++)
+               add_acpi_method(device, default_methods[i]);
+       return 0;
+}
+
+static int chromeos_device_remove(struct acpi_device *device, int type)
+{
+       return 0;
+}
+
+static int __init chromeos_acpi_init(void)
+{
+       int ret = 0;
+
+       if (acpi_disabled)
+               return -ENODEV;
+
+       chromeos_acpi.p_dev = platform_device_register_simple("chromeos_acpi",
+                                                             -1, NULL, 0);
+       if (IS_ERR(chromeos_acpi.p_dev)) {
+               printk(MY_ERR "unable to register platform device\n");
+               return PTR_ERR(chromeos_acpi.p_dev);
+       }
+
+       ret = acpi_bus_register_driver(&chromeos_acpi_driver);
+       if (ret < 0) {
+               printk(MY_ERR "failed to register driver (%d)\n", ret);
+               platform_device_unregister(chromeos_acpi.p_dev);
+               chromeos_acpi.p_dev = NULL;
+               return ret;
+       }
+       printk(MY_INFO "installed%s\n",
+              chromeos_on_legacy_firmware() ? " (legacy mode)" : "");
+       return 0;
+}
+
+subsys_initcall(chromeos_acpi_init);
diff --git a/drivers/platform/x86/chromeos_laptop.c b/drivers/platform/x86/chromeos_laptop.c
new file mode 100644 (file)
index 0000000..8cec113
--- /dev/null
@@ -0,0 +1,447 @@
+/*
+ *  chromeos_laptop.c - Driver to instantiate Chromebook platform devices.
+ *
+ *  Copyright (C) 2012 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <linux/dmi.h>
+#include <linux/i2c.h>
+#include <linux/i2c/atmel_mxt_ts.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include "chromeos_laptop.h"
+
+#define ATMEL_TP_I2C_ADDR      0x4b
+#define CYAPA_TP_I2C_ADDR      0x67
+#define ISL_ALS_I2C_ADDR       0x44
+#define TAOS_ALS_I2C_ADDR      0x29
+
+static struct i2c_client *als;
+static struct i2c_client *tp;
+
+const char *i2c_adapter_names[] = {
+       "SMBus I801 adapter",
+       "i915 gmbus vga",
+       "i915 gmbus panel",
+};
+
+static struct i2c_board_info __initdata cyapa_device = {
+       I2C_BOARD_INFO("cyapa", CYAPA_TP_I2C_ADDR),
+       .irq            = -1,
+       .flags          = I2C_CLIENT_WAKE,
+};
+
+static struct i2c_board_info __initdata isl_als_device = {
+       I2C_BOARD_INFO("isl29018", ISL_ALS_I2C_ADDR),
+};
+
+static struct i2c_board_info __initdata tsl2583_als_device = {
+       I2C_BOARD_INFO("tsl2583", TAOS_ALS_I2C_ADDR),
+};
+
+static struct i2c_board_info __initdata tsl2563_als_device = {
+       I2C_BOARD_INFO("tsl2563", TAOS_ALS_I2C_ADDR),
+};
+
+static const u8 atmel_224e_tp_config_data[] = {
+       /* MXT_GEN_COMMAND(6) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_GEN_POWERCONFIG(7) */
+       0xff, 0xff, 0x32,
+       /* MXT_GEN_ACQUIRE(8) */
+       0x06, 0x00, 0x14, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_TOUCH_MULTI(9) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+       0x00, 0x02, 0x01, 0x00, 0x0a, 0x03, 0x03, 0x0a, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x20, 0x00, 0x37, 0x37, 0x00,
+       /* MXT_TOUCH_KEYARRAY(15) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00,
+       /* MXT_SPT_COMMSCONFIG(18) */
+       0x00, 0x00,
+       /* MXT_SPT_GPIOPWM(19) */
+       0x03, 0xDF, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_TOUCH_PROXIMITY(23) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_SPT_SELFTEST(25)  */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_GRIPSUPPRESSION(40) */
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_TOUCHSUPPRESSION(42)  */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_SPT_CTECONFIG(46) */
+       0x00, 0x02, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_STYLUS(47) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCG_NOISESUPPRESSION(48) */
+       0x01, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00
+};
+
+static struct mxt_platform_data atmel_224e_tp_platform_data = {
+       .x_line                 = 18,
+       .y_line                 = 12,
+       .x_size                 = 102*20,
+       .y_size                 = 68*20,
+       .blen                   = 0x20, /* Gain setting is in upper 4 bits */
+       .threshold              = 0x19,
+       .voltage                = 0,    /* 3.3V */
+       .orient                 = MXT_HORIZONTAL_FLIP,
+       .irqflags               = IRQF_TRIGGER_FALLING,
+       .config                 = atmel_224e_tp_config_data,
+       .config_length          = sizeof(atmel_224e_tp_config_data),
+};
+
+static struct i2c_board_info __initdata atmel_224e_tp_device = {
+       I2C_BOARD_INFO("atmel_mxt_tp", ATMEL_TP_I2C_ADDR),
+       .platform_data = &atmel_224e_tp_platform_data,
+       .irq = -1,
+       .flags          = I2C_CLIENT_WAKE,
+};
+
+static const u8 atmel_224s_tp_config_data[] = {
+       /* MXT_GEN_COMMAND(6) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_GEN_POWERCONFIG(7) */
+       0xff, 0xff, 0x32, 0x00,
+       /* MXT_GEN_ACQUIRE(8) */
+       0x1e, 0x00, 0x28, 0x28, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00,
+       /* MXT_TOUCH_MULTI(9) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x04, 0x0f, 0x0f, 0x00, 0x00, 0x0a,
+       0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_TOUCH_KEYARRAY(15) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00,
+       /* MXT_SPT_COMMSCONFIG(18) */
+       0x00, 0x00,
+       /* MXT_SPT_GPIOPWM(19) */
+       0x03, 0xdf, 0x00, 0x20, 0x00, 0x00,
+       /* MXT_TOUCH_PROXIMITY(23) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_SPT_SELFTEST(25)  */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_GRIPSUPPRESSION(40) */
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_TOUCHSUPPRESSION(42)  */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_SPT_CTECONFIG(46) */
+       0x04, 0x02, 0x10, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00,
+       /* MXT_PROCI_STYLUS(47) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00,
+       /* MXT_PROCI_ADAPTIVETHRESHOLD(55) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_SHIELDLESS(56) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCI_EXTRATOUCHSCREENDATA(57) */
+       0x00, 0x00, 0x00,
+       /* MXT_SPT_TIMER(61-1) */
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_SPT_TIMER(61-2) */
+       0x00, 0x00, 0x00, 0x00, 0x00,
+       /* MXT_PROCG_NOISESUPPRESSION(62) */
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+};
+
+static struct mxt_platform_data atmel_224s_tp_platform_data = {
+       .x_line                 = 18,
+       .y_line                 = 12,
+       .x_size                 = 102*20,
+       .y_size                 = 68*20,
+       .blen                   = 0x80, /* Gain setting is in upper 4 bits */
+       .threshold              = 0x32,
+       .voltage                = 0,    /* 3.3V */
+       .orient                 = MXT_VERTICAL_FLIP,
+       .irqflags               = IRQF_TRIGGER_FALLING,
+       .config                 = atmel_224s_tp_config_data,
+       .config_length          = sizeof(atmel_224s_tp_config_data),
+};
+
+static struct i2c_board_info __initdata atmel_224s_tp_device = {
+       I2C_BOARD_INFO("atmel_mxt_tp", ATMEL_TP_I2C_ADDR),
+       .platform_data = &atmel_224s_tp_platform_data,
+       .irq = -1,
+       .flags          = I2C_CLIENT_WAKE,
+};
+
+static struct i2c_client *__add_probed_i2c_device(const char *name, int bus,
+                                                 struct i2c_board_info *info,
+                                                 const unsigned short *addrs)
+{
+       const struct dmi_device *dmi_dev;
+       const struct dmi_dev_onboard *dev_data;
+       struct i2c_adapter *adapter;
+       struct i2c_client *client;
+
+       if (bus < 0)
+               return NULL;
+       /*
+        * If a name is specified, look for irq platform information stashed
+        * in DMI_DEV_TYPE_DEV_ONBOARD.
+        */
+       if (name) {
+               dmi_dev = dmi_find_device(DMI_DEV_TYPE_DEV_ONBOARD, name, NULL);
+               if (!dmi_dev) {
+                       pr_err("%s failed to dmi find device %s.\n",
+                              __func__,
+                              name);
+                       return NULL;
+               }
+               dev_data = (struct dmi_dev_onboard *)dmi_dev->device_data;
+               if (!dev_data) {
+                       pr_err("%s failed to get data from dmi for %s.\n",
+                              __func__, name);
+                       return NULL;
+               }
+               info->irq = dev_data->instance;
+       }
+
+       adapter = i2c_get_adapter(bus);
+
+       /* add the i2c device */
+       client = i2c_new_probed_device(adapter, info, addrs, NULL);
+       if (!client)
+               pr_err("%s failed to register device %d-%02x\n",
+                      __func__, bus, info->addr);
+       else
+               pr_debug("%s added i2c device %d-%02x\n",
+                        __func__, bus, info->addr);
+
+       i2c_put_adapter(adapter);
+       return client;
+}
+
+static int __find_i2c_adap(struct device *dev, void *data)
+{
+       const char *name = data;
+       const char *prefix = "i2c-";
+       struct i2c_adapter *adapter;
+       if (strncmp(dev_name(dev), prefix, strlen(prefix)))
+               return 0;
+       adapter = to_i2c_adapter(dev);
+       return !strncmp(adapter->name, name, strlen(name));
+}
+
+static int find_i2c_adapter_num(enum i2c_adapter_type type)
+{
+       struct device *dev = NULL;
+       struct i2c_adapter *adapter;
+       const char *name = i2c_adapter_names[type];
+       /* find the adapter by name */
+       dev = bus_find_device(&i2c_bus_type, NULL, (void *)name,
+                             __find_i2c_adap);
+       if (!dev) {
+               pr_err("%s: i2c adapter %s not found on system.\n", __func__,
+                      name);
+               return -ENODEV;
+       }
+       adapter = to_i2c_adapter(dev);
+       return adapter->nr;
+}
+
+struct i2c_client *chromeos_laptop_add_probed_i2c_device(
+               const char *name,
+               enum i2c_adapter_type type,
+               struct i2c_board_info *info,
+               const unsigned short *addrs)
+{
+       return __add_probed_i2c_device(name,
+                                      find_i2c_adapter_num(type),
+                                      info,
+                                      addrs);
+}
+EXPORT_SYMBOL(chromeos_laptop_add_probed_i2c_device);
+
+struct i2c_client *chromeos_laptop_add_i2c_device(const char *name,
+                                                 enum i2c_adapter_type type,
+                                                 struct i2c_board_info *info)
+{
+       const unsigned short addr_list[] = { info->addr, I2C_CLIENT_END };
+       return __add_probed_i2c_device(name,
+                                      find_i2c_adapter_num(type),
+                                      info,
+                                      addr_list);
+}
+EXPORT_SYMBOL(chromeos_laptop_add_i2c_device);
+
+static struct i2c_client *add_smbus_device(const char *name,
+                                          struct i2c_board_info *info)
+{
+       return chromeos_laptop_add_i2c_device(name, I2C_ADAPTER_SMBUS, info);
+}
+
+static int setup_link_tp(const struct dmi_system_id *id)
+{
+       /* first try cyapa touchpad */
+       tp = chromeos_laptop_add_i2c_device("trackpad",
+                                           I2C_ADAPTER_VGADDC,
+                                           &cyapa_device);
+       if (tp)
+               return 0;
+
+       /* then try atmel mxt touchpad */
+       tp = chromeos_laptop_add_i2c_device("trackpad",
+                                           I2C_ADAPTER_VGADDC,
+                                           &atmel_224s_tp_device);
+       return 0;
+}
+
+static int setup_lumpy_tp(const struct dmi_system_id *id)
+{
+       /* first try cyapa touchpad on smbus */
+       tp = add_smbus_device("trackpad", &cyapa_device);
+       if (tp)
+               return 0;
+
+       /* then try atmel mxt touchpad */
+       tp = chromeos_laptop_add_i2c_device("trackpad",
+                                           I2C_ADAPTER_VGADDC,
+                                           &atmel_224e_tp_device);
+       return 0;
+}
+
+static int setup_isl29018_als(const struct dmi_system_id *id)
+{
+       /* add isl29018 light sensor */
+       als = add_smbus_device("lightsensor", &isl_als_device);
+       return 0;
+}
+
+static int setup_isl29023_als(const struct dmi_system_id *id)
+{
+       /* add isl29023 light sensor on Panel DDC GMBus */
+       als = chromeos_laptop_add_i2c_device("lightsensor",
+                                            I2C_ADAPTER_PANEL,
+                                            &isl_als_device);
+       return 0;
+}
+
+static int setup_tsl2583_als(const struct dmi_system_id *id)
+{
+       /* add tsl2583 light sensor */
+       als = add_smbus_device(NULL, &tsl2583_als_device);
+       return 0;
+}
+
+static int setup_tsl2563_als(const struct dmi_system_id *id)
+{
+       /* add tsl2563 light sensor */
+       als = add_smbus_device(NULL, &tsl2563_als_device);
+       return 0;
+}
+
+static const struct dmi_system_id chromeos_laptop_dmi_table[] = {
+       {
+               .ident = "Lumpy - Touchpads",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Lumpy"),
+               },
+               .callback = setup_lumpy_tp,
+       },
+       {
+               .ident = "Link - Touchpads",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Link"),
+               },
+               .callback = setup_link_tp,
+       },
+       {
+               .ident = "isl29018 - Light Sensor",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Lumpy"),
+               },
+               .callback = setup_isl29018_als,
+       },
+       {
+               .ident = "isl29023 - Light Sensor",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Link"),
+               },
+               .callback = setup_isl29023_als,
+       },
+       {
+               .ident = "tsl2583 - Light Sensor",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Alex"),
+               },
+               .callback = setup_tsl2583_als,
+       },
+       {
+               .ident = "tsl2563 - Light Sensor",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Mario"),
+               },
+               .callback = setup_tsl2563_als,
+       },
+       {
+               .ident = "tsl2563 - Light Sensor",
+               .matches = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"),
+               },
+               .callback = setup_tsl2563_als,
+       },
+       { }
+};
+
+static int __init chromeos_laptop_init(void)
+{
+       if (!dmi_check_system(chromeos_laptop_dmi_table)) {
+               pr_debug("%s unsupported system.\n", __func__);
+               return -ENODEV;
+       }
+       return 0;
+}
+
+static void __exit chromeos_laptop_exit(void)
+{
+       if (als) {
+               i2c_unregister_device(als);
+               als = NULL;
+       }
+       if (tp) {
+               i2c_unregister_device(tp);
+               tp = NULL;
+       }
+}
+
+module_init(chromeos_laptop_init);
+module_exit(chromeos_laptop_exit);
+
+MODULE_DESCRIPTION("Chrome OS Laptop");
+MODULE_AUTHOR("bleung@chromium.org");
+MODULE_LICENSE("GPL");
diff --git a/drivers/platform/x86/chromeos_laptop.h b/drivers/platform/x86/chromeos_laptop.h
new file mode 100644 (file)
index 0000000..02ab42f
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ *  chromeos_laptop.h - Driver to instantiate Chromebook platform devices.
+ *
+ *  Copyright (C) 2012 The Chromium OS Authors
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+/* Keep this enum consistent with i2c_adapter_names in chromeos_laptop.c */
+enum i2c_adapter_type {
+       I2C_ADAPTER_SMBUS = 0,
+       I2C_ADAPTER_VGADDC,
+       I2C_ADAPTER_PANEL,
+};
+
+/*
+ * Takes a list of addresses in addrs as such :
+ * { addr1, ... , addrn, I2C_CLIENT_END };
+ * chromeos_laptop_add_probed_i2c_device will use i2c_new_probed_device
+ * and probe for devices at all of the addresses listed.
+ * Returns NULL if no devices found.
+ * See Documentation/i2c/instantiating-devices for more information.
+ */
+struct i2c_client *chromeos_laptop_add_probed_i2c_device(
+               const char *name,
+               enum i2c_adapter_type type,
+               struct i2c_board_info *info,
+               const unsigned short *addrs);
+
+/*
+ * Probes for a device at a single address, the one provided by
+ * info->addr.
+ * Returns NULL if no device found.
+ */
+struct i2c_client *chromeos_laptop_add_i2c_device(const char *name,
+                                                 enum i2c_adapter_type type,
+                                                 struct i2c_board_info *info);
index 38ec52b..025dd1c 100644 (file)
 #define ISL29018_TEST_SHIFT            0
 #define ISL29018_TEST_MASK             (0xFF << ISL29018_TEST_SHIFT)
 
+#define ISL29018_REG_TEST              0x08
+#define ISL29018_TEST_SHIFT            0
+#define ISL29018_TEST_MASK             (0xFF << ISL29018_TEST_SHIFT)
+
 struct isl29018_chip {
        struct i2c_client       *client;
        struct mutex            lock;
@@ -234,6 +238,96 @@ static int isl29018_read_proximity_ir(struct i2c_client *client, int scheme,
 }
 
 /* Sysfs interface */
+/* lux_scale */
+static ssize_t show_lux_scale(struct device *dev,
+                       struct device_attribute *attr, char *buf)
+{
+       struct iio_dev *indio_dev = dev_get_drvdata(dev);
+       struct isl29018_chip *chip = iio_priv(indio_dev);
+
+       return sprintf(buf, "%d\n", chip->lux_scale);
+}
+
+static ssize_t store_lux_scale(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct iio_dev *indio_dev = dev_get_drvdata(dev);
+       struct isl29018_chip *chip = iio_priv(indio_dev);
+       unsigned long lval;
+
+       lval = simple_strtoul(buf, NULL, 10);
+       if (lval == 0)
+               return -EINVAL;
+
+       mutex_lock(&chip->lock);
+       chip->lux_scale = lval;
+       mutex_unlock(&chip->lock);
+
+       return count;
+}
+
+static ssize_t get_sensor_data(struct device *dev, char *buf, int mode)
+{
+       struct iio_dev *indio_dev = dev_get_drvdata(dev);
+       struct isl29018_chip *chip = iio_priv(indio_dev);
+       struct i2c_client *client = chip->client;
+       int value = 0;
+       int status;
+
+       mutex_lock(&chip->lock);
+       switch (mode) {
+       case COMMMAND1_OPMODE_PROX_ONCE:
+               status = isl29018_read_proximity_ir(client,
+                                               chip->prox_scheme, &value);
+       break;
+
+       case COMMMAND1_OPMODE_ALS_ONCE:
+               status = isl29018_read_lux(client, &value);
+               break;
+
+       case COMMMAND1_OPMODE_IR_ONCE:
+               status = isl29018_read_ir(client, &value);
+               break;
+
+       default:
+               dev_err(&client->dev, "Mode %d is not supported\n", mode);
+               mutex_unlock(&chip->lock);
+               return -EBUSY;
+       }
+
+       if (status < 0) {
+               dev_err(&client->dev, "Error in Reading data");
+               mutex_unlock(&chip->lock);
+               return status;
+       }
+
+       mutex_unlock(&chip->lock);
+
+       return sprintf(buf, "%d\n", value);
+}
+
+
+/* Read lux */
+static ssize_t show_lux(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       return get_sensor_data(dev, buf, COMMMAND1_OPMODE_ALS_ONCE);
+}
+
+/* Read ir */
+static ssize_t show_ir(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       return get_sensor_data(dev, buf, COMMMAND1_OPMODE_IR_ONCE);
+}
+
+/* Read nearest ir */
+static ssize_t show_proxim_ir(struct device *dev,
+               struct device_attribute *devattr, char *buf)
+{
+       return get_sensor_data(dev, buf, COMMMAND1_OPMODE_PROX_ONCE);
+}
+
 /* range */
 static ssize_t show_range(struct device *dev,
                        struct device_attribute *attr, char *buf)
@@ -440,6 +534,11 @@ static IIO_DEVICE_ATTR(proximity_on_chip_ambient_infrared_supression,
                                        S_IRUGO | S_IWUSR,
                                        show_prox_infrared_supression,
                                        store_prox_infrared_supression, 0);
+static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0);
+static IIO_DEVICE_ATTR(illuminance0_calibscale, S_IRUGO | S_IWUSR,
+                                       show_lux_scale, store_lux_scale, 0);
+static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0);
+static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0);
 
 #define ISL29018_DEV_ATTR(name) (&iio_dev_attr_##name.dev_attr.attr)
 #define ISL29018_CONST_ATTR(name) (&iio_const_attr_##name.dev_attr.attr)
@@ -449,6 +548,10 @@ static struct attribute *isl29018_attributes[] = {
        ISL29018_DEV_ATTR(adc_resolution),
        ISL29018_CONST_ATTR(adc_resolution_available),
        ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_supression),
+       ISL29018_DEV_ATTR(illuminance0_input),
+       ISL29018_DEV_ATTR(illuminance0_calibscale),
+       ISL29018_DEV_ATTR(intensity_infrared_raw),
+       ISL29018_DEV_ATTR(proximity_raw),
        NULL
 };
 
index 8671d98..76eabed 100644 (file)
@@ -870,6 +870,15 @@ static int __devinit taos_probe(struct i2c_client *clientp,
                goto fail2;
        }
 
+       /*
+        * This device is slow to resume - make it asynchronous
+        * To get full async, we must enable this on both i2c and iio devs
+        * and the i2c master.
+        */
+       device_enable_async_suspend(&indio_dev->dev);
+       device_enable_async_suspend(&clientp->dev);
+       device_enable_async_suspend(&clientp->adapter->dev);
+
        /* Load up the V2 defaults (these are hard coded defaults for now) */
        taos_defaults(chip);
 
index 022bacb..7484a4a 100644 (file)
@@ -26,6 +26,7 @@
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/module.h>
+#include <linux/debugfs.h>
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/slab.h>
@@ -60,6 +61,10 @@ static LIST_HEAD(thermal_tz_list);
 static LIST_HEAD(thermal_cdev_list);
 static DEFINE_MUTEX(thermal_list_lock);
 
+static unsigned int thermal_event_seqnum;
+
+static struct dentry *debugfs_root;
+
 static int get_idr(struct idr *idr, struct mutex *lock, int *id)
 {
        int err;
@@ -163,6 +168,29 @@ mode_store(struct device *dev, struct device_attribute *attr,
        return count;
 }
 
+static ssize_t
+fan_on_delay_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct thermal_zone_device *tz = to_thermal_zone(dev);
+
+       return sprintf(buf, "%d\n", tz->fan_on_delay);
+}
+
+static ssize_t
+fan_on_delay_store(struct device *dev, struct device_attribute *attr,
+                  const char *buf, size_t count)
+{
+       struct thermal_zone_device *tz = to_thermal_zone(dev);
+       int value;
+
+       if (!sscanf(buf, "%d\n", &value))
+               return -EINVAL;
+       if (value < 0 || value > (tz->polling_delay / 1000))
+               return -EINVAL;
+       tz->fan_on_delay = (unsigned int) value;
+       return count;
+}
+
 static ssize_t
 trip_point_type_show(struct device *dev, struct device_attribute *attr,
                     char *buf)
@@ -282,6 +310,7 @@ static DEVICE_ATTR(type, 0444, type_show, NULL);
 static DEVICE_ATTR(temp, 0444, temp_show, NULL);
 static DEVICE_ATTR(mode, 0644, mode_show, mode_store);
 static DEVICE_ATTR(passive, S_IRUGO | S_IWUSR, passive_show, passive_store);
+static DEVICE_ATTR(fan_on_delay, 0644, fan_on_delay_show, fan_on_delay_store);
 
 static struct device_attribute trip_point_attrs[] = {
        __ATTR(trip_point_0_type, 0444, trip_point_type_show, NULL),
@@ -651,19 +680,42 @@ thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
 #endif
 
 static void thermal_zone_device_set_polling(struct thermal_zone_device *tz,
-                                           int delay)
+                                           int delay_ms)
 {
+       unsigned long delay;
+       struct thermal_cooling_device_instance *instance;
+       struct thermal_cooling_device *cdev;
+
        cancel_delayed_work(&(tz->poll_queue));
 
-       if (!delay)
+       if (!delay_ms)
                return;
 
-       if (delay > 1000)
-               queue_delayed_work(system_freezable_wq, &(tz->poll_queue),
-                                     round_jiffies(msecs_to_jiffies(delay)));
-       else
-               queue_delayed_work(system_freezable_wq, &(tz->poll_queue),
-                                     msecs_to_jiffies(delay));
+       delay = msecs_to_jiffies(delay_ms);
+
+       if (tz->cdevs_in_delay > 0) {
+               list_for_each_entry(instance, &tz->cooling_devices, node) {
+                       cdev = instance->cdev;
+                       if ((cdev->cur_state == CDEV_STATE_DELAY) &&
+                           time_before(cdev->delay_until, (jiffies + delay)))
+                               delay = cdev->delay_until - jiffies;
+               }
+       }
+
+       delay = max_t(long, delay, 1);
+
+       /*
+        * round_jiffies_relative rounds delay down in most cases to values
+        * just under delay (10 seconds to 9.99).  When cdevs_in_delay is set,
+        * this rounds to 1.99.  This makes the next poll period trigger just
+        * before the fan can turn on, causing another poll to be scheduled
+        * immediately afterwards and causing an extra interrupt.  As such,
+        * do not round when fans are in delay.
+        */
+       if (delay > HZ && tz->cdevs_in_delay == 0)
+               delay = round_jiffies_relative(delay);
+
+       queue_delayed_work(system_freezable_wq, &(tz->poll_queue), delay);
 }
 
 static void thermal_zone_device_passive(struct thermal_zone_device *tz,
@@ -917,6 +969,7 @@ thermal_cooling_device_register(char *type, void *devdata,
        cdev->ops = ops;
        cdev->device.class = &thermal_class;
        cdev->devdata = devdata;
+       cdev->cur_state = CDEV_STATE_OFF;
        dev_set_name(&cdev->device, "cooling_device%d", cdev->id);
        result = device_register(&cdev->device);
        if (result) {
@@ -1014,13 +1067,13 @@ EXPORT_SYMBOL(thermal_cooling_device_unregister);
 void thermal_zone_device_update(struct thermal_zone_device *tz)
 {
        int count, ret = 0;
+       int num_tripped = 0;
        long temp, trip_temp;
        enum thermal_trip_type trip_type;
        struct thermal_cooling_device_instance *instance;
        struct thermal_cooling_device *cdev;
 
        mutex_lock(&tz->lock);
-
        if (tz->ops->get_temp(tz, &temp)) {
                /* get_temp failed - retry it later */
                pr_warn("failed to read out thermal zone %d\n", tz->id);
@@ -1057,10 +1110,33 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
 
                                cdev = instance->cdev;
 
-                               if (temp >= trip_temp)
-                                       cdev->ops->set_cur_state(cdev, 1);
-                               else
+                               if (temp < trip_temp) {
+                                       if (cdev->cur_state == CDEV_STATE_DELAY) {
+                                               tz->cdevs_in_delay--;
+                                               tz->cdevs_aborted_turn_on++;
+                                       }
+                                       cdev->cur_state = CDEV_STATE_OFF;
                                        cdev->ops->set_cur_state(cdev, 0);
+                                       continue;
+                               }
+
+                               if (cdev->cur_state == CDEV_STATE_ON)
+                                       continue;
+
+                               if (cdev->cur_state == CDEV_STATE_OFF) {
+                                       num_tripped++;
+                                       tz->cdevs_in_delay++;
+                                       cdev->cur_state = CDEV_STATE_DELAY;
+                                       cdev->delay_until = jiffies +
+                                               tz->fan_on_delay * HZ;
+                               }
+
+                               if (time_after_eq(jiffies, cdev->delay_until)) {
+                                       tz->cdevs_turned_on++;
+                                       tz->cdevs_in_delay--;
+                                       cdev->cur_state = CDEV_STATE_ON;
+                                       cdev->ops->set_cur_state(cdev, 1);
+                               }
                        }
                        break;
                case THERMAL_TRIP_PASSIVE:
@@ -1071,6 +1147,9 @@ void thermal_zone_device_update(struct thermal_zone_device *tz)
                }
        }
 
+       if (num_tripped > 1)
+               tz->cdevs_multiple_trips++;
+
        if (tz->forced_passive)
                thermal_zone_device_passive(tz, temp, tz->forced_passive,
                                            THERMAL_TRIPS_NONE);
@@ -1149,6 +1228,7 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
        tz->tc2 = tc2;
        tz->passive_delay = passive_delay;
        tz->polling_delay = polling_delay;
+       tz->fan_on_delay = 2;
 
        dev_set_name(&tz->device, "thermal_zone%d", tz->id);
        result = device_register(&tz->device);
@@ -1175,6 +1255,10 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
                        goto unregister;
        }
 
+       result = device_create_file(&tz->device, &dev_attr_fan_on_delay);
+       if (result)
+               goto unregister;
+
        for (count = 0; count < trips; count++) {
                result = device_create_file(&tz->device,
                                            &trip_point_attrs[count * 2]);
@@ -1200,6 +1284,23 @@ struct thermal_zone_device *thermal_zone_device_register(char *type,
        if (result)
                goto unregister;
 
+       tz->debugfs_dir = debugfs_create_dir(dev_name(&tz->device),
+                                            debugfs_root);
+       if (!IS_ERR_OR_NULL(tz->debugfs_dir)) {
+               debugfs_create_u32("cdevs_aborted_turn_on", 0444,
+                                  tz->debugfs_dir,
+                                  &tz->cdevs_aborted_turn_on);
+               debugfs_create_u32("cdevs_in_delay", 0444,
+                                  tz->debugfs_dir,
+                                  &tz->cdevs_in_delay);
+               debugfs_create_u32("cdevs_turned_on", 0444,
+                                  tz->debugfs_dir,
+                                  &tz->cdevs_turned_on);
+               debugfs_create_u32("cdevs_multiple_trips", 0444,
+                                  tz->debugfs_dir,
+                                  &tz->cdevs_multiple_trips);
+       }
+
        mutex_lock(&thermal_list_lock);
        list_add_tail(&tz->node, &thermal_tz_list);
        if (ops->bind)
@@ -1259,6 +1360,7 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
        device_remove_file(&tz->device, &dev_attr_temp);
        if (tz->ops->get_mode)
                device_remove_file(&tz->device, &dev_attr_mode);
+       device_remove_file(&tz->device, &dev_attr_fan_on_delay);
 
        for (count = 0; count < tz->trips; count++) {
                device_remove_file(&tz->device,
@@ -1267,6 +1369,10 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
                                   &trip_point_attrs[count * 2 + 1]);
        }
        thermal_remove_hwmon_sysfs(tz);
+
+       if (tz->debugfs_dir)
+               debugfs_remove_recursive(tz->debugfs_dir);
+
        release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id);
        idr_destroy(&tz->idr);
        mutex_destroy(&tz->lock);
@@ -1384,6 +1490,13 @@ static int __init thermal_init(void)
                mutex_destroy(&thermal_idr_lock);
                mutex_destroy(&thermal_list_lock);
        }
+       debugfs_root = debugfs_create_dir("thermal", NULL);
+       if (IS_ERR(debugfs_root)) {
+               if (debugfs_root != ERR_PTR(-ENODEV))
+                       pr_warn("Could not create debugfs entry %ld\n",
+                               PTR_ERR(debugfs_root));
+               debugfs_root = NULL;
+       }
        result = genetlink_init();
        return result;
 }
@@ -1391,6 +1504,8 @@ static int __init thermal_init(void)
 static void __exit thermal_exit(void)
 {
        class_unregister(&thermal_class);
+       if (debugfs_root)
+               debugfs_remove_recursive(debugfs_root);
        idr_destroy(&thermal_tz_idr);
        idr_destroy(&thermal_cdev_idr);
        mutex_destroy(&thermal_idr_lock);
diff --git a/firmware/radeon/BARTS_mc.bin.ihex b/firmware/radeon/BARTS_mc.bin.ihex
new file mode 100644 (file)
index 0000000..2e96009
--- /dev/null
@@ -0,0 +1,1507 @@
+:100000000003E8E00002BE01000002140003FF004C\r
+:100010000003FF000002A00E0001C01D0003E80065\r
+:100020000003E8100003E8200003E8300003601834\r
+:100030000003601C00036020000360280002B0FF82\r
+:100040000002B1FF0002B2FF0002B3FF00036138FB\r
+:100050000003496C0003FF000003AF0A0002B40470\r
+:1000600000026FF40000FA3B0002B40F00024F14CC\r
+:100070000000FA17000340240002B4400002B50F4C\r
+:1000800000034AA6000244410003F0020002499521\r
+:1000900000036AA600022DA8000349D400003243E1\r
+:1000A0000000221800003A150002B51000009A4323\r
+:1000B000000245530003F0080002A07E0003F04652\r
+:1000C0000002A0630003F0440000F20F000234BFFE\r
+:1000D0000003F4000001C0250003E8000000820FC7\r
+:1000E000000340240002B4400002B5F000034AA619\r
+:1000F000000244410003F0020002699500036AA671\r
+:10010000000340000003FF000003F8010003C440A7\r
+:100110000003C4510002C645000200000003401065\r
+:100120000003FF000003FF000003E8200003E830A5\r
+:10013000000360100003F8030002336C000232A8D1\r
+:10014000000348080002B49F00024004000368084E\r
+:10015000000348210002B3C1000247730003682175\r
+:1001600000036A89000348250002B3C100024773F7\r
+:100170000003682500036A8D000348C0000348C6D9\r
+:100180000000823100008A300000C22F0000CA2E19\r
+:100190000003E8100003E890000368C0000368C68D\r
+:1001A00000034AA40003E8400003FF0000024224C9\r
+:1001B00000036AA400034800000348050002BB3F97\r
+:1001C0000002BCBF0002BFEF0000923300008A347F\r
+:1001D000000082380000BA360000AA3A0002411B33\r
+:1001E0000002BBFB0002422B0002400C000368002F\r
+:1001F0000002455F0003680500034810000349DD65\r
+:100200000002BBF10002BC0200008A370000AA39DC\r
+:100210000002411B0002611C000368100002455BE4\r
+:100220000002655C000369DD0003400D0003FF0070\r
+:100230000003FF000003A14C00008A0D0002B3027E\r
+:10024000000243340003A33000009A0C0002B30400\r
+:10025000000243340003A33200009A0B0002B008EE\r
+:10026000000082410002B0090000824200034829D8\r
+:10027000000349700002BF070002400F0003800026\r
+:100280000003000E00038406000385560003A556F4\r
+:100290000002655400026440000349E80003682935\r
+:1002A0000003682D0003C1040003C115000369E8C1\r
+:1002B000000369EC0003E8000003E8D00002304FBF\r
+:1002C000000368E40003C1DE0002304F000369044C\r
+:1002D0000003402C0003FF000002B40200024404AB\r
+:1002E0000000A216000349D60002B5100002445BCC\r
+:1002F0000003A4460000A2180002A04E0003F00371\r
+:100300000002346A0003F4000001C0C50003F400D9\r
+:100310000001D3720003400E0000F2400003E8F039\r
+:100320000003A0B6000349D50000FA110002B10F86\r
+:10033000000242170002A5200003F0010000FA406D\r
+:100340000002431B0002A5230003F0010000F2118C\r
+:10035000000340000003402E0002B6100002B40C5F\r
+:1003600000002A40000242240003A222000243347B\r
+:1003700000026C23000246680003F0030002A05E46\r
+:100380000003F0010003E8C00000E2100003400891\r
+:100390000002B40000007A110002A0240003F04122\r
+:1003A0000002B2080002A0FE0003F0410002B20405\r
+:1003B0000002B43F000242240000922800034A9445\r
+:1003C0000003FF000003606C000340000003FF0017\r
+:1003D0000002B440000244040003F0030003E800FC\r
+:1003E0000000823F000222FA000340000003FF00E9\r
+:1003F0000002B440000244140003F0020000F23F87\r
+:10040000000222FA000340000003FF000002B44093\r
+:10041000000244140003F00100022E6E00034A940F\r
+:100420000003FF0000036070000340000003FF00B2\r
+:100430000002B402000244240003F0030003E800B9\r
+:100440000000823F00022331000340000003FF0050\r
+:100450000002B402000244340003F0020000F23F44\r
+:100460000002233100034A940003FF0000036134BB\r
+:100470000002336C000340000003FF000003FF0094\r
+:100480000002440E0003F0030003E8000000823F76\r
+:100490000002245A0002336C000340000003FF00F6\r
+:1004A0000003FF000002441E0003F0020000F23FC0\r
+:1004B0000002245A00022EA900034A940003FF0000\r
+:1004C000000360740002B0000000822B00034000B3\r
+:1004D0000003FF000002B402000244400003F003E6\r
+:1004E0000003E8000000823F0002261900034A943E\r
+:1004F0000003FF0000036078000340000003FF00DA\r
+:100500000002B404000244400003F0030003E800CA\r
+:100510000000823F0002289C00034A940003FF0071\r
+:100520000003607C000340000003FF000002B410E1\r
+:10053000000244400003F00C0003E8000000823F8A\r
+:100540000002296C0000020D0003FF000003FF0001\r
+:100550000002A40E0003F0040000F20E0002296C59\r
+:100560000003E8000000820E00034A940003FF002D\r
+:10057000000360AC000340000003FF000002B42051\r
+:10058000000244400003F0030003E8000000823F43\r
+:1005900000022B8400034A940003FF00000360B0B4\r
+:1005A0000003E8000000823F0002B0FF0002B1FF3C\r
+:1005B0000003C12000036860000368680003400076\r
+:1005C0000003FF000002B410000244400003F042A8\r
+:1005D0000003F4000002018F0003400D00034026D9\r
+:1005E0000002B1400002B2100002B3080002411440\r
+:1005F0000003A11A000242240003A2240002622187\r
+:10060000000243380003A330000262230000922B53\r
+:100610000002A41E0003F0090003493D0002B2805D\r
+:100620000003C022000244420002296C0003493D3D\r
+:100630000003FF000002B2800002644200000210CA\r
+:100640000003FF000002B401000244040003F004B0\r
+:100650000003E8000000823F0003C1FE00022C46B8\r
+:10066000000002100003FF000002B4020002440474\r
+:100670000003F0040003E8000000823F0003E8F0FC\r
+:1006800000022C46000340000003FF000003FF00AF\r
+:100690000002442E0003F0030003E8000000823F44\r
+:1006A00000023577000340000003FF000002B41091\r
+:1006B000000244240003F0030003E8000000823F2E\r
+:1006C000000236A90003F80300034A940003FF0068\r
+:1006D000000360B40002B0000000822B0003400061\r
+:1006E0000003FF000002B402000244410003F002D4\r
+:1006F0000000F23F0002261900034A940003FF00A5\r
+:10070000000360B8000340000003FF000002B404CF\r
+:10071000000244410003F0020000F23F0002289C66\r
+:1007200000034A940003FF00000360BC0003400084\r
+:100730000003FF000002B410000244410003F00B6C\r
+:100740000000F23F0002296C0000020D0003FF00D0\r
+:100750000003FF000002A40E0003F0040000F20EEC\r
+:100760000002296C0003E8000000820E00034A9496\r
+:100770000003FF00000360EC000340000003FF00E3\r
+:100780000002B420000244410003F0020000F23FE6\r
+:1007900000022B8400034A940003FF00000360F072\r
+:1007A0000000F23F0002B0FF0002B1FF0003C120D1\r
+:1007B0000003686000036868000340000003FF0056\r
+:1007C0000002B410000244410003F0420003F400B0\r
+:1007D0000002020E0003400D000340260002B1405B\r
+:1007E0000002B2100002B308000241140003A11A73\r
+:1007F000000242240003A2240002622100024338C6\r
+:100800000003A330000262230000922B0002A41E0A\r
+:100810000003F0090003493D0002B2800003C0223A\r
+:10082000000244420002296C0003493D0003FF001E\r
+:100830000002B28000026442000002100003FF00C8\r
+:100840000002B404000244040003F0030000F23F7D\r
+:100850000003C1FE00022C46000002100003FF004E\r
+:100860000002B408000244040003F0030000F23F59\r
+:100870000003E8F000022C46000340000003FF00E4\r
+:100880000003FF000002443E0003F0020000F23FBC\r
+:1008900000023577000340000003FF000002B4109F\r
+:1008A000000244340003F0020000F23F000236A9C7\r
+:1008B00000034A940003FF00000360F40003F80300\r
+:1008C000000002180003FF000003FF000002A00E5A\r
+:1008D0000003F0420003F4000002026C0003402C0D\r
+:1008E0000003FF000002B420000240400002A00408\r
+:1008F0000003F0480003E8000000823F00023208D5\r
+:100900000002324D0000F23F000232080002324D78\r
+:10091000000232E4000340000003FF000002B408BC\r
+:10092000000244040003F00C000348080003FF0029\r
+:100930000002B44000026004000368080003499804\r
+:100940000002B4FD00024114000369980003E8307E\r
+:100950000003C12E00036830000232F80003E800F3\r
+:100960000003E8100003E8300002B203000368301F\r
+:10097000000340000003FF000002B5080002451517\r
+:100980000003F001000234D700034A940003FF0083\r
+:10099000000360F8000002400003FF000003FF00B6\r
+:1009A0000002A10E0003F0020003E8000000821420\r
+:1009B00000022EA9000348000003480500000A3485\r
+:1009C000000002380000123300002A3A00003A36D4\r
+:1009D0000003FF00000368000003680500034810DF\r
+:1009E000000349DD00000A3700002A390003FF0038\r
+:1009F00000036810000369DD000349710002B201C1\r
+:100A00000003E8300003C1060003C117000368308B\r
+:100A10000003496C0002B5160002A0510001C29FFC\r
+:100A20000002B0CF0002B1050002B2010002B30023\r
+:100A300000036830000232F80002B0B400036830EE\r
+:100A4000000232F80002B0BC00036830000232F845\r
+:100A50000002B0B800036830000232F80002B0CBE8\r
+:100A600000036830000232F80002B08C00036830E6\r
+:100A7000000232F80002B0D100036830000232F800\r
+:100A80000003E8000003E8100002B2030002B30014\r
+:100A900000036830000002180003FF000003FF009D\r
+:100AA0000002A00E0003F0420003F4000001C000A9\r
+:100AB000000001F4000340120003401500000A1B6F\r
+:100AC0000002A00E0003F0020003F4000001C2CFF8\r
+:100AD0000002C11E00008A1B00026BBA0002655BA7\r
+:100AE0000002C66E0003F0410002C77E00036015DD\r
+:100AF0000002B20F000244420002A5140003F007F6\r
+:100B00000003E8A00003E8B0000360120003E8005F\r
+:100B1000000081F40003F4000001C04D0003402CEC\r
+:100B20000003FF000002B420000240400002A004C5\r
+:100B30000003F0420003F4000001C2E40003E800F7\r
+:100B40000000823F000232080002324D0000F23FF6\r
+:100B5000000232080002324D000232E4000340106D\r
+:100B60000003FF000003FF000003A006000380064F\r
+:100B70000003C1F000022E7B0003C1F000022E7BB7\r
+:100B80000003C1F000022E7B0003C1F000022E7BA7\r
+:100B9000000340200003FF000003FF000002C00E1E\r
+:100BA0000003F0450002C11E0003F0430002C22E04\r
+:100BB0000003F0410002C33E000360200002336CDA\r
+:100BC000000349480002B43F0002B58000024334EC\r
+:100BD000000263350003694800024334000369489A\r
+:100BE0000003F4000001C0000003400400006A3F5D\r
+:100BF0000003E8800003E8900003E8A00003E8B0E9\r
+:100C00000002B510000244150003F0060002A0DE49\r
+:100C10000003F003000364AA0003F4000003F041A2\r
+:100C2000000364EA0003F8010002B508000244056D\r
+:100C30000002031C000061F80002A0DE0003F003C4\r
+:100C40000003E8400003F4000003F041000384EADD\r
+:100C50000003D8400003DCC0000079F70003F8036C\r
+:100C60000003D49E0003FB0000030FFE00020318E4\r
+:100C70000003F801000385E4000244150002032F7D\r
+:100C8000000021F90002A0DE0003F003000061F182\r
+:100C90000003F4000003F041000061F00002BF080F\r
+:100CA0000003DC400003D8C00003F8030003D49E17\r
+:100CB0000003FB0000030FFE0002032B0003F803F8\r
+:100CC0000003EC000000021400000A4000006A3F2C\r
+:100CD0000003FF00000240010002A00E0003F0012B\r
+:100CE0000003EC00000349380002A0DE0003F041DD\r
+:100CF00000034A5C0002B8FE000242280002A0DEA7\r
+:100D00000003F003000369380003F4000003F0411E\r
+:100D100000036A5C000349D00002B40400026114BD\r
+:100D20000002B2010002B3120002A0DE0003F04193\r
+:100D30000002B31100036830000349710002B8EFEC\r
+:100D40000002B9040003C1060002617900024338C1\r
+:100D500000036830000348090002B8FD000244485F\r
+:100D60000003680900022E7F000349A00002B411AD\r
+:100D70000003C1240002B10F000369A000034A442C\r
+:100D80000002B4FE0002611E00036A440002411426\r
+:100D900000036A440002A0DE0003F0030003426186\r
+:100DA0000003F4000003F0410003425D0003FF0074\r
+:100DB0000003FF000003E860000369A50003686BFF\r
+:100DC0000002BA0C0002B8C00003DC810003D8A105\r
+:100DD0000002B0F80002B1070003E8200003E83089\r
+:100DE0000003FE000003D41F0003686B0003E8F05B\r
+:100DF000000223FF000223E20002241C0002A1FEE5\r
+:100E00000003F0410003627A000342780003FF0010\r
+:100E10000003FF000002A0800001C3930002A09124\r
+:100E20000001C3930002A0A20001C3930002A0B37B\r
+:100E30000001C3930002CFFE0002BC0C0002A1FC23\r
+:100E40000003F0420003F4000001C37D0000FA0437\r
+:100E50000003E8F0000223E2000223FF0002241C4A\r
+:100E6000000342780003FF000003FF000002A0809F\r
+:100E70000001C3A90002A0910001C3A90002A0A221\r
+:100E80000001C3A90002A0B30001C3A90002CFFE64\r
+:100E90000002BC0C0002A1FC0003F0420003F400BD\r
+:100EA0000001C396000062040000FA030003FF0083\r
+:100EB0000002A5CF0001C3B90002A5FC0001C3B424\r
+:100EC0000003E8F00003E8C00003F4000001C3BC25\r
+:100ED00000030CCF0003ACC00003E8F00003F400F3\r
+:100EE0000001C3BC00030FFC0003AFF00003E8C027\r
+:100EF000000223FF0003C1FC000223E20003493883\r
+:100F00000002A0DE0003F04100034A5C0003FF0082\r
+:100F10000002622E0002A0DE0003F0030003693825\r
+:100F20000003F4000003F04100036A5C000349D0B1\r
+:100F30000002B4FB000241140002B2010002B3122D\r
+:100F40000002A0DE0003F0410002B311000368308C\r
+:100F5000000349710002B8EF0002B9FB0003C106AB\r
+:100F60000002417900024338000368300003480959\r
+:100F70000002B8FD00024448000368090002B018EE\r
+:100F8000000224400003EC00000344B90002A0DE8C\r
+:100F90000003F041000344F90003C10F0003C11F27\r
+:100FA0000003C12F0003C13F0003C14F0003C15F15\r
+:100FB0000002A0DE0003F005000364B0000364B487\r
+:100FC000000364B90003F4000003F043000364F07D\r
+:100FD000000364F4000364F9000348C80002B4F39A\r
+:100FE0000002B5040002400400026005000368C866\r
+:100FF00000024004000368C80003EC00000344B989\r
+:101000000002A0DE0003F041000344F90003C10F19\r
+:101010000003C11F0003C12F0003C13F0003C16FC4\r
+:101020000003C17F0002A0DE0003F005000364ACF2\r
+:10103000000364BC000364B90003F4000003F04340\r
+:10104000000364EC000364FC000364F9000348C877\r
+:101050000002B4F30002B50400024004000260057F\r
+:10106000000368C800024004000368C80003EC00E5\r
+:101070000002B01000022440000232F8000232F8F0\r
+:10108000000232F8000232F8000232F800034A1C73\r
+:101090000002244C0003C18C00034A200002244CAF\r
+:1010A00000038CC60002688C00034A240002244C12\r
+:1010B0000003C19C00034A280002244C00038CC694\r
+:1010C0000002699C00034A2C0002244C0003C1ACBE\r
+:1010D00000034A300002244C00038CC600026AACB4\r
+:1010E00000034A340002244C0003C1BC00034A3808\r
+:1010F0000002244C00038CC600026BBC0003EC0011\r
+:101100000003686B0002B9080002B8C00003DC806D\r
+:101110000003D8900003E8100003E8200003E83043\r
+:101120000003FE000003D41E0003686B0003EC0004\r
+:101130000003E8C00003873C0003A7760003862C69\r
+:101140000003A6680003851C0003A55A0003840C55\r
+:101150000003A44C00026CC700026CC600026CC500\r
+:1011600000026CC40003EC000000220F00034024C6\r
+:101170000003FF000002444E0003A0060002A10E7F\r
+:101180000003F00100008207000349A4000349A105\r
+:1011900000006A3F00038BEA0003C0AB000245A5D4\r
+:1011A0000002A0DE0003F003000243A30003F400EA\r
+:1011B0000003F041000263B3000369A4000369A1C6\r
+:1011C0000002B2FF0002B1FF0002B07F00036860BE\r
+:1011D0000003E8000003E8200003E8300002A0DE7E\r
+:1011E0000003F00300000A090003F4000003F041CB\r
+:1011F00000000A080002B8C00003686B0003D800B2\r
+:101200000003DC800003D41E0002BF0200022E7B1C\r
+:10121000000380E000008204000082030003E80075\r
+:1012200000008202000082010000F2000003485426\r
+:101230000002A0DE0003F003000384E80003F400D2\r
+:101240000003F041000384EA0002622400036854B2\r
+:1012500000034998000388E50003C13E0002A0DEB8\r
+:101260000003F001000383300003C12E0002600878\r
+:101270000003683000034975000388E600026068D7\r
+:101280000003C1170003C12E0003C13E0002A0DE0F\r
+:101290000003F0010003833000036830000348546A\r
+:1012A0000002A0DE0003F003000384E80003F40062\r
+:1012B0000003F041000384EA0003C044000242241A\r
+:1012C000000368540002BF0200022E7B00000218D7\r
+:1012D0000003FF000003FF000002A00E0003F00265\r
+:1012E0000003F400000204D7000230610003E8703C\r
+:1012F000000384E60002464B0002A0640003F04FA6\r
+:10130000000349D20003E86000038AB20003AAAADE\r
+:10131000000384A60002644A0003C1540002A0DE58\r
+:101320000003F003000368E50003F4000003F0414C\r
+:10133000000369050003F4000001C5820002BF0834\r
+:1013400000024FF90003AFF400038BB20003ABBC03\r
+:10135000000225A60003F400000205820003400CF1\r
+:101360000003FF000002BF0800024FF00003F0423C\r
+:101370000003F4000001C4F40002BF000002BB013E\r
+:10138000000225A6000002110003FF000003FF0079\r
+:101390000002A00E0003F0420003F4000001C58229\r
+:1013A0000002B1020002B0110002C4400002C550A8\r
+:1013B0000002A0DE0003F003000368E50003F40070\r
+:1013C0000003F041000369050003011E000204E967\r
+:1013D0000000F2020000F2010002A0DE0003F003B0\r
+:1013E00000007A060003F4000003F04100007A05D3\r
+:1013F00000038DE20003DCD00003D8F0000389E68F\r
+:101400000002699E0000F1F2000042070003E8D0EC\r
+:1014100000038FE00003C1A800038CED0000E1F69B\r
+:101420000000E23E00022FCA0002B701000042079E\r
+:101430000003E8A00000D1F20002A07E0003F0014A\r
+:101440000003A88000030FDF0003C1D90003C1A877\r
+:1014500000038CED0000E1F60000E23E00022FCA1E\r
+:101460000002300B0003C1040003C12600036270B8\r
+:101470000002BF0100034011000388E00002A0FE4B\r
+:101480000003F004000244480003F0020003F400EB\r
+:10149000000205680002B701000042070003FF00D8\r
+:1014A0000002A07E0003F0010003A8800003E8D042\r
+:1014B00000038FE00003C1A800038CED0000E1F6FB\r
+:1014C0000000E23E00022FCA0002300B000342700F\r
+:1014D00000038CEB00038CEA0003E8F00002C84034\r
+:1014E0000003A88000002A160002CA620003AAA016\r
+:1014F0000002A65E0002054500006A3F0000F216E9\r
+:101500000003C1580003C17A000362710003F400B4\r
+:10151000000204FF0002A15E0003F00E00006A3F1B\r
+:101520000003C1910003C1B30002A0DE0003F00379\r
+:101530000003612E0003F4000003F0410003613258\r
+:101540000002C0810003A8000002C2A30003AA2079\r
+:10155000000385500000AA16000381E00003008408\r
+:101560000003F0240002A1840003F0010002C44142\r
+:101570000003044E0003C154000302A60003F0243C\r
+:101580000002A1A60003F0010002C6610003066E7E\r
+:101590000003C1760003D45E00026002000205571A\r
+:1015A00000006A3F0002BF0200022E7B0003497167\r
+:1015B000000381E40003C1060003A26C0002A02E18\r
+:1015C00000020582000261710003C12E0003C13ECA\r
+:1015D0000002A0DE0003F0010003833000038660F8\r
+:1015E0000003F0470003683000038FED00022E7BFC\r
+:1015F00000038FED00022E7B00038FED00022E7B97\r
+:1016000000038FED00022E7B000349750003C12EFD\r
+:101610000003C1060003C1170003C13E0002A0DEA3\r
+:101620000003F00100038330000368300003499891\r
+:101630000003FF000003C13E0002A0DE0003F00132\r
+:10164000000383300003C12E0003683000000A0F3E\r
+:10165000000001F40003FF000002411E0003F0013E\r
+:101660000003EC000002A50E0003F0480003401147\r
+:101670000002A0DE0003F0030002666E0003F40027\r
+:101680000003F0410002677E000360110003E800E0\r
+:10169000000081F40003EC00000232F800034A402D\r
+:1016A0000000420000004A04000052030002BC3364\r
+:1016B0000002440C0002451C000264450002462C56\r
+:1016C0000002473C00026667000264460002A14E29\r
+:1016D0000003F0010002B4010002A08E0003F00537\r
+:1016E0000002A4490003F0430002A44B0003F041B0\r
+:1016F0000000F2020000A2040002BCCC0002440C74\r
+:101700000002451C0002462C0002473C00026445D2\r
+:1017100000026446000264470002A14E0003F0018B\r
+:101720000002B4010002A08E0003F0050002A44AEA\r
+:101730000003F0430002A44B0003F0410000F2015B\r
+:101740000000A2030003E8400000A20000034329B8\r
+:101750000002A0DE0003F041000343690000020222\r
+:10176000000012010002B10F0002B3070002A5FE43\r
+:10177000000205FC0002A00E0003F0060002BC0FF0\r
+:101780000002A4410003F0010002BC090003C14CA7\r
+:101790000003C15C0002A02E0003F0060002BC0F93\r
+:1017A0000002A4610003F0010002BC090003C16C47\r
+:1017B0000003C17C0002A0DE0003F00300036329E4\r
+:1017C0000003F4000003F0410003636900024C02CF\r
+:1017D0000002A0CE0003F0060002CFFE0002BC090A\r
+:1017E0000002A5FC0003F0020003F4000001C5A6FE\r
+:1017F000000348E50002A0DE0003F04100034905B4\r
+:101800000002B8110002A00E0003F0010002C4485B\r
+:10181000000249410002A4930003F0010000F2021B\r
+:101820000002A02E0003F0010002C5580002495139\r
+:101830000002A4930003F0010000F2010002A0DE08\r
+:101840000003F003000368E50003F4000003F04127\r
+:1018500000036905000240020002A00E000205A676\r
+:101860000003EC0000006A3F0003E8000002303B88\r
+:10187000000349980002B80F0002B5F50002B30159\r
+:101880000002A0DE0003F001000383300003C12E3C\r
+:101890000002600800024115000368300002BF002A\r
+:1018A00000022E7B0000F1FF0003E800000081FE33\r
+:1018B0000003400C0003402D0002B8100002B908DC\r
+:1018C00000024A180003AAA600024B490003ABB469\r
+:1018D0000002B30400026FAB0003F0410002B30248\r
+:1018E00000024FAB0003F0010002B3060003402DDD\r
+:1018F00000000A110002B040000240400003F04125\r
+:101900000003E8300002411E0003F0010003E8304C\r
+:10191000000099FD00022E7F0002BC010002A0DE43\r
+:101920000003F0090003482100038CC6000386660B\r
+:101930000003A6660002666C0003682100036A8942\r
+:101940000003F4000003F0470003482500038CC6A1\r
+:10195000000386660003A6660002666C0003682525\r
+:1019600000036A8D0002B0010003E8100003E820C4\r
+:101970000003E83000036A600002BF03000231D5B3\r
+:1019800000034808000384EA000081F500026004B7\r
+:10199000000368080002BF6400022E7B00006A3F5B\r
+:1019A0000003FF000003FF000002A0DE0003F003BD\r
+:1019B0000002BB000003F4000003F0410002BB4042\r
+:1019C0000000D9EF0003C10E0003C11E0003811601\r
+:1019D0000002611E000382E600036A440003C11E88\r
+:1019E000000381160003E82000036A440003E800B6\r
+:1019F0000003C0000003C1100002B2FD00036860D4\r
+:101A000000034A600002BFF70002B1130002400F5A\r
+:101A10000002600E00036A600000320C00003A0B06\r
+:101A20000002BC080002BFFE0003866A00026226B4\r
+:101A30000002A47E0003F0010002B3040002400F84\r
+:101A40000002600C00036A6000038FE100022E7B3D\r
+:101A50000003686B0003FF000003FE000000623D0E\r
+:101A600000005A3C0003FF000003D8C10003DCB1B2\r
+:101A700000038FE300022E7B0003D01F00038CEFD6\r
+:101A800000038FE400026FFE0002400100024223C7\r
+:101A90000002400200024CC00003FB010003D01F03\r
+:101AA00000030FFE000206A20002A0DE0003F00306\r
+:101AB000000348210003F4000003F041000348251F\r
+:101AC0000003C0CC000206CE00038CE60002C66C08\r
+:101AD0000003F0410002C77E0002A0DE0003F00414\r
+:101AE0000003682100036A890003F4000003F04248\r
+:101AF0000003682500036A8D0002A57E0003F00242\r
+:101B00000003F4000001C671000340110002B00898\r
+:101B10000000F1F40002A0DE0003F00300026660A2\r
+:101B20000003F4000003F04100026770000360113D\r
+:101B30000003F40000020883000380E10003810633\r
+:101B40000002611E000382E700036A44000381066D\r
+:101B50000003E82000036A440002B0010003E8101B\r
+:101B60000003E8200003E83000036A600003402C13\r
+:101B700000005A2B0002B4040003E8F000024440C5\r
+:101B80000003F0010002BF010002A4BE0003F00147\r
+:101B90000002BF04000231D50000F2270000F22548\r
+:101BA0000002B0FF0002B1BF0003C1200003686063\r
+:101BB0000002B0010003E8100003E8200003E83051\r
+:101BC00000036A6000000A3B0000120C00001A0BC0\r
+:101BD0000002B0020002A0DE0003F0410002B004E7\r
+:101BE0000003822A0002A43E0003F0010002B304B5\r
+:101BF00000038116000260010002B13300036A6035\r
+:101C00000003400A0002B0010002B1020002B2006B\r
+:101C10000002B3010002A02B0003F0020003E82041\r
+:101C20000003C13B00036A680003C10E00001242BA\r
+:101C3000000240090003F0010003E8200002B01395\r
+:101C40000002B102000382260003E83000036A703C\r
+:101C50000003402D00006211000012280002BF4066\r
+:101C600000024F4F0003F0030002A0CE0003F0017A\r
+:101C70000002B2080002B0210002B1020002B3016A\r
+:101C800000036A7400000A2B0002B0010003FF0089\r
+:101C90000002A41E0003F0050002B1040002B2001D\r
+:101CA0000002B3020003F4040003F0030002B102D7\r
+:101CB0000002B20F0002B30100036A7800034A7CFD\r
+:101CC0000003FF000002B0010002B1020002B304F1\r
+:101CD00000036A7C000001FE0003FF000003FF0018\r
+:101CE0000002C00E000081FE000231D00000022779\r
+:101CF0000003400A0003400D0002A00E0003F0059F\r
+:101D00000002B00100024005000380060003F40455\r
+:101D10000003F0030002B004000240090003800247\r
+:101D20000002B103000268010000022B0003FF0063\r
+:101D30000003FF000002A40E0003F00B00001228B5\r
+:101D40000002B0230002B1030002B30100036A7471\r
+:101D500000034A7C0003FF000002B0010002B1044E\r
+:101D60000002B30400036A7C00034A640002B480EA\r
+:101D7000000011EF00024004000260080003A222EC\r
+:101D80000002B30100036A6400023095000230A231\r
+:101D9000000001FF0003FF000003FF000002A00E8F\r
+:101DA0000003F04E0003402C0002BC040003DCC022\r
+:101DB00000038FEA0002A0DE0003F0010003E8F058\r
+:101DC0000003D8F00002BC090002BF3F00024B1F15\r
+:101DD00000022F0B0003E8F00000F9FF000001FEF5\r
+:101DE0000003FF000003FF000002C00E000081FEA0\r
+:101DF0000003402500001A100002B2040002422035\r
+:101E00000002A0DE0003F0410003A3320002B90289\r
+:101E100000024993000262290002B980000249953C\r
+:101E2000000262290002B9860003E8800002A029AE\r
+:101E30000003F0410003C18E0000C1DA000009FD7B\r
+:101E40000003402E0003FF000002A001000207A2D1\r
+:101E50000002B001000241080003F005000002404A\r
+:101E60000003FF000003FF000002A00E000207A213\r
+:101E700000034A7400007A280003FF000003FF00FB\r
+:101E80000003C12F00036A74000231D00000022752\r
+:101E90000003400A0003400D0002A00E0003F005FD\r
+:101EA0000002B00400024005000380020003F404B5\r
+:101EB0000003F0020002B01000024009000079DACD\r
+:101EC0000002B1430003FF000002A0FE0003F04146\r
+:101ED0000002B123000268010000022B0003FF0092\r
+:101EE0000003FF000002A00E000207D40000122829\r
+:101EF0000002B0430002B1040002B30100036A749F\r
+:101F000000034A7C0003FF000002B0010002B1059B\r
+:101F10000002B30400036A7C00034A640002B48038\r
+:101F2000000011EF00024004000260080002B82027\r
+:101F3000000260080002B8BF000240080003A222AD\r
+:101F40000003C13E00036A640003F4040003F008C8\r
+:101F500000034A640002B480000011EF0002400454\r
+:101F6000000260080003A2220003C13E00036A646D\r
+:101F700000023095000230A2000042100002B002C0\r
+:101F80000002A0DE0003F0410003800200024008CE\r
+:101F90000003F0020003F4000001C7F50003400E47\r
+:101FA0000002B0100003FF00000241090002A0106F\r
+:101FB000000207F5000002270003FF000003FF00F6\r
+:101FC0000002C00E000082270002B1020002A4013C\r
+:101FD00000020735000041EF000001F90003FF0097\r
+:101FE0000003FF000003D8800003DC0000007A42F9\r
+:101FF0000002B0010003DC010002B0000003D801C0\r
+:10200000000049DA0003FF000003FF000002A09E69\r
+:102010000003F0460003E8F00002B1240002C8818A\r
+:102020000003D8800002C0010003D8810002308C78\r
+:10203000000001FE0003FF000003FF000002C00ECD\r
+:10204000000081FE000079DA000231D00002A0FE1B\r
+:102050000003F0450002B00F0003C1100003C120CF\r
+:102060000003C13000036A800003400A0002B04050\r
+:102070000003FF00000240090003A0020002B103B8\r
+:10208000000268010000022B0003FF000003FF00B4\r
+:102090000002A40E0003F00B000012280002B0435F\r
+:1020A0000002B1050002B30100036A7400034A7C18\r
+:1020B0000003FF000002B0010002B1060002B304F9\r
+:1020C00000036A7C00034A640002B480000011EF40\r
+:1020D00000024004000260080003A2220002B301D3\r
+:1020E00000036A6400023095000230A2000340251C\r
+:1020F000000042100002B020000240050003F0483A\r
+:102100000002B0020002A0DE0003F04100038002E2\r
+:10211000000240080003F0020003F4000001C8655B\r
+:10212000000011FE0002B0800002B3030002A023F1\r
+:102130000003F043000240050003F0010002319665\r
+:102140000003402E0003FF000002B0080002410817\r
+:102150000002A010000208650002B08000024108E1\r
+:102160000003F005000002400003FF000003FF0031\r
+:102170000002A00E00020865000002250003FF0017\r
+:102180000003FF000003E81000008A250002A40EEF\r
+:1021900000020777000001EF000041F90003FF0093\r
+:1021A0000003FF000003D8000003DC8000007A4237\r
+:1021B0000002B0000003D8010002B0010003DC01FE\r
+:1021C0000003400D0002BD200003FF0000024DD5BA\r
+:1021D0000002A6DE0003F00300022F2B0003F4042C\r
+:1021E0000003F00A0002B07F0002B1FF0002B2FF5C\r
+:1021F000000368600003686B000011E50002B3C0D3\r
+:102200000003E8D00003604C00022F660002B0011A\r
+:102210000003E8100003E8200003E83000036A60D0\r
+:1022200000034A640002B4800002400400036A64B0\r
+:10223000000021F50003FF00000348080003FF0031\r
+:102240000003C104000368080003EC000003E80079\r
+:102250000003E8100002A0DE0003F0030003691C85\r
+:102260000003F4040003F001000369340003EC00F0\r
+:1022700000006A3F0003FF000003FF000002A0DE31\r
+:102280000003F0030002BB620003F4000003F0410E\r
+:102290000002BB680003FF000003FF000000D9FC40\r
+:1022A0000002328E0003E8000002303B0002BB0255\r
+:1022B0000000DA3E000348010002B0BF00024440C3\r
+:1022C00000036801000349980002B40F0002B5FD45\r
+:1022D00000026004000241150003C12E0003C13E4C\r
+:1022E0000002A0DE0003F001000383300003683029\r
+:1022F000000348080002B440000081F500026004B9\r
+:10230000000368080003E8000002B1600003E82051\r
+:102310000003E830000369A00003E8000002B110E8\r
+:102320000003E8200003E83000036A440002B00123\r
+:102330000003E8100003E8200003E83000036A60AF\r
+:102340000002BF02000231D50003E8000003C00014\r
+:102350000003C1100002B2FD0003686000000A3BE8\r
+:102360000000120C00001A0B0002B00A0002A0DEEE\r
+:102370000003F0410002B00C00038116000260016E\r
+:102380000003822A0002B10C000262210002A43E76\r
+:102390000003F0010002B3040002B11600036A60FA\r
+:1023A00000038FE100022E7B0003686B0003FF0037\r
+:1023B0000003FE00000231FE00034A600000320C00\r
+:1023C00000003A0B0002B4F60002B5030003866A6F\r
+:1023D000000262260002A47E0003F0010002B7049E\r
+:1023E00000026337000301150002400400036A6025\r
+:1023F0000003400A0002B0010002B1020002B21262\r
+:102400000003E83000036A680002B0800000124256\r
+:10241000000240080003F0010003E8200002B013AE\r
+:102420000002B102000382260003E83000036A7054\r
+:102430000002B0210002B1020002B2010002B301A9\r
+:1024400000036A740002B0010002B1020002B20F80\r
+:102450000002B30100036A7800034A7C0003FF0016\r
+:102460000002B0020002B1020002B30400036A7C61\r
+:102470000002B0FF0002B1BF0003C120000368608A\r
+:102480000003E87000034A640002B48000024004C4\r
+:102490000003E8200003E83000036A6400034A6494\r
+:1024A0000002B480000011FC000240040002B403EA\r
+:1024B000000260040002B31000036A640002309559\r
+:1024C00000034A640002B40800024440000267743A\r
+:1024D0000002A57E0002095C0003E8000002303B18\r
+:1024E0000002A0DE0003F003000348220003F40012\r
+:1024F0000003F041000348260003FF0000038CE6C0\r
+:102500000002CAAC0003F0410002CBBE0002A0DE14\r
+:102510000003F0040003682200036A8A0003F40049\r
+:102520000003F0420003682600036A8E0003E8708F\r
+:102530000002A6BE0003F0020003F4000001C9215E\r
+:10254000000340120000F1F40002BF040002A0DE0C\r
+:102550000003F00300026AAF0003F4000003F0413F\r
+:1025600000026BBF000360120003F4000001C95CAD\r
+:102570000002B0010003E8100003E8200003E83087\r
+:1025800000036A6000034A640002B4800002400451\r
+:1025900000036A64000021F50003FF0000034808FF\r
+:1025A0000003FF000003C104000368080003EC00FF\r
+:1025B00000006A3F0000F1FF0003E8000000821302\r
+:1025C000000340080003402D0002B8400002B90893\r
+:1025D00000024A080003AAAA00024B490003ABB458\r
+:1025E0000002B30400026FAB0003F0410002B3022B\r
+:1025F00000024FAB0003F0010002B3060003402DC0\r
+:1026000000000A110002B040000240400003F04107\r
+:102610000003E8300002411E0003F0010003E8302F\r
+:1026200000009A12000021F40003E8500003FF00AC\r
+:102630000000A2190000A9F400006A3F0003FF0097\r
+:102640000003FF000002A0DE0003F003000059F1C8\r
+:102650000003F4000003F043000059F00003FF0002\r
+:102660000003FF000000D9EF00034800000384EAE4\r
+:102670000003C0440003FF000002400400036800A0\r
+:10268000000348040003C07E0003FF000003FF00B6\r
+:1026900000024337000368040003402C00005A2B5B\r
+:1026A0000002B4040003E8F0000244400003F0011B\r
+:1026B0000002BF0100024BBE0002A0BE0003F003F7\r
+:1026C000000230FD0003F4000001C9B50002BFCBD9\r
+:1026D000000233410000F2260000F2250002B0FFA4\r
+:1026E0000002B1BF0003C120000368600002B00116\r
+:1026F0000003E8100003E8200003E83000036A60EC\r
+:1027000000000A3B0000120C00001A0B0002B0028D\r
+:102710000002A0DE0003F0410002B00400038116B5\r
+:1027200000026001000340150003822A0002B1800C\r
+:10273000000262210002A43E0003F0010002B30483\r
+:102740000002B6F0000244460002B1080002611423\r
+:1027500000036A600003400A0002B0010002B102F7\r
+:102760000002B2000002B3010002A02B0003F0023D\r
+:102770000003E8200003C13B00036A680002B001C7\r
+:1027800000001241000240090003F0010003E820AC\r
+:102790000002B0130002B102000382260003E830F9\r
+:1027A00000036A700003402D00006211000012282F\r
+:1027B0000002BF4000024F4F0003F0030002A0CE12\r
+:1027C0000003F0010002B2080002B0210002B102D1\r
+:1027D0000002B30100036A7400000A2B0002B0017A\r
+:1027E0000003FF00000241100002A41E0003F005D8\r
+:1027F0000002B1040002B2000002B3020003F404BC\r
+:102800000003F0030002B1020002B20F0002B301A4\r
+:1028100000036A7800034A7C0003FF000002B00155\r
+:102820000002B1020002B30400036A7C00000A2B1C\r
+:102830000003FF000003FF000002411E0002A41E6F\r
+:1028400000020A54000002130003FF000003FF000F\r
+:102850000002C00E00008213000231D000000226E8\r
+:102860000003400A0003400D0002A00E0003F00523\r
+:102870000002B00200024005000380040003F404DB\r
+:102880000003F0030002B0080002400900038000CA\r
+:102890000002B103000268010000022B0003FF00E8\r
+:1028A0000003FF000002400E0002A40E0003F00B24\r
+:1028B000000012280002B0230002B1030002B3019D\r
+:1028C00000036A7400034A7C0003FF000002B001A9\r
+:1028D0000002B1040002B30400036A7C00034A64EE\r
+:1028E0000002B480000011EF000240040002600802\r
+:1028F0000003A2220002B30100036A6400023095C3\r
+:10290000000230A2000001FF0003FF000003FF00EF\r
+:102910000002A00E0003F04E0003402C0002BC0495\r
+:102920000003DCC00002BFC00002A0DE0003F00113\r
+:102930000002BF800003D8F000038CE40002BF3F18\r
+:1029400000024B1F00022F0B0003E8F00000F9FF0C\r
+:10295000000002130003FF000003FF000002C00E8E\r
+:102960000000821300005A2B00007A250002B808EC\r
+:1029700000024ABE0002A0AE0001CA780003AAB05D\r
+:1029800000024AAE0003F04300022D680003F40089\r
+:102990000001CA7400034A700002BA880002B970CC\r
+:1029A0000002A0F80003F0430003C12A0003F40072\r
+:1029B0000001CA720003ABB200024BBE0002A0BE0F\r
+:1029C0000003F0410003C12900036A700002330BC9\r
+:1029D0000002B0FF0002B1BF0003C1200003686025\r
+:1029E00000000A12000002130003402E0003FF0043\r
+:1029F0000002A00100020A8C0002B001000241089E\r
+:102A00000003F005000002400003FF000003FF0088\r
+:102A10000002A00E00020A8C00034A7400007A280B\r
+:102A20000003FF000003FF000003C12F00036A74CE\r
+:102A3000000231D0000002260003400A0003400DCE\r
+:102A40000002A00E0003F0050002B00800024005DD\r
+:102A5000000380000003F4040003F0030002B02030\r
+:102A6000000240090003A0000002B1430002680117\r
+:102A70000000022B0003FF000003FF000002400ED5\r
+:102A80000002A00E00020ABC000012280002B0439F\r
+:102A90000002B1040002B30100036A7400034A7C1F\r
+:102AA0000003FF000002B0010002B1050002B30400\r
+:102AB00000036A7C00034A640002B480000011EF46\r
+:102AC00000024004000260080002B8200002600812\r
+:102AD0000002B8BF000240080003A2220002B104B5\r
+:102AE0000003C13E00036A640003F4040003F0081D\r
+:102AF00000034A640002B480000011EF00024004A9\r
+:102B0000000260080003A2220002B30100036A640D\r
+:102B100000023095000230A200005A2B0002BA01D8\r
+:102B20000003FF0000024BBA0002A0BA0003F0420B\r
+:102B30000003F4000001CAE5000042100002B001E9\r
+:102B40000002A0DE0003F041000380020002400802\r
+:102B50000003F0020003F4000001CAE50003400A8C\r
+:102B60000003FF000002B040000241080002A01074\r
+:102B700000020AE5000002260003FF000003FF0038\r
+:102B80000002C00E000082260002B1020002A40171\r
+:102B900000020A11000001EF000041F90003FF00EC\r
+:102BA0000003FF000003D8000003DC8000007A412E\r
+:102BB0000002B0000003D8010002B0010003DC01F4\r
+:102BC0000002308C000002130003FF000003FF002E\r
+:102BD0000002C00E00008213000231D00003400A40\r
+:102BE0000002B0800003FF00000240090003A004BF\r
+:102BF0000002B103000268010000022B0003FF0085\r
+:102C00000003FF000002400E0002A40E0003F00BC0\r
+:102C1000000012280002B0430002B1050002B30117\r
+:102C200000036A7400034A7C0003FF000002B00145\r
+:102C30000002B1060002B30400036A7C00034A6488\r
+:102C40000002B480000011EF00024004000260089E\r
+:102C50000003A2220002B3010002B10000036A6473\r
+:102C600000023095000230A200005A2B0002BA0385\r
+:102C70000002B9010003FF00000248BA0002A48963\r
+:102C80000001CB570002B9040003FF00000248BA5C\r
+:102C90000002A08A0001CB39000002250002B20820\r
+:102CA0000002B3000003FF000002A4020001CB57A2\r
+:102CB0000002A00E0003F04300009A250003F40078\r
+:102CC0000001CA5400024BB90002A0B90001CB5761\r
+:102CD000000092250003F4000001CA540003F40030\r
+:102CE0000001CB57000042100002B0010002A0DE3C\r
+:102CF0000003F04100038002000240080003F002DC\r
+:102D00000003F4000001CB570003402E0003FF0036\r
+:102D10000002B008000241080002A01000020B5798\r
+:102D20000002B080000241080003F00500000240EC\r
+:102D30000003FF000003FF000002A00E00020B577B\r
+:102D4000000002250003FF000003FF000003E8105D\r
+:102D500000008A250002A40E00020A5400005A2B2B\r
+:102D60000003FF0000034A700003FF0000024BBE97\r
+:102D70000002A0BE0003F0420002B28000036A70AD\r
+:102D8000000061F9000059EF0003FF000003DCC000\r
+:102D90000003D8B000007A410002B0000003D8015F\r
+:102DA0000002B0010003DC010003400D0002BD4041\r
+:102DB0000003FF0000024DD50002A6DE0003F00371\r
+:102DC00000022F2B0003F4040003F00A0002B07F7E\r
+:102DD0000002B1FF0002B2FF000368600003686BED\r
+:102DE000000011E50002B3C00003E8D00003604C0E\r
+:102DF00000022F660002B0010003E8100003E82083\r
+:102E00000003E83000036A60000231D00003EC00E8\r
+:102E100000006A3F0003FF000003FF000002A0DE85\r
+:102E20000003F0030002BB530003F4000003F04171\r
+:102E30000002BB5B0003FF000003FF000000D9FCA1\r
+:102E4000000340100002BB0F000348290002A0DE6F\r
+:102E50000003F0410003482D0002BF040002400BB4\r
+:102E60000003AB0200030FFB00038CF600026CCFE3\r
+:102E700000038FF6000349E80002A34C0003F004AE\r
+:102E80000003044C0003055F0003F4000003F04559\r
+:102E9000000384E6000385560003A556000265542E\r
+:102EA0000002644E0003C1040003C1150002A0DE4D\r
+:102EB0000003F00400036829000369E80003F4003C\r
+:102EC0000003F0420003682D000369EC0003E800F2\r
+:102ED0000002304F000348010002B0BF000244402E\r
+:102EE000000368010003E8000002B1400003E8208D\r
+:102EF0000003E83000036A440002B0010003E81058\r
+:102F00000003E8200003E83000036A600002BF020B\r
+:102F1000000231D500000A3B0000120C00001A0B21\r
+:102F20000002B0020002A0DE0003F0410002B00483\r
+:102F300000038116000260010003822A0002B184AE\r
+:102F4000000262210002A43E0003F0010002B3046B\r
+:102F50000002B11800036A600003400A0002B001D9\r
+:102F60000002B1020002B2120003E83000036A68F6\r
+:102F70000002B08000001241000240080003F0018E\r
+:102F80000003E8200002B0130002B1020003822611\r
+:102F90000003E83000036A700002B0210002B102B1\r
+:102FA0000002B2010002B30100036A740002B00122\r
+:102FB0000002B1020002B20F0002B30100036A78FE\r
+:102FC00000034A7C0003FF000002B0020002B102CD\r
+:102FD0000002B30400036A7C0003E8000003C000A1\r
+:102FE0000002B1BF0003C120000368600003E87065\r
+:102FF00000034A640002B4800002400400036A64D3\r
+:1030000000034A640002B480000011FC0002400486\r
+:103010000002B403000260040002B31000036A64FB\r
+:103020000002309500034A640002B40800024440E4\r
+:10303000000267740002A57E00020C3C0003E80059\r
+:103040000002304F0002A0DE0003F0040003482A13\r
+:10305000000349E80003F4000003F0420003482E97\r
+:10306000000349EC0002BC110002BF100002C99F1E\r
+:103070000002C88C0003C1080003C1190002A0DED1\r
+:103080000003F0040003682A000369E80003F40069\r
+:103090000003F0420003682E000369EC0002BB014C\r
+:1030A0000000DA3E0003E87000038BE500038BB6F6\r
+:1030B0000002A58B0003F0020003F4000001CBFC2A\r
+:1030C000000340120000F1F40002BF200002A0DE65\r
+:1030D0000003F00300026AAF0003F4000003F041B4\r
+:1030E00000026BBF000360120003F4000001CC3C3F\r
+:1030F0000002B0010003E8100003E8200003E830FC\r
+:1031000000036A6000034A640002B48000024004C5\r
+:1031100000036A640003EC0000006A3F0003E8005B\r
+:10312000000081D90002B008000081FB0002A0DE8F\r
+:103130000003F003000059F10003F4000003F04124\r
+:10314000000059F00002B07F0002A1FE0003F04130\r
+:1031500000024BB00000D9EF0002B0FF0002B1BF87\r
+:103160000003C120000368600002B0010003E81002\r
+:103170000003E8200003E83000036A6000000A3B17\r
+:103180000000120C00001A0B0002B0020002A0DEC8\r
+:103190000003F0410002B004000381160002600148\r
+:1031A0000003822A0002B180000262210002A43ED4\r
+:1031B0000003F0010002B304000340150002B1084F\r
+:1031C0000002B6F0000244460002611400036A6087\r
+:1031D0000002B0010002B1020002B2000002B3021C\r
+:1031E00000036A68000011FB0002B0130002B10284\r
+:1031F000000382260003E83000036A7000001228F2\r
+:103200000002B0210002B1020002B30100036A749F\r
+:103210000002B0010002B1020002B20F0002B301CD\r
+:1032200000036A7800034A7C0003FF000002B0013B\r
+:103230000002B1020002B30400036A7C0002BC0475\r
+:103240000003DCC0000079EF000061FB0002BB1846\r
+:103250000003D8F000022F0B000001D90003402525\r
+:103260000002BF100002C00E000081D900024F5FB3\r
+:103270000003F00300022D680003F4000001CCA954\r
+:103280000002BF080002A00E0003F0010003C1FE0F\r
+:103290000002330B00034A800002A0FE0003F0414D\r
+:1032A00000036A84000061EF0002B0800003E8F0D0\r
+:1032B0000002A1C00003F0410003C1FE00022D1B6B\r
+:1032C000000231D0000011EF0003E8100002B0232B\r
+:1032D0000003A2220002B30100036A6400023095D9\r
+:1032E000000061D9000001EF000009F90003402649\r
+:1032F0000002B2100003D8000003DC10000079FBCC\r
+:103300000002B0000003D8010002B0010003DC019C\r
+:10331000000242290003F0450003AFF00002A0CEF6\r
+:103320000003F0020003FB000003FB010003D09E3A\r
+:103330000003FB000002A52E0003F0010003FB00C8\r
+:103340000003D49F0003FB010002A52E0003F0013F\r
+:103350000003FB0100030FFE00020CCB000001D9AB\r
+:103360000003FF000003FF000002C00E000081D92F\r
+:10337000000061EF0002B0800003C1FE0002A1C0A6\r
+:103380000003F0410003E8F000022D1B000231D0E1\r
+:10339000000011EF0002B0030003E8100003A222B6\r
+:1033A0000002B30100036A6400023095000230A2FB\r
+:1033B00000034025000001D90002B1030002B20859\r
+:1033C0000002B310000243350003F0020002422560\r
+:1033D0000003F0020002A5010001CC96000061F993\r
+:1033E000000059EF0003FF000003DCC00003D8B069\r
+:1033F0000002B0000003D8010002B0010003DC01AC\r
+:10340000000079FB0003400D0002BD400003FF00F7\r
+:1034100000024DD50002A6DE0003F00300022F2BB0\r
+:103420000003F4040003F00A0002B07F0002B1FFC1\r
+:103430000002B2FF000368600003686B000011E542\r
+:103440000002B3C00003E8D00003604C00022F6606\r
+:103450000002B0010003E8100003E8200003E83098\r
+:1034600000036A60000231D00003EC000002BC11CE\r
+:103470000002A0DE0003F004000348CC000348D1A2\r
+:103480000003F4000003F042000348EC000348F19D\r
+:1034900000022D530002A0DE0003F004000368CCFC\r
+:1034A000000368D10003F4000003F042000368EC5D\r
+:1034B000000368F10002A0DE0003F004000348D41A\r
+:1034C000000348D90003F4000003F042000348F46D\r
+:1034D000000348F900022D530002A0DE0003F004AF\r
+:1034E000000368D4000368D90003F4000003F0422D\r
+:1034F000000368F4000368F90002A0DE0003F00393\r
+:10350000000348DC0003F4000003F041000348FC22\r
+:103510000002A0FE0003F0040002C00C0002C11C67\r
+:103520000003F4000003F0420003000C0003011C40\r
+:103530000002A0DE0003F003000368DC0003F400D7\r
+:103540000003F041000368FC0003EC000002A0FE51\r
+:103550000003F00A0002C00C0002C11C0002C22CD1\r
+:103560000002C33C0002C44C0002C55C0002C66CF1\r
+:103570000002C77C0003F4000003F0480003000CC5\r
+:103580000003011C0003022C0003033C0003044C55\r
+:103590000003055C0003066C0003077C0003EC00DD\r
+:1035A0000002B07F0002B1FF0002B2FF00036860BA\r
+:1035B0000003686B000009E50003E8000003A003B6\r
+:1035C0000003DC000003D810000340310002BF03F9\r
+:1035D0000002BC020002A6FC0003F0410003C10788\r
+:1035E0000002A0FC0003F0410003C1060002A0FE9F\r
+:1035F0000003F0410003C1050002A1FE0003F041F9\r
+:103600000003C1040003C1100003C1200003C13046\r
+:103610000003FE000003D41E0003686B0003FB00E0\r
+:1036200000030FFE00020D75000340350002BF03CA\r
+:103630000003FF000002A6FC0003F0410003C107E5\r
+:103640000002A0FC0003F0410003C1060002A0FE3E\r
+:103650000003F0410003C1050002A1FE0003F04198\r
+:103660000003C1040003C1100003C1200003C130E6\r
+:103670000003FE000003D41E0003686B0003FB0080\r
+:1036800000030FFE00020D8D000340380003403D93\r
+:103690000003FF0000036A8400036A810003EC005A\r
+:1036A00000036150000361550003615A0003615F2C\r
+:1036B000000348540003FF000003E8300003A33375\r
+:1036C000000368540003686B000348550003E800DA\r
+:1036D0000003E8700002B2EF0002B1FF0002B0BFC9\r
+:1036E000000368600003686B0003497C0002B404B7\r
+:1036F000000261140003697C0003493C0003FF00E1\r
+:103700000002611E0003693C00034A940003413932\r
+:103710000003FF000003FF000002A6370003F007CC\r
+:103720000002A6260003F0050002A6150003F00320\r
+:103730000002A5040003F00100036138000360FCEF\r
+:103740000003FF000003FE000003FF0000034864C5\r
+:103750000002B410000242240002A0240003F0433F\r
+:1037600000022E150003F4000001CDD00002B0FFCE\r
+:103770000002B1FF0002B2FF0002B3FF00036A9033\r
+:103780000003493C0003C04E000241140003693CA1\r
+:10379000000348540002B53F00024353000368543D\r
+:1037A0000003E800000081F40000821A0000821B80\r
+:1037B0000003486400038CEA0000F21500024C0C80\r
+:1037C0000003F048000348340003FF0000038008B2\r
+:1037D0000003A00C0002A00E0003F80100020DF18E\r
+:1037E000000082150003F803000348550003E800B9\r
+:1037F00000038707000368550003493D0002BF101E\r
+:103800000002444F0003F0040002BFFF00022E7BC1\r
+:103810000002BF5000022E7B0003A7700003077E4A\r
+:1038200000020E070003C0200003C0100003C00008\r
+:10383000000368600003686B0003A0100003686069\r
+:1038400000034150000341550003415A0003415F0A\r
+:103850000003EC000003F803000349D00002B8089D\r
+:10386000000249380002A09800020E68000349D403\r
+:103870000002B410000243340002A03400020E44DF\r
+:10388000000348080002B808000260080003680846\r
+:10389000000348280002B820000263380003482DC6\r
+:1038A00000036828000369E8000267780003682DB8\r
+:1038B000000369ED000348C80002B8FB000242287B\r
+:1038C000000368C8000348980002B820000260089E\r
+:1038D000000348B10003689800026448000368B11F\r
+:1038E0000003C10E0003C11E0003C12E0003C13E30\r
+:1038F00000036330000363700003633400036374E8\r
+:1039000000036338000363780003F4000001CE680D\r
+:10391000000348080002B8F70002400800036808E6\r
+:10392000000348280002B8DF000243380003482D96\r
+:1039300000036828000369E8000247780003682D47\r
+:10394000000369ED000348C80002B80400026228C1\r
+:10395000000368C8000348980002B8DF000240086E\r
+:10396000000348B10003689800024448000368B1AE\r
+:103970000002B0030003C1100003C1200003C130E6\r
+:103980000003633000036370000363340003637457\r
+:103990000003C12E0003C13E0003633800036378B7\r
+:1039A0000003497C0002B4FB000241140003697C5F\r
+:1039B0000003686B0003EC00000348CA0002B00477\r
+:1039C0000002B1400003C12800026820000368CA59\r
+:1039D0000003C182000368CA00026821000368CAAC\r
+:1039E0000003C182000368CA0003EC000003F8036F\r
+:1039F00000030FFE00020E7C0003EC000003E80051\r
+:103A00000003C0100003C0200003A0100003686082\r
+:103A10000003686B0003C10E0003E8100003E820F8\r
+:103A20000003E8300003A4130003D8100003DC40B7\r
+:103A30000003FE000003D41E0003686B000369A4AA\r
+:103A40000003E8000003FE000003D41E0003686BBF\r
+:103A5000000369A40002A0DE0003F003000342603B\r
+:103A60000003F4000003F0410003425C00034259EC\r
+:103A70000002A0DE000369A40003F0030003426813\r
+:103A80000003F4000003F04100034264000369A155\r
+:103A90000003FE000003D41E0003686B0003686B84\r
+:103AA0000003EC000003E8000003C0200003C01086\r
+:103AB0000003A010000368600003686B0003425617\r
+:103AC0000003C10E0003E8100003E8200003E83003\r
+:103AD0000003A4130003D8100003DC400003D41E2D\r
+:103AE0000002BF0200022E7B0003686B000369A482\r
+:103AF000000369A20003E8000003FF000003D41ED6\r
+:103B00000002BF0200022E7B0003686B000369A461\r
+:103B10000003E8000003C0200003C0100003C00041\r
+:103B2000000368600003686B0003EC000003686B2F\r
+:103B30000002B07F0002B1FF0002B2FF0003686024\r
+:103B40000002B10C0003E8000003A0030003DC0046\r
+:103B50000003D8100003E8000003E8100003E82089\r
+:103B60000003E8300003FE000003D41E0003686B6E\r
+:103B70000003FB000003FB00000388E30003F803DD\r
+:103B80000003FE000003D41E0003686B0003FB006B\r
+:103B90000003088E00020EE00003EC00000021FA92\r
+:103BA0000003E8500003E8600003E8700002B90871\r
+:103BB0000002B8C00003DC810003D891000342502A\r
+:103BC0000003F8030003FF0000036A440003E82039\r
+:103BD0000003011E00036A440003FE000003D45FDB\r
+:103BE0000003686B0002B4190003FE000003D45FF9\r
+:103BF0000003686B000349A50003FF000003FF00FA\r
+:103C00000003C1040003C115000382E00002622624\r
+:103C10000003C137000369A40002B9080003099E2C\r
+:103C200000020F07000369A50003EC000002A1BE1B\r
+:103C30000003F00A0003D01E00030FBE0003F803C8\r
+:103C40000003000E0003011E0003022E0003033ECA\r
+:103C50000003D41E00030FFE00020F100003FB0040\r
+:103C600000030CCE00020F0B0003EC000002A1BE0B\r
+:103C70000003F00A0003D01E00030FBE0003F80388\r
+:103C80000002C00E0002C11E0002C22E0002C33E8E\r
+:103C90000003D41E00030FFE00020F200003FB00F0\r
+:103CA00000030CCE00020F1B0003EC000003D09EAB\r
+:103CB0000003D01F0002BC3F0002488C0002499C58\r
+:103CC00000024AAC00024BBC0002440C0002451C3E\r
+:103CD0000002462C0002473C0002BC200002C084C7\r
+:103CE0000003A0000002A3480003F0410002C00C42\r
+:103CF0000002C1950003A1100002A3590003F04186\r
+:103D00000002C11C0002C2A60003A2200002A36A96\r
+:103D10000003F0410002C22C0002C3B70003A3302D\r
+:103D20000002A37B0003F0410002C33C0003E8D083\r
+:103D300000038CE9000304800002E88D0003059174\r
+:103D40000002E99D000306A20002EAAD000307B3EA\r
+:103D50000002EBBD0003626E0002488C0002499C29\r
+:103D600000024AAC00024BBC0003D49E0003426E2A\r
+:103D700000026445000264460002644700020F4DE1\r
+:103D800000006A3F0003FB000003FB0100030FFE7D\r
+:103D900000020F2B0003EC000003D09E0003D01F95\r
+:103DA0000002BC3F0002488C0002499C00024AAC61\r
+:103DB00000024BBC0002440C0002451C0002462CD1\r
+:103DC0000002473C0002BC200002C0840003A000A7\r
+:103DD0000002A3480003F0410002C00C0002C1959C\r
+:103DE0000003A1100002A3590003F0410002C11C0E\r
+:103DF0000002C2A60003A2200002A36A0003F04151\r
+:103E00000002C22C0002C3B70003A3300002A37B50\r
+:103E10000003F0410002C33C0002BC070002A3DC27\r
+:103E20000003F04E0003704C0003504E0003FF00EF\r
+:103E30000003FF000003FE000003D41E0003686BB4\r
+:103E40000003FB000003704E0003504C0003FF0012\r
+:103E50000003FF000003F4040003F0080002BC08A4\r
+:103E60000002A4DC0003F00100036A840002BC0924\r
+:103E70000002A4DC0003F00100036A800002B0FF2E\r
+:103E80000002B1BF0002B2FF000368600003FB0044\r
+:103E90000003FB010002CDDE0002A6DF00020F6678\r
+:103EA00000034A640002B4800002400400036A6414\r
+:103EB0000002B0000002B1000002B2000002B30133\r
+:103EC00000036A740002B0310002B1060002B204BD\r
+:103ED0000002B30000036A7800034A7C0003FF007D\r
+:103EE0000002B0010002B1010002B30000036A7CCD\r
+:103EF00000034A640002B480000240040002B403DC\r
+:103F00000002600400036A640002309500034A6402\r
+:103F10000002B4800002400400036A6400006A3FAB\r
+:103F20000002336C0003EC00000059F60000623E12\r
+:103F30000003FF000002A1BE0003F0420000F1F404\r
+:103F40000003EC000002A1CE0003F04100030BBE11\r
+:103F500000030CCE0000D9F60000E23E00034A4008\r
+:103F600000005A160003FF000003FF000002A0BE7D\r
+:103F70000003F0420003A0000003A2200003D05E73\r
+:103F80000000620A000059F20003A2020002400988\r
+:103F9000000242290002A58E00020FF50003088EE0\r
+:103FA0000002A00D0003F00B000042070002C44F06\r
+:103FB0000003C1540002A0BE0003F0460003D45E1B\r
+:103FC0000002C44F0003C1540003D45E0002C44F7A\r
+:103FD0000003C1540002A5AE0002100500030AAEA2\r
+:103FE0000002A02D0003F00B000052070002C66F74\r
+:103FF0000003C1760002A0BE0003F0460003D45EB9\r
+:104000000002C66F0003C1760003D45E0002C66FD3\r
+:104010000003C1760003D45E00030CCE000210063C\r
+:1040200000026B8A00020FCA0003EC00000342701A\r
+:104030000000521600038FEC000388EA0003AAA0D8\r
+:104040000002A4AE0003F0060002A1480003F04104\r
+:104050000002C4480002A1680003F0410002C668E3\r
+:1040600000038AE00002A64F0003F0430003044867\r
+:1040700000030008000301180002A66F0003F043CC\r
+:1040800000030668000302280003033800030AAE99\r
+:10409000000210190003C1540003C1760003D45E6E\r
+:1040A000000362700003EC000003C1620003066EAF\r
+:1040B0000003DC100003D8000003D09E0003FF00C3\r
+:1040C0000003FF0000024885000268830003C198D6\r
+:1040D0000003C1A80003C1B80003D49E0003FB0085\r
+:1040E0000003066E0002102E0003EC000003C11056\r
+:1040F0000003C1200003C1300002A0DE0003F0086D\r
+:10410000000369080003690C0003691000036914C7\r
+:10411000000369180003691C0003F4000003F04663\r
+:104120000003692000036924000369280003692C47\r
+:1041300000036930000369340003EC000003C11080\r
+:104140000003C1200003C1300002A0DE0003F0071D\r
+:10415000000368CC000368D0000368D4000368D86B\r
+:10416000000368DC0003F4000003F045000368EC82\r
+:10417000000368F0000368F4000368F8000368FCBB\r
+:104180000003EC00000349D40003FF00000380E5B6\r
+:1041900000024103000349D20003FF000002400A6D\r
+:1041A000000349C20002A5100003F001000349C644\r
+:1041B0000003EC000002B07F0002B1FF0002B2FF7A\r
+:1041C000000368600003686B0003E8000003E81068\r
+:1041D0000003C12E0002B330000369A40003E8000D\r
+:1041E0000002B1300003E8200003E8300003E8409B\r
+:1041F0000003A5430003D8400003DC500003FE0089\r
+:104200000003D41E0003686B0003FB000003FB00E7\r
+:104210000002B0120003E8100003FE000003D41EE9\r
+:104220000003686B0003088E000210860003EC0098\r
+:104230000003D09E0003FB000003FF000003FF000B\r
+:104240000003D49F0003FB0100030FFE0002108C4B\r
+:104250000003EC000003F8010002BF0400034A64FD\r
+:104260000003FF000003FF000002410F000210974F\r
+:104270000003F8030003686B0003FF000003FF0066\r
+:104280000003FE000003EC0000034A640003FF008B\r
+:104290000002BF080002410F0002A01F000210C36D\r
+:1042A000000340120002B5100002A5250003F0042F\r
+:1042B0000002BF0200026AAF0003F4000001D0C098\r
+:1042C0000002C4550002A5240003F0040002BF024E\r
+:1042D00000026BBF0003F4000001D0C00002C4451F\r
+:1042E0000002A5240003F0040002BF1000026AAF20\r
+:1042F0000003F4000001D0C00002BF1000026BBF39\r
+:104300000000F1F400036012000230C40003EC006E\r
+:1043100000034A700003FF000003C1C20003402EE7\r
+:104320000002B00100036AA80003FF000003FF00C1\r
+:104330000003FF0000034AAC0002B40200036AA9B4\r
+:104340000003C0000003C0110003C0220003C033FB\r
+:1043500000034AAD0002BF900002A0CF0003F005A9\r
+:104360000003C0440002BF0F00024F4F0003F400DF\r
+:104370000003F0410003C0F40002A0DE0003F00BD4\r
+:10438000000340190003FF000003FF000002644027\r
+:104390000002655100026662000267730003601943\r
+:1043A00000026AAF0003F4000003F0490003401D5F\r
+:1043B0000003FF000003FF0000026440000265519B\r
+:1043C00000026662000267730003601D00026BBF9B\r
+:1043D0000003602E0003EC000002C44600036AA93B\r
+:1043E0000003FF000003FF000003FF0000034AACCE\r
+:1043F0000003EC000002B07F0002B1FF0002B2FF38\r
+:10440000000368600003686B000009E50002B0C0AB\r
+:104410000003DC000003D8100002A0FE0003F0043B\r
+:104420000003E8000003E8100003E8200003E83080\r
+:104430000002A0FE0003F0440002B0550003C110CA\r
+:104440000003C1200003C1300002A0FE0003F004FD\r
+:104450000002B4FF0003C1540003C1640003C1742F\r
+:104460000002A0FE0003F0440002B4AA0003C154FD\r
+:104470000003C1640003C1740002BC070002A3FE74\r
+:10448000000211790000420D0003FF000003FF004D\r
+:104490000002A08E0002113F0002A0DE0003F00324\r
+:1044A000000340420003F4040003F001000340460F\r
+:1044B0000000EA3F00006A0E0002A4DE0003F004E0\r
+:1044C0000003C0880003C0990003C0AA0003C0BB5A\r
+:1044D00000026008000261190002622A0002633BC8\r
+:1044E00000026448000265590002666A0002677BA8\r
+:1044F00000006A3F0003FF000003FF000003FE000E\r
+:104500000003D41E0003686B0003FB0000030CCE05\r
+:104510000003FE000003D45E0003686B0003FB0091\r
+:1045200000030CCE0002113F0000420D0000620E9D\r
+:104530000003FF000002A08E000211640003404A45\r
+:104540000002A4CE0003F0040003C0880003C09959\r
+:104550000003C0AA0003C0BB0002A4DE0003F002F7\r
+:104560000003C18A0003C19B0002BA0F00024AA8DF\r
+:1045700000038BA600026AAB0002BBF000024BB83E\r
+:104580000003A7B600026BB70003F4040003F003B6\r
+:104590000003E8600003E8A00003E8B00002B4F004\r
+:1045A0000002604A0003C1100003C1200003C130B3\r
+:1045B00000036A840002A0FE0003F0030002B4F0CE\r
+:1045C0000003F4040003F0010002B40F0002604B8A\r
+:1045D0000003C1100003C1200003C13000036A8042\r
+:1045E0000003EC000003FE000003D41E0003686B10\r
+:1045F0000003FB0000030CCE0002B9030002A0F987\r
+:104600000003F0440003E8400003E8500003E860C2\r
+:104610000003E8700003FE000003D45E0003686B33\r
+:104620000003FB0000030CCE000211850002B0F075\r
+:104630000002B1FF0002A0F90003F0420003E8000D\r
+:104640000003E8100003C1210003C13100036A84A4\r
+:1046500000036A800003EC000002B07F0002B1FF9B\r
+:104660000002B2FF000368600003686B000009E508\r
+:104670000002B0C00003DC000003D8100002B4FF49\r
+:104680000003C1640003C1740002BC070003FE0004\r
+:104690000002B5FF0003D45E0003686B0003FB005B\r
+:1046A00000030CCE0003FE000002B5EF0003D45E51\r
+:1046B0000003686B0003FB0000030CCE000211A393\r
+:1046C0000002B5FF00036A850002B0F00003C110CC\r
+:1046D0000003C1200003C13000036A8000034A6266\r
+:1046E000000231D00003E8F0000231DC00036A620E\r
+:1046F000000009E50002B0C00003DC000003D81090\r
+:104700000002B4FF0003C1540003C1640003C1747C\r
+:104710000002BC070003FE000003D45E0003686BC8\r
+:104720000003FB0000030CCE000211C50002B0FF25\r
+:104730000002B1BF0003C120000368600003EC0069\r
+:1047400000034A640002B4800002400400036A646B\r
+:104750000003EC000002B0040002A0F00003F0032C\r
+:10476000000230FD0003F4040003F00100022D6894\r
+:104770000003E8000003C0000003C1100002B2FD06\r
+:104780000003686000000A3B0000320C00001A0BB6\r
+:104790000002B00A0002A0DE0003F0410002B00CEB\r
+:1047A00000038116000260010002B1160002A43E5F\r
+:1047B0000003F0010002B3040003866A0002B202A3\r
+:1047C0000002B4040002A3FE0003F0030002A0F400\r
+:1047D0000003F0010002B2040002622600036A60D6\r
+:1047E00000038FE100022E7B0003686B0003FF00D3\r
+:1047F0000003FE000003EC0000034A600003FF001A\r
+:104800000003E8300002600E00036A6000034A649F\r
+:104810000002B4F20002400400036A640003EC00EA\r
+:1048200000006A3F000340040003FF000002B804D8\r
+:10483000000245E00002A05E0003F0440002A0DE9A\r
+:104840000003F042000340240003FF00000061F871\r
+:104850000003FF000003FF000003DCC000038FEA39\r
+:104860000002A0DE0003F0010003E8F00003D8F02E\r
+:1048700000038CE40003C1B20003493D0002A0DE46\r
+:104880000003F041000349410003FF000002446EB1\r
+:104890000003F0010002BC07000240080003F043DF\r
+:1048A00000022F0B0003F4000003F04100022F1B55\r
+:1048B0000002446E0003F0090003E8C00003AB628D\r
+:1048C0000003A5600002455E0003F04300022F0BC9\r
+:1048D0000003F4000003F04100022F1B0003EC0072\r
+:1048E000000348C0000348C50003E8100003E85077\r
+:1048F0000002A0DE0003F008000368C000000231DF\r
+:1049000000000A300003FF000003FF00000368C03E\r
+:104910000003F4000003F046000368C50000222FE6\r
+:1049200000002A2E0003FF000003FF00000368C5FB\r
+:104930000003EC0000006A3F0003FF000003FF00DB\r
+:10494000000051F90002A0DE0003F003000059F15D\r
+:104950000003F4000003F041000059F00003FF00E1\r
+:104960000003DCA00003D8B0000340060003FF00F2\r
+:104970000003FF00000240E80003F0030002A0DE95\r
+:104980000003F041000340260003FF000003FF0086\r
+:10499000000349410002A00E0003F0430002A0DE24\r
+:1049A0000003F0410003C1450002454E0003F043FF\r
+:1049B00000038CE40003F4000003F04100038CE3E7\r
+:1049C000000389980003AA9C0002A0AE0003F00334\r
+:1049D00000022F0B0003F4000003F04100022F1B24\r
+:1049E000000340060003FF000003FF0000034941ED\r
+:1049F0000002408E0002A00E0003F0430002A0DE81\r
+:104A00000003F0410003C1450003E8C00003AB42CE\r
+:104A10000002454E0003F0070003A5400002455E7A\r
+:104A20000003F04300022F0B0003F4000003F041E9\r
+:104A300000022F1B0003EC000002A0DE0003F003C5\r
+:104A4000000348210003F4000003F041000348255F\r
+:104A50000003FF000002BB010003A26600038166A1\r
+:104A60000003A11600038776000260270003000BF5\r
+:104A70000003A70600038206000266210002A0DEF2\r
+:104A80000003F0040003682100036A890003F400B6\r
+:104A90000003F0420003682500036A8D0003EC0068\r
+:104AA00000038FED00022E7B0003E830000382E05C\r
+:104AB0000003E8100003E8000003683000038FEDF6\r
+:104AC00000022E7B0003E8F0000349700003E87049\r
+:104AD0000002B6010003C1510003C1400003683168\r
+:104AE0000002B8FC0003C1530003C1420002455854\r
+:104AF00000034974000232F8000368310003C15119\r
+:104B00000003C140000232F8000368310003C153C2\r
+:104B10000003C14200034998000232F800036831E3\r
+:104B20000003C1510003C140000232F800036831A4\r
+:104B30000003C1530003C1420003499C000232F844\r
+:104B4000000368310003C1510003C140000232F884\r
+:104B5000000368310003C1530003C142000348E869\r
+:104B6000000232F8000368310003C1510003C14064\r
+:104B70000002B710000232F8000368310003C1538D\r
+:104B80000003C142000232F8000368310003EC0068\r
+:104B90000003493D0002B008000240040003F00594\r
+:104BA00000034AA40003FF000003FF000002B20359\r
+:104BB00000036AA40002B004000241040002A01035\r
+:104BC0000003F046000348C0000348C50002B103DB\r
+:104BD0000002B503000368C0000368C50003EC00D1\r
+:104BE0000003FF000003FF000003FF000003EC00D0\r
+:104BF0000003614800036141000361460003627FD6\r
+:104C00000003C10E0003E8100003E8200003E830B1\r
+:104C1000000368E80003E8000003FF00000368E801\r
+:104C2000000341480003FF000003EC000002B07FD6\r
+:104C30000002B1FF0002B2FF000368600003686B6E\r
+:104C4000000009E50003E8000003A0030003DC0006\r
+:104C50000003D8100002BC030002B0F70002A0FE5F\r
+:104C60000003F0410002B07F0003C1100003C12027\r
+:104C70000003C1300002B4FF0003C1540003C1644B\r
+:104C80000003C1740003FE000003D41E0003686B20\r
+:104C90000003A0010003A1110003A2210003A3311E\r
+:104CA0000003FB000003FE000003D45E0003686BFA\r
+:104CB0000003FB0000030CCE000213210002B0FF32\r
+:104CC0000002BC080003C1100003C1200003C13072\r
+:104CD00000036A800002A4FE0001D33B0002A0FC96\r
+:104CE0000003F00200036A840003EC000002B0F746\r
+:104CF0000003A1010003A2110003A32100036A84A1\r
+:104D00000003EC000003493D0003FF000002B880EF\r
+:104D1000000264480003693D0002B0010002B102D4\r
+:104D20000002B23F0002422F0002B30000036A6893\r
+:104D30000002B0000002B1000002B2000002B302A3\r
+:104D400000036A740002B1010002B2080002B3005D\r
+:104D500000036A780002B0010002B20000036A7C1E\r
+:104D6000000011EF0002B0C00002400F0003A002DB\r
+:104D70000002600E0002B1000003A2220002B30193\r
+:104D800000036A640002B0FF0002B1BF0003C1204B\r
+:104D9000000368600003FF000003FF00000230957D\r
+:104DA0000002B87F000244480003693D0003EC00A4\r
+:104DB0000003E8000003E8100002B2030002B300A1\r
+:104DC000000368300003EC000003E8000000823FAD\r
+:104DD000000222FA0000F23F000222FA000233A889\r
+:104DE00000022E6E000349980002B4F7000241143D\r
+:104DF000000369980003C12E0003E8300003683007\r
+:104E000000000217000381E00003E8400002A00157\r
+:104E10000003F0010003C14E000234B20003480851\r
+:104E20000002B8FE00024118000368080003E80011\r
+:104E30000000823F0002245A0000F23F0002245A80\r
+:104E400000000217000381E00003FF000002A4102D\r
+:104E50000003F0020003C14E000234B2000234022B\r
+:104E60000003402C0002B8400002B9800002BBFFE2\r
+:104E700000034AA5000248180003F0010002BBCF5E\r
+:104E8000000249190003F0020002BA3F00024BBAC7\r
+:104E90000002455B00036AA50003F4000001C26C38\r
+:104EA000000349D10002B840000244780003844066\r
+:104EB0000003489C000385E20002600400026005D4\r
+:104EC0000003689C000368A0000368B4000368B88E\r
+:104ED00000034938000385E10003C0550002422564\r
+:104EE0000003693800036A5C0003A0E1000381E16C\r
+:104EF0000003E830000382E8000385E50002302A61\r
+:104F0000000343A6000380E80003FF000002488579\r
+:104F1000000268800003C1980003C1A80003C1B863\r
+:104F2000000363A6000363E60003E8000003E8D083\r
+:104F30000002303B0003C1DE0002303B0002306162\r
+:104F4000000384E20003C1C90003E800000381E11B\r
+:104F5000000383E40002C2310003022E0002C33EBC\r
+:104F6000000244490003F001000383E50003E85018\r
+:104F70000002302A000380EA0002302A000388E59C\r
+:104F8000000384E00002444C0003F002000388E4C4\r
+:104F90000002C88E0003C1980003C1A80003C1B875\r
+:104FA0000003632A0003636A00023061000381E2A8\r
+:104FB0000003A0E10003A396000382E40002C22ED6\r
+:104FC0000003E8500002302A0003A0E30002302A68\r
+:104FD00000023061000380E5000240A00003C11020\r
+:104FE0000003C1200003C130000364A8000364E88B\r
+:104FF000000380E0000282080002420200038224D3\r
+:10500000000091E30003EC000002306100034970EE\r
+:105010000002448E0003F0430002B5F30002422573\r
+:10502000000369700003E8700003C16E0003C15300\r
+:105030000003C142000368310002449E0003F006F1\r
+:105040000003499C0003A4E1000262240003C15351\r
+:105050000003C142000368310002448E0003F04D9A\r
+:105060000003499C000384E50003A5E70002400417\r
+:10507000000241150003A488000384400003854614\r
+:1050800000026005000261140003E8300003C12E35\r
+:1050900000036830000343A4000021E30002B50FC1\r
+:1050A0000003FF0000024005000260040003C1107D\r
+:1050B0000003C1200003C130000363A4000363E4C4\r
+:1050C000000381840003A01800038206000260022E\r
+:1050D0000003E8D00002304F0003C1DE0002304F71\r
+:1050E000000348900003A4BA0003A5E7000241159D\r
+:1050F0000002611400036890000368A8000368942C\r
+:10510000000368AC0003A0A60003C1100003C12087\r
+:105110000003C130000364240003646400038AB602\r
+:10512000000348210002B803000266680002B90FBC\r
+:105130000002BBFE000246690002666A0002477B6D\r
+:105140000003682100036A890003682500036A8D53\r
+:1051500000034808000348210002611E000368089C\r
+:10516000000348C80002B8400002B93F00026008CE\r
+:10517000000368C800024009000368C80002655EB9\r
+:105180000003682100036A890003682500036A8D13\r
+:105190000002455B0003682100036A89000368255B\r
+:1051A00000036A8D0003EC000003402C0002B840AD\r
+:1051B0000002B9800003E8B000034AA500024818C5\r
+:1051C0000003F0010002BB30000249190003F002A5\r
+:1051D0000002BAC000026BBA0002655B00036AA558\r
+:1051E0000003489C000348A10002BC7B0002400C65\r
+:1051F0000002444C0003689C000368A1000348B40B\r
+:10520000000348B90002400C0002444C000368B49B\r
+:10521000000368B900034890000384E20003A5E797\r
+:10522000000241150002611400036890000368A8A1\r
+:1052300000036894000368AC00034938000385E16B\r
+:10524000000262250003693800036A5C0003A0E1E4\r
+:10525000000381E1000383E8000382E8000385E5A1\r
+:105260000002302A0003E800000381E1000383E428\r
+:105270000002C2310003E8300003E8500002302A87\r
+:10528000000380EA0002302A000348080003482196\r
+:105290000003A8ED00024118000368080003A8EB12\r
+:1052A000000246680003C03E000245530003682127\r
+:1052B00000036A890003682500036A8D0003E84043\r
+:1052C000000234B20003EC00000349740003C16E15\r
+:1052D0000003E870000388480003C05E000385599E\r
+:1052E0000002422500026228000369740003C142E3\r
+:1052F0000003C153000368310003EC0000034808B9\r
+:105300000002B8FE00024118000368080003485478\r
+:105310000002BC600002622C00036854000349765E\r
+:105320000002BC10000264AC0003C15B0003C16E4C\r
+:105330000003E87000036831000232F800034854AB\r
+:105340000002BC9F0002422C000368540003C14AC3\r
+:1053500000036831000234540003EC000000F1DE69\r
+:105360000000F1DD0003C1FD0003C1CE00034804CD\r
+:105370000003C07E000243370003680400034808AE\r
+:105380000003FF00000384E80002600400036808D3\r
+:1053900000034998000385E20003C055000241154F\r
+:1053A000000384E5000260040003E8300003C12E1E\r
+:1053B000000368300003E8D000022ECB0003F801A0\r
+:1053C0000003400D0003FF000002B0010002400690\r
+:1053D0000002150B0002A0ED0003F0050002BB3E29\r
+:1053E00000024BB60003ABB00003F4040003F00D61\r
+:1053F0000002B0000002B2020003A36A00030BAE79\r
+:105400000002A0300003F00700030BBE0002A03E24\r
+:105410000003F00400030BBE0002A0320003F00101\r
+:1054200000030BBE0003F4040003F0010003E8B026\r
+:10543000000348190002B2E0000246620002666BF7\r
+:1054400000036819000349E50003FF0000024662FB\r
+:105450000002666B000369E50003C1AB00022E7F0A\r
+:1054600000022EE70002B40F00034A400003F801D7\r
+:105470000002A4400003F0060002A4410003F0046F\r
+:105480000002A4420003F0020002A043000215370C\r
+:105490000002CAAE0002B0200002A0A00003F0414A\r
+:1054A0000003E8A00002A0AB0002155F000348194A\r
+:1054B0000002B2E0000246620002666A0003681958\r
+:1054C000000349E50003FF00000246620002666A2D\r
+:1054D000000369E50003F404000215180000D1DFA1\r
+:1054E0000002A0DE0002153E0000D1E00002CDDE89\r
+:1054F0000003F404000214EF000041E00003FF0089\r
+:105500000003FF000002A0A8000215650002A1A888\r
+:105510000003F048000348210003038A000383309E\r
+:10552000000267730003682100036A890003F40422\r
+:1055300000021565000348190002B2E0000246624D\r
+:105540000002666800036819000349E50003FF00D4\r
+:105550000002466200026668000369E50003482510\r
+:10556000000303A80003833000026773000368256B\r
+:1055700000036A8D0003F404000215650003401166\r
+:105580000003E8C00000F1F40002B8800002677870\r
+:10559000000360110003C1DF00034998000385E2A6\r
+:1055A0000003C05500024115000369980003E8306C\r
+:1055B0000003C12E00036830000348080003FF0009\r
+:1055C000000384C800026004000368080003F803B5\r
+:1055D0000003EC000003FF000003FF0000006A3F2F\r
+:1055E0000003E80000008219000081DC0002B00125\r
+:1055F0000002B1110002B21000036A440002B110AF\r
+:105600000003E82000036A44000340240002A0DEF7\r
+:105610000003F0030002BB530003F4000003F04159\r
+:105620000002BB5B0000D9FC0002400E0003F04BFF\r
+:10563000000340100002BC040003DCC000038FEA3A\r
+:105640000002A0DE0003F0010003E8F00003D8F040\r
+:105650000002BC090003C1B100022F0B000340246B\r
+:105660000003FF000002BC020002400C0003F04BEC\r
+:10567000000340100002BC040003DCC00002BFC0F5\r
+:105680000002A0DE0003F0010002BF800003D8F09A\r
+:1056900000038CE40003C1B100022F0B0003499802\r
+:1056A000000388E50002B5FD0003C13E0002A0DE54\r
+:1056B0000003F001000383300003C12E00026008E4\r
+:1056C0000002411500036830000348080002B4409E\r
+:1056D000000081F50002600400036808000348012F\r
+:1056E0000002B0BF00024440000368010003E8006C\r
+:1056F0000002B1400003E8200003E83000036A44E0\r
+:105700000003402E0002B0010003E8100003E8206F\r
+:105710000003E83000036A6000022D680002B00157\r
+:105720000002B1020002B2060003E83000036A681A\r
+:10573000000012410002B0130002B10200038226F1\r
+:105740000003E83000036A700002B0210002B102D9\r
+:105750000002B2040002B30100036A740002B00147\r
+:105760000002B1020002B20F0002B30100036A7826\r
+:1057700000034A7C0003FF000002B0000002B100F9\r
+:105780000002B30400036A7C0002BF180002365115\r
+:105790000002367E0002BF00000231D500034A70CD\r
+:1057A0000003FF000003FF000002B29000036A70D4\r
+:1057B0000002BF13000236510002367E000340246F\r
+:1057C0000003FF000003FF000002400E0003F04B47\r
+:1057D000000340100002BC040003DCC000038FEA99\r
+:1057E0000002A0DE0003F0010003E8F00003D8F09F\r
+:1057F0000002BC0900038B1000022F1B0003402491\r
+:105800000003FF000002BC020002400C0003F04B4A\r
+:10581000000340100002BC040003DCC00002BFC053\r
+:105820000002A0DE0003F0010002BF800003D8F0F8\r
+:1058300000038CE400038B1000022F1B00034A704E\r
+:105840000003FF000003FF000002B28000036A7043\r
+:105850000002BF18000236510002367E0002BF006F\r
+:10586000000231D500034A700003FF000003FF006F\r
+:105870000002B29000036A700002BF1300023651AA\r
+:105880000002367E000340240003FF000003FF00F7\r
+:105890000002400E0003F04B000340100002BC0465\r
+:1058A0000003DCC000038FEA0002A0DE0003F00169\r
+:1058B0000003E8F00003D8F00002BC090003C1B106\r
+:1058C00000022F0B000340240003FF000002BC0273\r
+:1058D0000002400C0003F04B000340120002BC0425\r
+:1058E0000003DCC00002BFC00002A0DE0003F00124\r
+:1058F0000002BF800003D8F000038CE40003C1B9AC\r
+:1059000000022F0B0002B0010003E8100003E820A2\r
+:105910000003E83000036A6000034A640002B480B8\r
+:105920000002400400036A64000021F50003FF0048\r
+:10593000000348080003FF000003C10400036808D7\r
+:105940000003EC000003E8000003C0000002B1BF48\r
+:105950000003C120000368600002B0010003E810EA\r
+:105960000003E8200003E83000036A6000034A6493\r
+:105970000002B4800002400400036A6400000A3B95\r
+:105980000000120C00001A0B0002B0020002A0DEA0\r
+:105990000003F0410002B004000381160002600120\r
+:1059A0000003822A0002B184000262210002A43EA8\r
+:1059B0000003F0010002B3040003C11F00036A608A\r
+:1059C00000034A640002B480000011FC000240049D\r
+:1059D0000002B403000260040002B31000036A6412\r
+:1059E000000230950002BF0800024FF00003F001F2\r
+:1059F0000000F2190003EC00000002190003FF0090\r
+:105A00000003FF000002A50E0003F0010003EC00FC\r
+:105A10000003E80000008219000340120003FF00A9\r
+:105A20000003FF000002448E0002A04E0003F001BC\r
+:105A30000000F1F40002BF400002A0DE0003F0030A\r
+:105A400000026AAF0003F4000003F04100026BBFE4\r
+:105A500000036012000230C4000079DC0003FF0084\r
+:105A6000000340280002A0FE0003F0410003EC0008\r
+:105A70000002A0DE0003F0050002C00E0003F041AA\r
+:105A80000002C11E0003F4000003F0430002C22E16\r
+:105A90000003F0410002C33E000360280000F1DC77\r
+:105AA0000003EC000000021400000A4000006A3FFE\r
+:105AB0000003FF00000240010002A00E0003F001FD\r
+:105AC0000003EC000003489C000348A100034A4A7D\r
+:105AD0000002A0DE0003F043000348B4000348B90D\r
+:105AE00000034A4E0002BC100002622E0002666EE5\r
+:105AF0000002688C0002699C0002A0DE0003F00531\r
+:105B00000003689C000368A100036A4A0003F400D4\r
+:105B10000003F043000368B4000368B900036A4E51\r
+:105B20000003E8C00000E1DB0002B0100002B10099\r
+:105B30000002B2100002B300000362740002B080E1\r
+:105B40000003D8010002B0000003DC010002B01223\r
+:105B50000002B1020002B2120002B302000362743A\r
+:105B60000002B0100002B1120002B2100002B31223\r
+:105B700000036270000362440002B1020002B3023B\r
+:105B80000003624C000362480003402C0003FF0046\r
+:105B90000003FF000003E8200003E8300003602C4E\r
+:105BA0000003E8000003E810000061DB0003601858\r
+:105BB0000003601C0003C18C0003C19C0003C1AC46\r
+:105BC0000003C1BC0002377300023577000061DBBF\r
+:105BD0000003FF000002B0000003DC000002B04040\r
+:105BE00000038FC20002C00F0003D800000340185A\r
+:105BF0000002A0DE0003F0410003401C0003402D22\r
+:105C00000003FF000003D41E0003D45F0002BF00A6\r
+:105C10000003DCF00002BFC0000388C20002CFF81E\r
+:105C20000003D8F00003C4000003C4110003C42221\r
+:105C30000003C4330002B50F000244650003A566EB\r
+:105C40000002A0DE0003F0430002B50F000244751D\r
+:105C50000003A5760003A6420003844A0003A7526E\r
+:105C60000003855A0003C4440003C4660002C00157\r
+:105C70000002C0040002C2230002C2260003C415B1\r
+:105C80000003C4370003D41E0003427500034272B0\r
+:105C90000002BF100002A1040003F0460002A509A3\r
+:105CA0000003F0040003C18C0003C1900003C1ACE9\r
+:105CB0000003C1B00002A3090003F0420003C1AC1D\r
+:105CC0000003C1B000036272000342460002A12635\r
+:105CD0000003F0460002A5290003F0040003C18C74\r
+:105CE0000003C1920003C1AC0003C1B20002A329AA\r
+:105CF0000003F0420003C1AC0003C1B200036246DE\r
+:105D00000003424E0002A1150003F0460002A5194F\r
+:105D10000003F0040003C18C0003C1910003C1AC77\r
+:105D20000003C1B10002A3190003F0420003C1AC9B\r
+:105D30000003C1B10003624E0003424A0002A137D2\r
+:105D40000003F0460002A5390003F0040003C18CF3\r
+:105D50000003C1930003C1AC0003C1B30002A33927\r
+:105D60000003F0420003C1AC0003C1B30003624A68\r
+:105D7000000362740003FB010002B1100002CCCEEC\r
+:105D80000000E1DB0002A0C10001D6E20003427086\r
+:105D9000000342450003FF000002C8020003A88080\r
+:105DA0000002CA460003AAA00003424C0003424975\r
+:105DB0000003FF000002C9020003A9900002CB46C5\r
+:105DC0000003ABB0000237730003EC000003489CF3\r
+:105DD000000348A10002A0DE0003F042000348B423\r
+:105DE000000348B90003C1180003C15A0003899693\r
+:105DF00000038BB6000261190002655B0002A0DEA1\r
+:105E00000003F0040003689C000368A10003F40091\r
+:105E10000003F042000368B4000368B90003EC001B\r
+:00000001FF\r
diff --git a/firmware/radeon/BARTS_me.bin.ihex b/firmware/radeon/BARTS_me.bin.ihex
new file mode 100644 (file)
index 0000000..0058adc
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000C00E0001CC000045CC00004ACC41225CBE\r
+:1001C000CC41A1FCD44DA1FD7C408000A0000000EA\r
+:1001D000CC80004D80000000CC41225DCC00004569\r
+:1001E000CC00004A084C00017C4100007C414000EA\r
+:1001F0001D58FFFF195C03F015600015CD81A102A9\r
+:10020000CDC12256CE01225C94C0000521240020DD\r
+:10021000CE41A1FC8000007B08CC0001CD01A1FCF7\r
+:10022000CC01A1027C408000A0000000CC80004DE9\r
+:100230007C4080007C40C000C02A00027C4100005D\r
+:100240007D2900071C9400011C9800061C9C0300DB\r
+:1002500015DC00087C4200007C4240009540000F05\r
+:10026000C02E000405F022587F2F0007CC3100007B\r
+:10027000C8280004CCC12169CD01216ACE81216B3F\r
+:1002800029B40002CC01216C9740000E29B4000073\r
+:10029000800000BBC834000E29B40002974000095A\r
+:1002A00029B40000C02E000405F022587F2F00075B\r
+:1002B000CC310000C8280004800000BBC834000E08\r
+:1002C000974000047E028000800000BBC834000E0E\r
+:1002D00029B400049740FF4B00000000CE01216DBF\r
+:1002E000CE41216EC8280003C834000E9B40000494\r
+:1002F000C83C000E84000343CC00004D29F40000EC\r
+:10030000974000070430A2B6840000DDCE81A2B77A\r
+:10031000CF81A2C480000000CFC1A2D129F4000186\r
+:10032000974000070430A2BA840000DDCE81A2BB52\r
+:10033000CF81A2C580000000CFC1A2D229F4000263\r
+:10034000974000070430A2BE840000DDCE81A2BF2A\r
+:10035000CF81A2C680000000CFC1A2D30430A2C2C8\r
+:10036000840000DDCE81A2C3CF81A2C7800000003F\r
+:10037000CFC1A2D4C02E00047F2F0007CC310000D3\r
+:10038000C82C0004C03000067EF34023C03000209B\r
+:100390007F6B8020880000007FB3C024CC00004227\r
+:1003A00080000000CC40001F7C40C0007C41000069\r
+:1003B0001914003D994000130414002E8400049D7C\r
+:1003C0000418002984000264C81C00130414002AC5\r
+:1003D0008400049D0418002DCD41A2A4C81C001364\r
+:1003E00095C00000C81C0013CCC12100CD01210123\r
+:1003F000CCC12102CD0121038000049ACD81A2A4A9\r
+:100400001D18100095800005C81C001329E4004049\r
+:100410009640FFFFC81C0013CCC12175CD01217689\r
+:10042000C820001496000000C820001416280001FF\r
+:100430009A800004CC00004F8000049ACC00007F1A\r
+:1004400080000107CCC121757C40C0007C410000C8\r
+:10045000CC000045CC00004A40D40003CD41225CD2\r
+:10046000CD01A1FCC01E00017C42000008CC0001AF\r
+:100470000624000106280002CE1DA1FDCE5DA1FDCF\r
+:1004800098C0FFFACE9DA1FD7C408000A000000036\r
+:10049000CC80004D7C40C0001CD0000114CC000179\r
+:1004A0007C414000950000067C418000CD41216DDB\r
+:1004B000CD81216E80000133C81C0003C0220004DE\r
+:1004C0007E160007CC210000C81C00047C424000BE\r
+:1004D00098C000047C42800080000000CDE5000050\r
+:1004E000CE412169CE81216ACDC1216B80000000FF\r
+:1004F000CC01216C7C40C0007C4100007C4140006C\r
+:100500007C4180007C41C00018A41FE82A68003CA0\r
+:100510009680000A7C0200007C4200003A30000312\r
+:10052000CC0000589B00000342200005042000403E\r
+:100530008000014F7C0240007E0240009A40000093\r
+:100540000A6400011CEC00109AC0000ACC00004DA7\r
+:10055000C02A0004C82C00207E928007CC000041F5\r
+:10056000CC290000CEC0001E8000015FC83000040E\r
+:10057000CD01216DCD41216EC83000037F1F0006E3\r
+:100580001CF40007137800019740002A07B80164A3\r
+:100590009F80000000000000800001747F1B800E1F\r
+:1005A000800001787F1B800F8000017C7F1B800C06\r
+:1005B000800001807F1B800D800001847F1B8011E3\r
+:1005C000800001887F1B80108000018D14A400082A\r
+:1005D0009B80001914A400088000019D1E6400FF88\r
+:1005E0009B80001514A400088000019D1E6400FF7C\r
+:1005F0009B80001114A400088000019D1E6400FF70\r
+:100600009B80000D14A400088000019D1E6400FF63\r
+:100610009B80000914A400088000019D1E6400FF57\r
+:100620009B80000514A400088000019D1E6400FF4B\r
+:1006300014A400081E6400FF2A68003C9A80FE7122\r
+:1006400014EC00087C4340007C4380007C43C000E5\r
+:1006500096C00007CC00004DCF412169CF81216AAF\r
+:10066000CFC1216B80000000CC01216C8000000014\r
+:10067000CFF50000CC0000598400049D2A68003C9E\r
+:100680009A800004C828001780000000D440007F32\r
+:100690009680FFAB7E02400084000296C00E0002EE\r
+:1006A000CC000041800001ABCCC1304A9400000076\r
+:1006B000C83C001C7C40C0007C410000C01E000102\r
+:1006C00015240012C022000296400005C026000436\r
+:1006D000C027FFFB7D250006C02600007DD28006D6\r
+:1006E0007E12C0067D2500077C4140007C418000D1\r
+:1006F000CCC121699A80000CCD01216ACD41216BCA\r
+:1007000096C0FE40CD81216C8400049DCC00007F0A\r
+:10071000C830001A97000000C830001A800000019D\r
+:100720007C4080008400049DCC00007FC81400152C\r
+:10073000C8180016CD41216B96C0FE32CD81216CC8\r
+:10074000800001C2CC00007F7C40C0007C40800063\r
+:1007500014940010115400051C88FFFF1088000538\r
+:100760007C40C00014D000101CCCFFFFC01A000455\r
+:1007700005981BA4CC190000C81800041D980FFF91\r
+:100780007D1900109900FE1F7D8D00109900FE1D3F\r
+:10079000CC000058CC0000598400049DCC81217409\r
+:1007A000C80C001794C0FFFFCC0000598000000166\r
+:1007B0007C408000CC0003E5C82C0020C00E204007\r
+:1007C0000410300020CC226B04143001CC00004116\r
+:1007D000D0110000CCD50000CEC0001EC80C00090E\r
+:1007E00098C00000C80C00097C4100007C4140001A\r
+:1007F000CC0003E7CC0003E8CC0003E9CC40004385\r
+:10080000CC400044D440007F800000007C80C000C9\r
+:100810007C40C00018D001E81128000195000010AC\r
+:1008200006A802099E80000000000000800002214E\r
+:10083000C01208008000022FC81400118000023688\r
+:10084000C81400128000023DCCC1A2A48000024660\r
+:100850001CE8003F8000026E7CC1800B1CD0003F72\r
+:1008600029280006292C00167EAE8007C81C00131C\r
+:100870009A80003D0414002E80000000CCC1A2A488\r
+:10088000C01208007C4140007D0CC007C012000867\r
+:1008900015580003155C000C7C4200007DD1C00699\r
+:1008A000122000147E1E40077E4E8007CE81A2A437\r
+:1008B00080000000CD81A1FEC81400110410211891\r
+:1008C00095400000C8140011D451000080000000C1\r
+:1008D000CCC1A2A4C8140012041021069540000047\r
+:1008E000C8140012D451000080000000CCC1A2A4A2\r
+:1008F000CCC1A2A404100001CD0000198400049D05\r
+:10090000CC00007FC810001B99000000C810001B1D\r
+:10091000800000017C4080002AA000042AA400146A\r
+:100920007E2600070414002E9600000804180029F3\r
+:1009300084000264C81C00130414002A8400049D6F\r
+:10094000040C002DCD41A2A404102100C81C0013EA\r
+:1009500095C00000C81C0013D45100008000049A08\r
+:10096000CCC1A2A48400049D041800298400026460\r
+:10097000C81C00130414002A8400049D0418002DD0\r
+:1009800084000264C81C0013800000017C408000C9\r
+:1009900095C00000C81C0013CD41A2A4CC012100C9\r
+:1009A000CC012101CD812102CD812103CD81A2A4E1\r
+:1009B00088000000CC00004D1D9800017C41000023\r
+:1009C0007C414000998000097C420000C83C003214\r
+:1009D00011980010C81C000B3BFC000197C0FFFFE2\r
+:1009E000C83C003280000280C83C003311980010DF\r
+:1009F000C81C000A3BFC000197C0FFFFC83C003345\r
+:100A00001568001D7D5940079A80000411E4000A12\r
+:100A10007E260007CDC00066CD012158CD41215969\r
+:100A2000CE01215ACCC1A2A49A8002100510000464\r
+:100A3000042C000112F0001D7D71400712E000102F\r
+:100A40002220000CCD012158CD412159CE01215A3F\r
+:100A50008000049ACCC1A2A4043C0005CFC1A2A48A\r
+:100A6000C036000288000000CF4120107C40C0004A\r
+:100A700014D0001D9900000814D4001C9540FD619D\r
+:100A8000C026000422642154CC2500008000000010\r
+:100A9000C82800048000049ACD4000618400049DB1\r
+:100AA0001C7400011C7800029B400003C80C002944\r
+:100AB00084000342C814002B9B8000030410001024\r
+:100AC00084000352CCC1A250CD01A0508400030F7A\r
+:100AD000041804008400049DCC000063C83C002D71\r
+:100AE0008400031DC8100029C81C002F1DDC000154\r
+:100AF000C824002795C00009C8340031C838003028\r
+:100B0000C83C002D537400207FB7802747B805509C\r
+:100B1000CC000062CFFA00009A400000C8240027F1\r
+:100B2000C82800233AA800029A80FFFFC8280023A3\r
+:100B3000C0300001C82800249A800000C828002482\r
+:100B4000CF00005B50D8000814DC0018C03E100035\r
+:100B500021DC80007DFDC007CD812180CDC12181B8\r
+:100B6000C01E002051200008152400187E7E40077A\r
+:100B70001330001E7E7240077D5D4007CE0121824A\r
+:100B8000CE412183CD4121847C408000A000000023\r
+:100B9000CC80004D8400049D1C7400011C78000270\r
+:100BA0009B400003C80C002A84000342C814002C98\r
+:100BB0009B8000030410001084000352CCC1A2608B\r
+:100BC000CD01A0608400030F041809808400049DF7\r
+:100BD000CC000064C83C002E8400031DC810002A0D\r
+:100BE000C81C002F1DDC0001C824002895C0000986\r
+:100BF000C8340031C8380030C83C002E537400207F\r
+:100C00007FB7802747B80554CC000062CFFA0000B8\r
+:100C10009A400000C8240028C82800233AA80002EF\r
+:100C20009A80FFFFC8280023C82800259A8000006A\r
+:100C3000C8280025800002D0C03000020598C000FE\r
+:100C400010DC000814E00018CDD90000C81C0022F8\r
+:100C5000C82400221DDC0FFFCDD900017E624007B1\r
+:100C6000CE590002D8185103D8185104880000004A\r
+:100C7000D81851071BF800F0C03608009780000311\r
+:100C8000C030008088000000C02A0004CF41217CD1\r
+:100C9000CF01217DCD01217E22A8217F04240008DF\r
+:100CA0009A4000000A640001CC290000C82000041A\r
+:100CB0001638001F9B80FFFB0424000888000000FA\r
+:100CC00000000000C82400247C4100009A4000007D\r
+:100CD000C8240024800000017C408000C824002536\r
+:100CE0007C4100009A400000C824002580000001DB\r
+:100CF0007C408000840003427C40C0007C40800037\r
+:100D0000A0000000CC80004DC83C000E97C000033E\r
+:100D1000D30003E688000000043C0005CFC1A2A474\r
+:100D2000CC01A1F48400049DCC00004788000000A1\r
+:100D3000CC00007F840003527C40C0007C408000D7\r
+:100D4000A0000000CC80004D043C0022CFC1A2A432\r
+:100D50008400049DCC00004888000000CC00007F87\r
+:100D60008400035D7C40C0007C408000A000000047\r
+:100D7000CC80004D043C0023CFC1A2A4CC01A1F340\r
+:100D80008400049DCC00004988000000CC00007F56\r
+:100D9000800000007C40C000800000007C40C0005B\r
+:100DA000C01200017C51400780000000D4550000B3\r
+:100DB000CC400065C838002DC83C002EC035E0008E\r
+:100DC000C03200047FB780067FF7C00623B810004A\r
+:100DD00023FC1000CF812154CFC12155CC312155A6\r
+:100DE000C82C0004C81C0025C82400247DE5C007C9\r
+:100DF00099C0FFFEC81C0025800000017C408000D7\r
+:100E00007C40C0007C41000019280030968000081A\r
+:100E1000C8280027C82400289A400000C8240027BA\r
+:100E20009A400000C8240028CC0003E07C41400028\r
+:100E30007C418000151C001FCCC000C7CD0000C83D\r
+:100E400095C00003C01C8000CDC12010E1830000CC\r
+:100E5000055C2000CC00004D80000000DC1F41003C\r
+:100E60007C40C0007C4100007C4140007C4180000F\r
+:100E7000CCC000C9CD0000CAE1830000055CA00021\r
+:100E800080000000DC1F41007C40C0007C4100006D\r
+:100E90007C4140007C418000CCC000CBCD0000CC28\r
+:100EA000E1830000055CE94080000000DC1F410098\r
+:100EB0007C40C0007C4100007C4140007C418000BF\r
+:100EC000CCC000CDCD0000CEE1830000055CE88001\r
+:100ED00080000000DC1F41007C40C0007C4100001D\r
+:100EE0007C4140007C418000CCC000CFCD0000D0D0\r
+:100EF000E1830000055CC00080000000DC1F4100B1\r
+:100F00007C40C0007C4100007C4140007C4180006E\r
+:100F1000CCC000D1CD0000D2E1830000055CF00020\r
+:100F200080000000DC1F41007C40C0007C410000CC\r
+:100F30007C4140007C418000CCC000D3CD0000D477\r
+:100F4000E1830000055CF3FC80000000DC1F410031\r
+:100F5000D44320007C408000A0000000CC80004DE5\r
+:100F6000D443A0007C408000A0000000CC80004D55\r
+:100F7000D443E9407C408000A0000000CC80004DBC\r
+:100F8000D443E8807C408000A0000000CC80004D6D\r
+:100F9000D443C0007C408000A0000000CC80004D05\r
+:100FA000D443F0007C408000A0000000CC80004DC5\r
+:100FB000D443F3FC7C408000A0000000CC80004DB6\r
+:100FC000041CA000CC43A0007C40C000D81FC1007E\r
+:100FD0007C408000A0000000CC80004D041CC000BC\r
+:100FE000CC43C0007C40C000D81FC1007C408000C2\r
+:100FF000A0000000CC80004D7C40C0007C4100007F\r
+:1010000094C000037C4140007C418000CC03F3FC91\r
+:10101000CC43F3FCCC43F3FC7C408000A0000000F8\r
+:10102000CC80004DC01E0010C80C002950D0000814\r
+:1010300010540002800004157D158020C01E002081\r
+:10104000C80C002A50D000080854040011540002B3\r
+:101050007D518020CDC00062D45A00007C408000C9\r
+:10106000A0000000CC80004D7C40C0001CD00003DC\r
+:10107000112800019500000A06A8041F9E800000A8\r
+:101080007C4180008000042D7C41C000800004333E\r
+:101090007C41C000800004397C41C0007C4180005C\r
+:1010A0007C41C00014D400100554A0008000000052\r
+:1010B000CD950000C02200040598A0007DA1800706\r
+:1010C000CC19000080000429C8180004C0220004C4\r
+:1010D000CD8125D6222025D7CC21000080000429EF\r
+:1010E000C8180004CD81216DCDC1216E8000042976\r
+:1010F000C81800037C40C00080000000CC4C03E016\r
+:101100001C8CFFFFD44D00007C408000A00000003C\r
+:10111000CC80004DC8140023315800049580FFFF97\r
+:10112000C8140023CC00005BCC412180204C8000FF\r
+:10113000CCC1218114D0001FCC412182CC4121831C\r
+:101140009500FBB0CC412184C81400239940FFFFD7\r
+:10115000C8140023800000017C408000C0160004F9\r
+:1011600021542140CC550000C81800048000000024\r
+:10117000CC0003E07C40C00018D00038C0160080CE\r
+:1011800095000003C02A00047CD4C007CCC1217C98\r
+:10119000CC41217DCC41217E7C41800014FC001F8C\r
+:1011A0001D98FFFF39B0000322A0217F9B000003A0\r
+:1011B000419C0005041C004099C0000009DC0001AE\r
+:1011C000CC210000C8240004166C001F419C0005BF\r
+:1011D0009AC0FFFACC80004D9BC0FB8A0000000043\r
+:1011E00080000000CC0003E07C40C0007C41000097\r
+:1011F0001518001F511400209980000B191C003194\r
+:10120000CD0000627D4D4027D456000095C0FB7D87\r
+:10121000C82000269A000000C82000268000000197\r
+:101220007C408000E03A0000C0260004CCC1216967\r
+:101230007D250007CD01216A0BB80002CC41216B4E\r
+:101240009B80FFFECC41216C99C0FD30CC00007F1B\r
+:10125000800000017C408000C00E0100CC000041F5\r
+:10126000CCC1304AC83C007FCC00007F8000000029\r
+:10127000CC00007FCC00007F88000000CC00007F05\r
+:10128000000000000000000000000000000000005E\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001044000100003001200050015001A3E\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007500300077003200E80034008C77\r
+:1014500000350062003900EA003A0112003B012524\r
+:10146000003C013D003D01AD003E01D2003F00E7E0\r
+:1014700000410445004204570043045D004401ED6F\r
+:101480000045013D004602040047020400480204F2\r
+:10149000004A029B004B0364004C02A7004D02E58A\r
+:1014A000004E0331004F0337005103580052033DF3\r
+:1014B0000053034D00540366005703680060038027\r
+:1014C000006103980062036C006303A2006403AC34\r
+:1014D000006503B6006603C0006703CA006803D452\r
+:1014E000006903D8006A0409006B03DC006C03E0A8\r
+:1014F000006D03E4006E03E8006F03EC007003E48A\r
+:101500000071040F007203FE007303F0007403F710\r
+:101510000075041A007D043D007A047A000F0496D9\r
+:10152000000F0496000F0496000F0496000F049617\r
+:10153000000F0496000F0496000F0496000F049607\r
+:10154000000F0496000F0496000F0496000F0496F7\r
+:10155000000F0496000F0496000F0496000F0496E7\r
+:10156000000F0496000F0496000F0496000F0496D7\r
+:10157000000F0496000F0496000F0496000F0496C7\r
+:00000001FF\r
diff --git a/firmware/radeon/BARTS_pfp.bin.ihex b/firmware/radeon/BARTS_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..0eda3a8
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC4000298000035FCC40002AC5\r
+:100040009900000500000000CC40002B8000035FF9\r
+:10005000CC40002CCC40002D8000035FCC40002E13\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:100070008000035FCC0000528000035FCC0000547E\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000042F4\r
+:1000E000CD400042D10000427C40C000C81800034F\r
+:1000F000C81C0003C82000039580FFC2C824000369\r
+:1001000095C0FFC0C828001D9A800004CC0000558F\r
+:10011000D80003C0CC000040C8280016C02E000440\r
+:10012000C830000D1AA800277EF2C007CEC00040DC\r
+:10013000CC000040CD800040CDC00040CE0000404B\r
+:1001400096800003CE400040D080005CCC80004010\r
+:10015000CC000040CCC000407C408000A0000000EB\r
+:1001600004280001C810002CC80C002B51100020DE\r
+:100170007CD0C0277CC5002055140020CD00004253\r
+:10018000CD400042D14000427C40C000C81800036E\r
+:10019000C81C0003C8200003C82400039580FF99F1\r
+:1001A000C828000395C0FF97C82C03FD7E2F0011BF\r
+:1001B000970000037EE2C0017C02C006CEC3A29E6F\r
+:1001C000CC00006CCD00006DCD40006DC830001D2E\r
+:1001D0009B000004CC000055D80003C0CC000040B8\r
+:1001E000C82C0016C0320005C834000D1AEC0027D8\r
+:1001F0007F370007CF000040D0400040CD80004056\r
+:10020000CDC00040CE000040CE40004096C000036C\r
+:10021000CE800040D080005CCC800040CC0000400C\r
+:10022000CCC000407C408000A000000004280001F9\r
+:10023000C81800151D9800017C424000958002CE30\r
+:100240007C428000C81C0020C037C0007C40C00039\r
+:100250007C4100007CB48006C03600031AB801E877\r
+:1002600097800007D04003E084000362CC00007F49\r
+:10027000C83803E09B800000C83803E099C0000044\r
+:10028000C81C00207CB4800710D400027D654000AB\r
+:10029000CD400043CE800043CD000043CC800040E1\r
+:1002A000CE400040CE800040CCC00040E03A00008C\r
+:1002B0009780FF54CD0000407C40C000800000A229\r
+:1002C0007C4100001C8C000298C00009C810001C72\r
+:1002D00099000004C81C000684000365CC0000528D\r
+:1002E000C81800158000008E1D980002C810001E5E\r
+:1002F0009900FFFCC81C000884000365CC00005472\r
+:10030000C81800158000008E1D9800021C8C000289\r
+:10031000C810001D98C0000EC814004999000004C0\r
+:10032000C81C000784000365CC000053C8180015E2\r
+:1003300094C00003189401E8055400062010000141\r
+:100340007D1500038000008E7D9180069940FFF8A6\r
+:10035000C81C0007CDC00040CC000040800000CB8E\r
+:10036000CC00006EC00E8080CC00006704D080807E\r
+:10037000CC000068CD0003F1CD0003F2CD0003F303\r
+:10038000CD0003F4CD0003F6CD0003F7CD0003F854\r
+:1003900080000005CD0003F9CC800040D44000402F\r
+:1003A0007C408000A000000004280001800000EED6\r
+:1003B000D8000440D8000340CC000040CC8000406E\r
+:1003C000D44000407C408000A000000004280001D0\r
+:1003D000D80003C0800000FBCC000040800000FA81\r
+:1003E000D8000440D8000340CC000040C80C0029CD\r
+:1003F000C810002ACC800040CC40004051100020A2\r
+:100400007CD0C027105000027D0D00205514002024\r
+:10041000CD000043CD400043D0400043CC0000401D\r
+:100420007C408000A000000004280001D80003C028\r
+:10043000CC000040CC800040D44000407C40800094\r
+:10044000A0000000042800011C8C0002C810001D40\r
+:1004500098C00011C814004999000004C81C000786\r
+:1004600084000365CC000053C80C002FCC800040F2\r
+:10047000CC400040CC400040CC4000407CC4C00098\r
+:10048000CCC00040D44000407C408000A000000070\r
+:10049000042800019940FFF5C81C0007CDC00040AA\r
+:1004A000CC0000408000011ACC00006E7C40C000EF\r
+:1004B000C81000479900000BC8140044994000047C\r
+:1004C000C8180009CD800040CC00004080000144E5\r
+:1004D000CC8000407C40C000C81000479500FFF76A\r
+:1004E000C814004599400004C818000ACD80004097\r
+:1004F000CC00004080000144D80008407C40C0008F\r
+:10050000C81000479900FFFC00000000CC800040AC\r
+:10051000CCC00040D44000407C408000A0000000DF\r
+:1005200004280001C8100046D8000740CD00004054\r
+:100530008400015BCD000040C80C004394C0000A59\r
+:10054000C81400488000015404100003C81000467D\r
+:10055000D80007C0CD0000408400015BCD00004002\r
+:10056000C81400489D400000CC00006AC82800164E\r
+:100570001EA800019A800003C02900018800000025\r
+:10058000C02C0156CE80005CD80008C0CEC0004010\r
+:1005900088000000CC0000401C8C0002C810001E27\r
+:1005A00094C00008C814001C9900000AC81C000868\r
+:1005B00084000365CC00005480000175CC800040AD\r
+:1005C00099400004C81C000684000365CC0000525A\r
+:1005D000CC80004080000000D4400040CC40002788\r
+:1005E000CC4000288000035FCC00006BC0320003C9\r
+:1005F000C037FFFF800001807CB080077C43400053\r
+:10060000C8200028C81C0027C8180026CF43A29E77\r
+:100610007C414000522000207DE1C0277D58C0036E\r
+:100620007CDCC02054D0002080000195CC800040AC\r
+:100630007C418000CC80004080000192CD80004051\r
+:10064000C019FFFFCC800040CD83A29E7C40C0003B\r
+:100650007C4100007C414000CCC3A1FACD03A1F94C\r
+:10066000CD43A29DCCC00040CD000040CD40004015\r
+:10067000CC4000407C408000A00000000428000125\r
+:100680007C40C0001CD00001CCC3A29F9500000399\r
+:10069000D0400026D0800026CC80004080000000A2\r
+:1006A000CCC000407C40C000CC800040CCC3A2A2A3\r
+:1006B00080000000CCC000407C40C00014D4001F6B\r
+:1006C000CC800040954000037C410000CCC0005924\r
+:1006D0001518001FCCC0004095800003CD000040DD\r
+:1006E000CD00005A8000035FCC00007FC820001FAF\r
+:1006F0007C410000D8200244CE2000447C414000D0\r
+:100700007C418000CDA00049CD200041CD6000415A\r
+:10071000CDA0004115100008115400187D53C007EA\r
+:10072000CFC0002F06200001CE0000588000035FDC\r
+:10073000CC00007FC820001FCA0C001794C0000521\r
+:100740007C410000D82002C6800001BFCE200046B8\r
+:10075000CC000048800001D500000000C820001F28\r
+:100760007C4180000A200001CA14001ACA18001730\r
+:100770007D59800795800005CE000058CCA000462A\r
+:1007800080000000CD600046CCA000448000000046\r
+:10079000CD6000448000035FCC40006AC80C03FABF\r
+:1007A00098C0000BD04003FAC8180042C81C004390\r
+:1007B000C810001DC814001C111000019980FF5BB7\r
+:1007C0007D15000799C0FF6300000000D00003FA08\r
+:1007D000800000007C40C000CC8000408000000011\r
+:1007E000D44000407C40C0007C4100007C4380003D\r
+:1007F0007C43C000041C0002CF800042CFC00042F6\r
+:10080000CDC00042041C0020CCC00042CD000042FC\r
+:10081000CDC00042041C0007042000017C024000FF\r
+:10082000C8140003C8180003519800207D594027C0\r
+:10083000C8280003C82C0003C8300003C8340003D4\r
+:1008400052EC00207EAE8027537400207F370027B3\r
+:100850007F2B40217E76402056A8003F5730003F36\r
+:100860007EB280067E2A000699C0FFF209DC0001F4\r
+:100870009680FFE153F400207F7B40277D65402078\r
+:1008800055580020CC00005BCD760000CDB60000AE\r
+:10089000C82000419A000000C820004180000001EB\r
+:1008A0007C4080007C40C0007C410000CCC003FE46\r
+:1008B000CD0003FFCCC00042CD0000421514001F44\r
+:1008C000191800F0275C00017D760006998000056C\r
+:1008D0007D5E4006CC0000428000035FCC00004DEE\r
+:1008E00015980001152C0008998000311EEC0001BC\r
+:1008F000960000041530000C8000035FCC0000421D\r
+:1009000004140020CD4000421F30000120280001C7\r
+:1009100004380020043C0007C8140003C818000372\r
+:10092000C81C0003C82000037D5D400D7DA1C00DE3\r
+:100930007D5D40071610001F159C001F7D1D0006E1\r
+:100940007D1740067E9280069B4000120BB8000483\r
+:100950009BC0FFF20BFC0001C80C03FE9A8000094B\r
+:10096000C81003FF9B000106CC00004D04140020BA\r
+:10097000CCC00042CD00004280000243CD40004286\r
+:1009800096C000FFCC00004D8000035FCC00004EFD\r
+:100990009AC00003CC00004DCC00004E9780FD991A\r
+:1009A000E383000080000000DC0301FF96400004A8\r
+:1009B000CC00004E8000035FCC000042D200004219\r
+:1009C000C8080003C80C0003C8100003C8140003C3\r
+:1009D000C8180003C81C0003C8240003C82800036B\r
+:1009E00015FC001F16B0001F7FF3C00614F0001F97\r
+:1009F0007FF3C0061570001F7FF3C0067D8880015D\r
+:100A000097C0000D7DCCC0017E5100017E95400154\r
+:100A10007C90800C7CD4C00C9AC000037C8F400674\r
+:100A200024B400019B4000D6CC00004D8000035F41\r
+:100A3000CC00004EC80C03FEC81003FFCCC000421F\r
+:100A40008000026FCD0000427C40C0007C4100006D\r
+:100A50007C42C0007C430000C03B001F7C43400040\r
+:100A60007FB78006C03E10009780FD667D3D000781\r
+:100A70007F3F00071914003BCC00005B954000133A\r
+:100A8000C8140040315800029580FFFFC814004090\r
+:100A9000CC000063211C8000CCC12185CDC1218602\r
+:100AA0001514001FCEC12187CF0121889540FD5527\r
+:100AB000CF412189C81400409940FFFFC81400406D\r
+:100AC000800000017C408000CC800040CCC0004011\r
+:100AD000CD000040CEC00040CF00004080000000AC\r
+:100AE000CF400040D08003E0CC800040840003620F\r
+:100AF000CC400040C80C03E098C00000C80C03E0E4\r
+:100B00007C408000A00000007E8280067C40C00007\r
+:100B1000840002CC14D0001F9900FD3AD04003E0BD\r
+:100B200084000362CC00007F800002BEC80C03E09A\r
+:100B3000CC800040CCC0004088000000D440004081\r
+:100B4000CC800040CC400040CC400040CC40004035\r
+:100B50007C40C000CCC00021CCC00040D44000404C\r
+:100B6000C037FFFFD00003FBD00003FCD00003FA26\r
+:100B700080000000CF4003FD7C40C00014DC001D5D\r
+:100B800099C00007CC80004018DC003C99C0007C74\r
+:100B9000CCC000408000035FCC00006A18D8003C45\r
+:100BA000CD800066CC00006A8000035FCCC00040AE\r
+:100BB0007C40C0005050002084000362CC00005DE7\r
+:100BC0007CD0C027C820001FC8D60000994000086C\r
+:100BD0007C438000E3830000CFA0004F84000362C9\r
+:100BE000CC00005E80000000D440007F8000035FE6\r
+:100BF000CC00005E84000362CC00005DC820001FB2\r
+:100C00007C40C000C036FF00C8100021C0303FFF4C\r
+:100C10007CF540067D5180067D81800A9980000820\r
+:100C20007CF38006E3830000CFA0004F84000362C2\r
+:100C3000CC00005E80000000D440007F8000035F95\r
+:100C4000CC00005E840003627C40C00014DC00081D\r
+:100C500095C000191CDC00107C41000099C0000404\r
+:100C6000505400208000031DC91D00007D15002781\r
+:100C7000C91E00007C4200007C4240007C41800094\r
+:100C80007DE5C0067DE280119A80FCDE41AC000566\r
+:100C90009AC000000AEC00011CDC001099C000049E\r
+:100CA0000000000080000320C91D00008000032018\r
+:100CB000C91E0000CC800040CCC000408000000075\r
+:100CC000D4400040D8000340CC000040CC8000401D\r
+:100CD000D44000407C408000A000000004280001B7\r
+:100CE000D80003C0CC000040CC800040D44000407D\r
+:100CF0007C408000A0000000042800017C40C0006F\r
+:100D00001CD000062910000699000006C814001C1B\r
+:100D100099400004CC00005284000365C81C000602\r
+:100D2000CC800040CCC0004080000000D440004097\r
+:100D30007C40C0007C4100001518001FCD00005B06\r
+:100D4000998000045114002080000000D44D000060\r
+:100D50007D4D4027191C0031D456000095C0FCA9D8\r
+:100D6000C82000419A000000C82000418000000116\r
+:100D70007C40800080000000D440007FCC00007FD9\r
+:100D800080000000CC00007FCC00007F88000000C5\r
+:100D9000CC00007FCDC0004088000000CC000040A7\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003033100040338000501BBA4\r
+:10101000000600ED000700F90008010B000900F4CC\r
+:10102000000A00EB000B00F7000C012B000D01354E\r
+:10103000000E0149000F01530010035D0011000A6A\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025005900260177001701D7001801E587\r
+:10106000001A01E7002202EC002302FD0027018C98\r
+:10107000001F01F900200229002801AE0029017B90\r
+:10108000002A01A0002B0190002F01A9003201CD00\r
+:101090000034033F0035017F003901F6003C0311A5\r
+:1010A000003F01BB00410292004202B9004302C36B\r
+:1010B000004402D0004A02DE005503330056033AD2\r
+:1010C0000060008C006100B1006200D9006300C3C1\r
+:1010D000006400C3006500C3006600C3006700C36E\r
+:1010E000006800E6006900EF006A013F006B010D37\r
+:1010F000006C010D006D010D006E010D006F010D02\r
+:1011000000700112007300FB007400FB00750166A3\r
+:10111000007B034C000000050000000500000005F6\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/BTC_rlc.bin.ihex b/firmware/radeon/BTC_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..f344ac2
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B8000004A0000000061\r
+:10003000CC00000ECC00000EC8100082202801C3A6\r
+:10004000201C0000C8100082C80800857F8B800734\r
+:10005000C808008194800030000000008000005635\r
+:1000600000000000C9CC008394C00017000000000D\r
+:1000700084000099200C0001840000AD20380000AD\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001A988000063A\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000C011B8001F840000ADCF\r
+:1000D0002038000184000099200C0000C03001C0CD\r
+:1000E000CB3900002038000095C0FFD3CF8000033B\r
+:1000F0007DC1C006840000C0203800008000000DD3\r
+:10010000CF80000320380001CF800003C810008298\r
+:10011000CC000081C808001A948000100000000084\r
+:10012000CD80000E00000000840000C011B8001F48\r
+:10013000840000AB20380002CC310000840000AD08\r
+:1001400020380001CD80008184000099200C00003F\r
+:100150008000000D00000000C83800569B80006C35\r
+:10016000201C0000C83800579B800069201C00013B\r
+:10017000201C0000C80800819480001200000000CC\r
+:10018000C82800009680000F20080001CD80000ED6\r
+:10019000CC8000001C1C00002A8801BB9480000455\r
+:1001A00000000000800000BB000000002A8801BCA5\r
+:1001B000988000450000000095000023000000002A\r
+:1001C000C82800029680000620080001CD80000E9D\r
+:1001D000CC8000028000009100000000C8280001CF\r
+:1001E000968000070000000020080001CD80000E6E\r
+:1001F000CC8000018000009100000000C8280003AE\r
+:100200009680000900000000CD80000E2A8C01E5D8\r
+:1002100098C0FF9520080001CC8000038000009169\r
+:1002200000000000C82800049680FF830000000042\r
+:1002300020080001CD80000ECC80000480000091D9\r
+:100240000000000084000095000000008000000D08\r
+:10025000000000001EA800FFCE80000C88000000F7\r
+:1002600000000000C0300390CB390000C00BFFFE3F\r
+:100270007F8B800610CC00107F8F8007CFB10000ED\r
+:1002800088000000CB390000CFB10000CD80000E07\r
+:10029000CB39000017B800041FB8000F9780FFFD8E\r
+:1002A000000000008800000000000000800000A2A4\r
+:1002B000C03001C1C0302003CFB100008800000071\r
+:1002C000CB390000C9F800839B80000400000000C7\r
+:1002D0008000000D00000000CC1C0083840000C0E2\r
+:1002E00011B8001F8000000D00000000CD9C0083AD\r
+:1002F000840000C0203800009500FF51000000007D\r
+:10030000C03001C088000000CFB1000099C0000BD0\r
+:10031000C830004023300002CF000040840000D8E5\r
+:1003200020380003C83000401F3003FDCF000040DC\r
+:1003300080000056CC000056C830004023300040FA\r
+:10034000CF000040840000E920380001C8300040A0\r
+:100350001F3003BFCF00004080000056CC00005685\r
+:10036000840000F400000000C0302008840000FC7D\r
+:100370002038FFFFC0302008CC310000CB3900000E\r
+:10038000C0300398840000FC20380100C03003987E\r
+:10039000CC310000CB090000C03021B6880000003D\r
+:1003A000CC310000840000F400000000203800017F\r
+:1003B000C0300398840000FC13B80014CC00005730\r
+:1003C000C0300398CC31000088000000CB09000049\r
+:1003D000CF9C0016CD80000EC9F000187F38800C2D\r
+:1003E0009480FFFE00000000880000000000000074\r
+:1003F000CFB10000CB3900002008001F988000001A\r
+:1004000008880001CC1C0016C9F0001B9700FFFFF4\r
+:100410000000000088000000000000000000000054\r
+:1004200000000000000000000000000000000000CC\r
+:1004300000000000000000000000000000000000BC\r
+:1004400000000000000000000000000000000000AC\r
+:10045000000000000000000000000000000000009C\r
+:10046000000000000000000000000000000000008C\r
+:10047000000000000000000000000000000000007C\r
+:10048000000000000000000000000000000000006C\r
+:10049000000000000000000000000000000000005C\r
+:1004A000000000000000000000000000000000004C\r
+:1004B000000000000000000000000000000000003C\r
+:1004C000000000000000000000000000000000002C\r
+:1004D000000000000000000000000000000000001C\r
+:1004E000000000000000000000000000000000000C\r
+:1004F00000000000000000000000000000000000FC\r
+:1005000000000000000000000000000000000000EB\r
+:1005100000000000000000000000000000000000DB\r
+:1005200000000000000000000000000000000000CB\r
+:1005300000000000000000000000000000000000BB\r
+:1005400000000000000000000000000000000000AB\r
+:10055000000000000000000000000000000000009B\r
+:10056000000000000000000000000000000000008B\r
+:10057000000000000000000000000000000000007B\r
+:10058000000000000000000000000000000000006B\r
+:10059000000000000000000000000000000000005B\r
+:1005A000000000000000000000000000000000004B\r
+:1005B000000000000000000000000000000000003B\r
+:1005C000000000000000000000000000000000002B\r
+:1005D000000000000000000000000000000000001B\r
+:1005E000000000000000000000000000000000000B\r
+:1005F00000000000000000000000000000000000FB\r
+:1006000000000000000000000000000000000000EA\r
+:1006100000000000000000000000000000000000DA\r
+:1006200000000000000000000000000000000000CA\r
+:1006300000000000000000000000000000000000BA\r
+:1006400000000000000000000000000000000000AA\r
+:10065000000000000000000000000000000000009A\r
+:10066000000000000000000000000000000000008A\r
+:10067000000000000000000000000000000000007A\r
+:10068000000000000000000000000000000000006A\r
+:10069000000000000000000000000000000000005A\r
+:1006A000000000000000000000000000000000004A\r
+:1006B000000000000000000000000000000000003A\r
+:1006C000000000000000000000000000000000002A\r
+:1006D000000000000000000000000000000000001A\r
+:1006E000000000000000000000000000000000000A\r
+:1006F00000000000000000000000000000000000FA\r
+:1007000000000000000000000000000000000000E9\r
+:1007100000000000000000000000000000000000D9\r
+:1007200000000000000000000000000000000000C9\r
+:1007300000000000000000000000000000000000B9\r
+:1007400000000000000000000000000000000000A9\r
+:100750000000000000000000000000000000000099\r
+:100760000000000000000000000000000000000089\r
+:100770000000000000000000000000000000000079\r
+:100780000000000000000000000000000000000069\r
+:100790000000000000000000000000000000000059\r
+:1007A0000000000000000000000000000000000049\r
+:1007B0000000000000000000000000000000000039\r
+:1007C0000000000000000000000000000000000029\r
+:1007D0000000000000000000000000000000000019\r
+:1007E0000000000000000000000000000000000009\r
+:1007F00000000000000000000000000000000000F9\r
+:1008000000000000000000000000000000000000E8\r
+:1008100000000000000000000000000000000000D8\r
+:1008200000000000000000000000000000000000C8\r
+:1008300000000000000000000000000000000000B8\r
+:1008400000000000000000000000000000000000A8\r
+:100850000000000000000000000000000000000098\r
+:100860000000000000000000000000000000000088\r
+:100870000000000000000000000000000000000078\r
+:100880000000000000000000000000000000000068\r
+:100890000000000000000000000000000000000058\r
+:1008A0000000000000000000000000000000000048\r
+:1008B0000000000000000000000000000000000038\r
+:1008C0000000000000000000000000000000000028\r
+:1008D0000000000000000000000000000000000018\r
+:1008E0000000000000000000000000000000000008\r
+:1008F00000000000000000000000000000000000F8\r
+:1009000000000000000000000000000000000000E7\r
+:1009100000000000000000000000000000000000D7\r
+:1009200000000000000000000000000000000000C7\r
+:1009300000000000000000000000000000000000B7\r
+:1009400000000000000000000000000000000000A7\r
+:100950000000000000000000000000000000000097\r
+:100960000000000000000000000000000000000087\r
+:100970000000000000000000000000000000000077\r
+:100980000000000000000000000000000000000067\r
+:100990000000000000000000000000000000000057\r
+:1009A0000000000000000000000000000000000047\r
+:1009B0000000000000000000000000000000000037\r
+:1009C0000000000000000000000000000000000027\r
+:1009D0000000000000000000000000000000000017\r
+:1009E0000000000000000000000000000000000007\r
+:1009F00000000000000000000000000000000000F7\r
+:100A000000000000000000000000000000000000E6\r
+:100A100000000000000000000000000000000000D6\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/CAICOS_mc.bin.ihex b/firmware/radeon/CAICOS_mc.bin.ihex
new file mode 100644 (file)
index 0000000..2e96009
--- /dev/null
@@ -0,0 +1,1507 @@
+:100000000003E8E00002BE01000002140003FF004C\r
+:100010000003FF000002A00E0001C01D0003E80065\r
+:100020000003E8100003E8200003E8300003601834\r
+:100030000003601C00036020000360280002B0FF82\r
+:100040000002B1FF0002B2FF0002B3FF00036138FB\r
+:100050000003496C0003FF000003AF0A0002B40470\r
+:1000600000026FF40000FA3B0002B40F00024F14CC\r
+:100070000000FA17000340240002B4400002B50F4C\r
+:1000800000034AA6000244410003F0020002499521\r
+:1000900000036AA600022DA8000349D400003243E1\r
+:1000A0000000221800003A150002B51000009A4323\r
+:1000B000000245530003F0080002A07E0003F04652\r
+:1000C0000002A0630003F0440000F20F000234BFFE\r
+:1000D0000003F4000001C0250003E8000000820FC7\r
+:1000E000000340240002B4400002B5F000034AA619\r
+:1000F000000244410003F0020002699500036AA671\r
+:10010000000340000003FF000003F8010003C440A7\r
+:100110000003C4510002C645000200000003401065\r
+:100120000003FF000003FF000003E8200003E830A5\r
+:10013000000360100003F8030002336C000232A8D1\r
+:10014000000348080002B49F00024004000368084E\r
+:10015000000348210002B3C1000247730003682175\r
+:1001600000036A89000348250002B3C100024773F7\r
+:100170000003682500036A8D000348C0000348C6D9\r
+:100180000000823100008A300000C22F0000CA2E19\r
+:100190000003E8100003E890000368C0000368C68D\r
+:1001A00000034AA40003E8400003FF0000024224C9\r
+:1001B00000036AA400034800000348050002BB3F97\r
+:1001C0000002BCBF0002BFEF0000923300008A347F\r
+:1001D000000082380000BA360000AA3A0002411B33\r
+:1001E0000002BBFB0002422B0002400C000368002F\r
+:1001F0000002455F0003680500034810000349DD65\r
+:100200000002BBF10002BC0200008A370000AA39DC\r
+:100210000002411B0002611C000368100002455BE4\r
+:100220000002655C000369DD0003400D0003FF0070\r
+:100230000003FF000003A14C00008A0D0002B3027E\r
+:10024000000243340003A33000009A0C0002B30400\r
+:10025000000243340003A33200009A0B0002B008EE\r
+:10026000000082410002B0090000824200034829D8\r
+:10027000000349700002BF070002400F0003800026\r
+:100280000003000E00038406000385560003A556F4\r
+:100290000002655400026440000349E80003682935\r
+:1002A0000003682D0003C1040003C115000369E8C1\r
+:1002B000000369EC0003E8000003E8D00002304FBF\r
+:1002C000000368E40003C1DE0002304F000369044C\r
+:1002D0000003402C0003FF000002B40200024404AB\r
+:1002E0000000A216000349D60002B5100002445BCC\r
+:1002F0000003A4460000A2180002A04E0003F00371\r
+:100300000002346A0003F4000001C0C50003F400D9\r
+:100310000001D3720003400E0000F2400003E8F039\r
+:100320000003A0B6000349D50000FA110002B10F86\r
+:10033000000242170002A5200003F0010000FA406D\r
+:100340000002431B0002A5230003F0010000F2118C\r
+:10035000000340000003402E0002B6100002B40C5F\r
+:1003600000002A40000242240003A222000243347B\r
+:1003700000026C23000246680003F0030002A05E46\r
+:100380000003F0010003E8C00000E2100003400891\r
+:100390000002B40000007A110002A0240003F04122\r
+:1003A0000002B2080002A0FE0003F0410002B20405\r
+:1003B0000002B43F000242240000922800034A9445\r
+:1003C0000003FF000003606C000340000003FF0017\r
+:1003D0000002B440000244040003F0030003E800FC\r
+:1003E0000000823F000222FA000340000003FF00E9\r
+:1003F0000002B440000244140003F0020000F23F87\r
+:10040000000222FA000340000003FF000002B44093\r
+:10041000000244140003F00100022E6E00034A940F\r
+:100420000003FF0000036070000340000003FF00B2\r
+:100430000002B402000244240003F0030003E800B9\r
+:100440000000823F00022331000340000003FF0050\r
+:100450000002B402000244340003F0020000F23F44\r
+:100460000002233100034A940003FF0000036134BB\r
+:100470000002336C000340000003FF000003FF0094\r
+:100480000002440E0003F0030003E8000000823F76\r
+:100490000002245A0002336C000340000003FF00F6\r
+:1004A0000003FF000002441E0003F0020000F23FC0\r
+:1004B0000002245A00022EA900034A940003FF0000\r
+:1004C000000360740002B0000000822B00034000B3\r
+:1004D0000003FF000002B402000244400003F003E6\r
+:1004E0000003E8000000823F0002261900034A943E\r
+:1004F0000003FF0000036078000340000003FF00DA\r
+:100500000002B404000244400003F0030003E800CA\r
+:100510000000823F0002289C00034A940003FF0071\r
+:100520000003607C000340000003FF000002B410E1\r
+:10053000000244400003F00C0003E8000000823F8A\r
+:100540000002296C0000020D0003FF000003FF0001\r
+:100550000002A40E0003F0040000F20E0002296C59\r
+:100560000003E8000000820E00034A940003FF002D\r
+:10057000000360AC000340000003FF000002B42051\r
+:10058000000244400003F0030003E8000000823F43\r
+:1005900000022B8400034A940003FF00000360B0B4\r
+:1005A0000003E8000000823F0002B0FF0002B1FF3C\r
+:1005B0000003C12000036860000368680003400076\r
+:1005C0000003FF000002B410000244400003F042A8\r
+:1005D0000003F4000002018F0003400D00034026D9\r
+:1005E0000002B1400002B2100002B3080002411440\r
+:1005F0000003A11A000242240003A2240002622187\r
+:10060000000243380003A330000262230000922B53\r
+:100610000002A41E0003F0090003493D0002B2805D\r
+:100620000003C022000244420002296C0003493D3D\r
+:100630000003FF000002B2800002644200000210CA\r
+:100640000003FF000002B401000244040003F004B0\r
+:100650000003E8000000823F0003C1FE00022C46B8\r
+:10066000000002100003FF000002B4020002440474\r
+:100670000003F0040003E8000000823F0003E8F0FC\r
+:1006800000022C46000340000003FF000003FF00AF\r
+:100690000002442E0003F0030003E8000000823F44\r
+:1006A00000023577000340000003FF000002B41091\r
+:1006B000000244240003F0030003E8000000823F2E\r
+:1006C000000236A90003F80300034A940003FF0068\r
+:1006D000000360B40002B0000000822B0003400061\r
+:1006E0000003FF000002B402000244410003F002D4\r
+:1006F0000000F23F0002261900034A940003FF00A5\r
+:10070000000360B8000340000003FF000002B404CF\r
+:10071000000244410003F0020000F23F0002289C66\r
+:1007200000034A940003FF00000360BC0003400084\r
+:100730000003FF000002B410000244410003F00B6C\r
+:100740000000F23F0002296C0000020D0003FF00D0\r
+:100750000003FF000002A40E0003F0040000F20EEC\r
+:100760000002296C0003E8000000820E00034A9496\r
+:100770000003FF00000360EC000340000003FF00E3\r
+:100780000002B420000244410003F0020000F23FE6\r
+:1007900000022B8400034A940003FF00000360F072\r
+:1007A0000000F23F0002B0FF0002B1FF0003C120D1\r
+:1007B0000003686000036868000340000003FF0056\r
+:1007C0000002B410000244410003F0420003F400B0\r
+:1007D0000002020E0003400D000340260002B1405B\r
+:1007E0000002B2100002B308000241140003A11A73\r
+:1007F000000242240003A2240002622100024338C6\r
+:100800000003A330000262230000922B0002A41E0A\r
+:100810000003F0090003493D0002B2800003C0223A\r
+:10082000000244420002296C0003493D0003FF001E\r
+:100830000002B28000026442000002100003FF00C8\r
+:100840000002B404000244040003F0030000F23F7D\r
+:100850000003C1FE00022C46000002100003FF004E\r
+:100860000002B408000244040003F0030000F23F59\r
+:100870000003E8F000022C46000340000003FF00E4\r
+:100880000003FF000002443E0003F0020000F23FBC\r
+:1008900000023577000340000003FF000002B4109F\r
+:1008A000000244340003F0020000F23F000236A9C7\r
+:1008B00000034A940003FF00000360F40003F80300\r
+:1008C000000002180003FF000003FF000002A00E5A\r
+:1008D0000003F0420003F4000002026C0003402C0D\r
+:1008E0000003FF000002B420000240400002A00408\r
+:1008F0000003F0480003E8000000823F00023208D5\r
+:100900000002324D0000F23F000232080002324D78\r
+:10091000000232E4000340000003FF000002B408BC\r
+:10092000000244040003F00C000348080003FF0029\r
+:100930000002B44000026004000368080003499804\r
+:100940000002B4FD00024114000369980003E8307E\r
+:100950000003C12E00036830000232F80003E800F3\r
+:100960000003E8100003E8300002B203000368301F\r
+:10097000000340000003FF000002B5080002451517\r
+:100980000003F001000234D700034A940003FF0083\r
+:10099000000360F8000002400003FF000003FF00B6\r
+:1009A0000002A10E0003F0020003E8000000821420\r
+:1009B00000022EA9000348000003480500000A3485\r
+:1009C000000002380000123300002A3A00003A36D4\r
+:1009D0000003FF00000368000003680500034810DF\r
+:1009E000000349DD00000A3700002A390003FF0038\r
+:1009F00000036810000369DD000349710002B201C1\r
+:100A00000003E8300003C1060003C117000368308B\r
+:100A10000003496C0002B5160002A0510001C29FFC\r
+:100A20000002B0CF0002B1050002B2010002B30023\r
+:100A300000036830000232F80002B0B400036830EE\r
+:100A4000000232F80002B0BC00036830000232F845\r
+:100A50000002B0B800036830000232F80002B0CBE8\r
+:100A600000036830000232F80002B08C00036830E6\r
+:100A7000000232F80002B0D100036830000232F800\r
+:100A80000003E8000003E8100002B2030002B30014\r
+:100A900000036830000002180003FF000003FF009D\r
+:100AA0000002A00E0003F0420003F4000001C000A9\r
+:100AB000000001F4000340120003401500000A1B6F\r
+:100AC0000002A00E0003F0020003F4000001C2CFF8\r
+:100AD0000002C11E00008A1B00026BBA0002655BA7\r
+:100AE0000002C66E0003F0410002C77E00036015DD\r
+:100AF0000002B20F000244420002A5140003F007F6\r
+:100B00000003E8A00003E8B0000360120003E8005F\r
+:100B1000000081F40003F4000001C04D0003402CEC\r
+:100B20000003FF000002B420000240400002A004C5\r
+:100B30000003F0420003F4000001C2E40003E800F7\r
+:100B40000000823F000232080002324D0000F23FF6\r
+:100B5000000232080002324D000232E4000340106D\r
+:100B60000003FF000003FF000003A006000380064F\r
+:100B70000003C1F000022E7B0003C1F000022E7BB7\r
+:100B80000003C1F000022E7B0003C1F000022E7BA7\r
+:100B9000000340200003FF000003FF000002C00E1E\r
+:100BA0000003F0450002C11E0003F0430002C22E04\r
+:100BB0000003F0410002C33E000360200002336CDA\r
+:100BC000000349480002B43F0002B58000024334EC\r
+:100BD000000263350003694800024334000369489A\r
+:100BE0000003F4000001C0000003400400006A3F5D\r
+:100BF0000003E8800003E8900003E8A00003E8B0E9\r
+:100C00000002B510000244150003F0060002A0DE49\r
+:100C10000003F003000364AA0003F4000003F041A2\r
+:100C2000000364EA0003F8010002B508000244056D\r
+:100C30000002031C000061F80002A0DE0003F003C4\r
+:100C40000003E8400003F4000003F041000384EADD\r
+:100C50000003D8400003DCC0000079F70003F8036C\r
+:100C60000003D49E0003FB0000030FFE00020318E4\r
+:100C70000003F801000385E4000244150002032F7D\r
+:100C8000000021F90002A0DE0003F003000061F182\r
+:100C90000003F4000003F041000061F00002BF080F\r
+:100CA0000003DC400003D8C00003F8030003D49E17\r
+:100CB0000003FB0000030FFE0002032B0003F803F8\r
+:100CC0000003EC000000021400000A4000006A3F2C\r
+:100CD0000003FF00000240010002A00E0003F0012B\r
+:100CE0000003EC00000349380002A0DE0003F041DD\r
+:100CF00000034A5C0002B8FE000242280002A0DEA7\r
+:100D00000003F003000369380003F4000003F0411E\r
+:100D100000036A5C000349D00002B40400026114BD\r
+:100D20000002B2010002B3120002A0DE0003F04193\r
+:100D30000002B31100036830000349710002B8EFEC\r
+:100D40000002B9040003C1060002617900024338C1\r
+:100D500000036830000348090002B8FD000244485F\r
+:100D60000003680900022E7F000349A00002B411AD\r
+:100D70000003C1240002B10F000369A000034A442C\r
+:100D80000002B4FE0002611E00036A440002411426\r
+:100D900000036A440002A0DE0003F0030003426186\r
+:100DA0000003F4000003F0410003425D0003FF0074\r
+:100DB0000003FF000003E860000369A50003686BFF\r
+:100DC0000002BA0C0002B8C00003DC810003D8A105\r
+:100DD0000002B0F80002B1070003E8200003E83089\r
+:100DE0000003FE000003D41F0003686B0003E8F05B\r
+:100DF000000223FF000223E20002241C0002A1FEE5\r
+:100E00000003F0410003627A000342780003FF0010\r
+:100E10000003FF000002A0800001C3930002A09124\r
+:100E20000001C3930002A0A20001C3930002A0B37B\r
+:100E30000001C3930002CFFE0002BC0C0002A1FC23\r
+:100E40000003F0420003F4000001C37D0000FA0437\r
+:100E50000003E8F0000223E2000223FF0002241C4A\r
+:100E6000000342780003FF000003FF000002A0809F\r
+:100E70000001C3A90002A0910001C3A90002A0A221\r
+:100E80000001C3A90002A0B30001C3A90002CFFE64\r
+:100E90000002BC0C0002A1FC0003F0420003F400BD\r
+:100EA0000001C396000062040000FA030003FF0083\r
+:100EB0000002A5CF0001C3B90002A5FC0001C3B424\r
+:100EC0000003E8F00003E8C00003F4000001C3BC25\r
+:100ED00000030CCF0003ACC00003E8F00003F400F3\r
+:100EE0000001C3BC00030FFC0003AFF00003E8C027\r
+:100EF000000223FF0003C1FC000223E20003493883\r
+:100F00000002A0DE0003F04100034A5C0003FF0082\r
+:100F10000002622E0002A0DE0003F0030003693825\r
+:100F20000003F4000003F04100036A5C000349D0B1\r
+:100F30000002B4FB000241140002B2010002B3122D\r
+:100F40000002A0DE0003F0410002B311000368308C\r
+:100F5000000349710002B8EF0002B9FB0003C106AB\r
+:100F60000002417900024338000368300003480959\r
+:100F70000002B8FD00024448000368090002B018EE\r
+:100F8000000224400003EC00000344B90002A0DE8C\r
+:100F90000003F041000344F90003C10F0003C11F27\r
+:100FA0000003C12F0003C13F0003C14F0003C15F15\r
+:100FB0000002A0DE0003F005000364B0000364B487\r
+:100FC000000364B90003F4000003F043000364F07D\r
+:100FD000000364F4000364F9000348C80002B4F39A\r
+:100FE0000002B5040002400400026005000368C866\r
+:100FF00000024004000368C80003EC00000344B989\r
+:101000000002A0DE0003F041000344F90003C10F19\r
+:101010000003C11F0003C12F0003C13F0003C16FC4\r
+:101020000003C17F0002A0DE0003F005000364ACF2\r
+:10103000000364BC000364B90003F4000003F04340\r
+:10104000000364EC000364FC000364F9000348C877\r
+:101050000002B4F30002B50400024004000260057F\r
+:10106000000368C800024004000368C80003EC00E5\r
+:101070000002B01000022440000232F8000232F8F0\r
+:10108000000232F8000232F8000232F800034A1C73\r
+:101090000002244C0003C18C00034A200002244CAF\r
+:1010A00000038CC60002688C00034A240002244C12\r
+:1010B0000003C19C00034A280002244C00038CC694\r
+:1010C0000002699C00034A2C0002244C0003C1ACBE\r
+:1010D00000034A300002244C00038CC600026AACB4\r
+:1010E00000034A340002244C0003C1BC00034A3808\r
+:1010F0000002244C00038CC600026BBC0003EC0011\r
+:101100000003686B0002B9080002B8C00003DC806D\r
+:101110000003D8900003E8100003E8200003E83043\r
+:101120000003FE000003D41E0003686B0003EC0004\r
+:101130000003E8C00003873C0003A7760003862C69\r
+:101140000003A6680003851C0003A55A0003840C55\r
+:101150000003A44C00026CC700026CC600026CC500\r
+:1011600000026CC40003EC000000220F00034024C6\r
+:101170000003FF000002444E0003A0060002A10E7F\r
+:101180000003F00100008207000349A4000349A105\r
+:1011900000006A3F00038BEA0003C0AB000245A5D4\r
+:1011A0000002A0DE0003F003000243A30003F400EA\r
+:1011B0000003F041000263B3000369A4000369A1C6\r
+:1011C0000002B2FF0002B1FF0002B07F00036860BE\r
+:1011D0000003E8000003E8200003E8300002A0DE7E\r
+:1011E0000003F00300000A090003F4000003F041CB\r
+:1011F00000000A080002B8C00003686B0003D800B2\r
+:101200000003DC800003D41E0002BF0200022E7B1C\r
+:10121000000380E000008204000082030003E80075\r
+:1012200000008202000082010000F2000003485426\r
+:101230000002A0DE0003F003000384E80003F400D2\r
+:101240000003F041000384EA0002622400036854B2\r
+:1012500000034998000388E50003C13E0002A0DEB8\r
+:101260000003F001000383300003C12E0002600878\r
+:101270000003683000034975000388E600026068D7\r
+:101280000003C1170003C12E0003C13E0002A0DE0F\r
+:101290000003F0010003833000036830000348546A\r
+:1012A0000002A0DE0003F003000384E80003F40062\r
+:1012B0000003F041000384EA0003C044000242241A\r
+:1012C000000368540002BF0200022E7B00000218D7\r
+:1012D0000003FF000003FF000002A00E0003F00265\r
+:1012E0000003F400000204D7000230610003E8703C\r
+:1012F000000384E60002464B0002A0640003F04FA6\r
+:10130000000349D20003E86000038AB20003AAAADE\r
+:10131000000384A60002644A0003C1540002A0DE58\r
+:101320000003F003000368E50003F4000003F0414C\r
+:10133000000369050003F4000001C5820002BF0834\r
+:1013400000024FF90003AFF400038BB20003ABBC03\r
+:10135000000225A60003F400000205820003400CF1\r
+:101360000003FF000002BF0800024FF00003F0423C\r
+:101370000003F4000001C4F40002BF000002BB013E\r
+:10138000000225A6000002110003FF000003FF0079\r
+:101390000002A00E0003F0420003F4000001C58229\r
+:1013A0000002B1020002B0110002C4400002C550A8\r
+:1013B0000002A0DE0003F003000368E50003F40070\r
+:1013C0000003F041000369050003011E000204E967\r
+:1013D0000000F2020000F2010002A0DE0003F003B0\r
+:1013E00000007A060003F4000003F04100007A05D3\r
+:1013F00000038DE20003DCD00003D8F0000389E68F\r
+:101400000002699E0000F1F2000042070003E8D0EC\r
+:1014100000038FE00003C1A800038CED0000E1F69B\r
+:101420000000E23E00022FCA0002B701000042079E\r
+:101430000003E8A00000D1F20002A07E0003F0014A\r
+:101440000003A88000030FDF0003C1D90003C1A877\r
+:1014500000038CED0000E1F60000E23E00022FCA1E\r
+:101460000002300B0003C1040003C12600036270B8\r
+:101470000002BF0100034011000388E00002A0FE4B\r
+:101480000003F004000244480003F0020003F400EB\r
+:10149000000205680002B701000042070003FF00D8\r
+:1014A0000002A07E0003F0010003A8800003E8D042\r
+:1014B00000038FE00003C1A800038CED0000E1F6FB\r
+:1014C0000000E23E00022FCA0002300B000342700F\r
+:1014D00000038CEB00038CEA0003E8F00002C84034\r
+:1014E0000003A88000002A160002CA620003AAA016\r
+:1014F0000002A65E0002054500006A3F0000F216E9\r
+:101500000003C1580003C17A000362710003F400B4\r
+:10151000000204FF0002A15E0003F00E00006A3F1B\r
+:101520000003C1910003C1B30002A0DE0003F00379\r
+:101530000003612E0003F4000003F0410003613258\r
+:101540000002C0810003A8000002C2A30003AA2079\r
+:10155000000385500000AA16000381E00003008408\r
+:101560000003F0240002A1840003F0010002C44142\r
+:101570000003044E0003C154000302A60003F0243C\r
+:101580000002A1A60003F0010002C6610003066E7E\r
+:101590000003C1760003D45E00026002000205571A\r
+:1015A00000006A3F0002BF0200022E7B0003497167\r
+:1015B000000381E40003C1060003A26C0002A02E18\r
+:1015C00000020582000261710003C12E0003C13ECA\r
+:1015D0000002A0DE0003F0010003833000038660F8\r
+:1015E0000003F0470003683000038FED00022E7BFC\r
+:1015F00000038FED00022E7B00038FED00022E7B97\r
+:1016000000038FED00022E7B000349750003C12EFD\r
+:101610000003C1060003C1170003C13E0002A0DEA3\r
+:101620000003F00100038330000368300003499891\r
+:101630000003FF000003C13E0002A0DE0003F00132\r
+:10164000000383300003C12E0003683000000A0F3E\r
+:10165000000001F40003FF000002411E0003F0013E\r
+:101660000003EC000002A50E0003F0480003401147\r
+:101670000002A0DE0003F0030002666E0003F40027\r
+:101680000003F0410002677E000360110003E800E0\r
+:10169000000081F40003EC00000232F800034A402D\r
+:1016A0000000420000004A04000052030002BC3364\r
+:1016B0000002440C0002451C000264450002462C56\r
+:1016C0000002473C00026667000264460002A14E29\r
+:1016D0000003F0010002B4010002A08E0003F00537\r
+:1016E0000002A4490003F0430002A44B0003F041B0\r
+:1016F0000000F2020000A2040002BCCC0002440C74\r
+:101700000002451C0002462C0002473C00026445D2\r
+:1017100000026446000264470002A14E0003F0018B\r
+:101720000002B4010002A08E0003F0050002A44AEA\r
+:101730000003F0430002A44B0003F0410000F2015B\r
+:101740000000A2030003E8400000A20000034329B8\r
+:101750000002A0DE0003F041000343690000020222\r
+:10176000000012010002B10F0002B3070002A5FE43\r
+:10177000000205FC0002A00E0003F0060002BC0FF0\r
+:101780000002A4410003F0010002BC090003C14CA7\r
+:101790000003C15C0002A02E0003F0060002BC0F93\r
+:1017A0000002A4610003F0010002BC090003C16C47\r
+:1017B0000003C17C0002A0DE0003F00300036329E4\r
+:1017C0000003F4000003F0410003636900024C02CF\r
+:1017D0000002A0CE0003F0060002CFFE0002BC090A\r
+:1017E0000002A5FC0003F0020003F4000001C5A6FE\r
+:1017F000000348E50002A0DE0003F04100034905B4\r
+:101800000002B8110002A00E0003F0010002C4485B\r
+:10181000000249410002A4930003F0010000F2021B\r
+:101820000002A02E0003F0010002C5580002495139\r
+:101830000002A4930003F0010000F2010002A0DE08\r
+:101840000003F003000368E50003F4000003F04127\r
+:1018500000036905000240020002A00E000205A676\r
+:101860000003EC0000006A3F0003E8000002303B88\r
+:10187000000349980002B80F0002B5F50002B30159\r
+:101880000002A0DE0003F001000383300003C12E3C\r
+:101890000002600800024115000368300002BF002A\r
+:1018A00000022E7B0000F1FF0003E800000081FE33\r
+:1018B0000003400C0003402D0002B8100002B908DC\r
+:1018C00000024A180003AAA600024B490003ABB469\r
+:1018D0000002B30400026FAB0003F0410002B30248\r
+:1018E00000024FAB0003F0010002B3060003402DDD\r
+:1018F00000000A110002B040000240400003F04125\r
+:101900000003E8300002411E0003F0010003E8304C\r
+:10191000000099FD00022E7F0002BC010002A0DE43\r
+:101920000003F0090003482100038CC6000386660B\r
+:101930000003A6660002666C0003682100036A8942\r
+:101940000003F4000003F0470003482500038CC6A1\r
+:10195000000386660003A6660002666C0003682525\r
+:1019600000036A8D0002B0010003E8100003E820C4\r
+:101970000003E83000036A600002BF03000231D5B3\r
+:1019800000034808000384EA000081F500026004B7\r
+:10199000000368080002BF6400022E7B00006A3F5B\r
+:1019A0000003FF000003FF000002A0DE0003F003BD\r
+:1019B0000002BB000003F4000003F0410002BB4042\r
+:1019C0000000D9EF0003C10E0003C11E0003811601\r
+:1019D0000002611E000382E600036A440003C11E88\r
+:1019E000000381160003E82000036A440003E800B6\r
+:1019F0000003C0000003C1100002B2FD00036860D4\r
+:101A000000034A600002BFF70002B1130002400F5A\r
+:101A10000002600E00036A600000320C00003A0B06\r
+:101A20000002BC080002BFFE0003866A00026226B4\r
+:101A30000002A47E0003F0010002B3040002400F84\r
+:101A40000002600C00036A6000038FE100022E7B3D\r
+:101A50000003686B0003FF000003FE000000623D0E\r
+:101A600000005A3C0003FF000003D8C10003DCB1B2\r
+:101A700000038FE300022E7B0003D01F00038CEFD6\r
+:101A800000038FE400026FFE0002400100024223C7\r
+:101A90000002400200024CC00003FB010003D01F03\r
+:101AA00000030FFE000206A20002A0DE0003F00306\r
+:101AB000000348210003F4000003F041000348251F\r
+:101AC0000003C0CC000206CE00038CE60002C66C08\r
+:101AD0000003F0410002C77E0002A0DE0003F00414\r
+:101AE0000003682100036A890003F4000003F04248\r
+:101AF0000003682500036A8D0002A57E0003F00242\r
+:101B00000003F4000001C671000340110002B00898\r
+:101B10000000F1F40002A0DE0003F00300026660A2\r
+:101B20000003F4000003F04100026770000360113D\r
+:101B30000003F40000020883000380E10003810633\r
+:101B40000002611E000382E700036A44000381066D\r
+:101B50000003E82000036A440002B0010003E8101B\r
+:101B60000003E8200003E83000036A600003402C13\r
+:101B700000005A2B0002B4040003E8F000024440C5\r
+:101B80000003F0010002BF010002A4BE0003F00147\r
+:101B90000002BF04000231D50000F2270000F22548\r
+:101BA0000002B0FF0002B1BF0003C1200003686063\r
+:101BB0000002B0010003E8100003E8200003E83051\r
+:101BC00000036A6000000A3B0000120C00001A0BC0\r
+:101BD0000002B0020002A0DE0003F0410002B004E7\r
+:101BE0000003822A0002A43E0003F0010002B304B5\r
+:101BF00000038116000260010002B13300036A6035\r
+:101C00000003400A0002B0010002B1020002B2006B\r
+:101C10000002B3010002A02B0003F0020003E82041\r
+:101C20000003C13B00036A680003C10E00001242BA\r
+:101C3000000240090003F0010003E8200002B01395\r
+:101C40000002B102000382260003E83000036A703C\r
+:101C50000003402D00006211000012280002BF4066\r
+:101C600000024F4F0003F0030002A0CE0003F0017A\r
+:101C70000002B2080002B0210002B1020002B3016A\r
+:101C800000036A7400000A2B0002B0010003FF0089\r
+:101C90000002A41E0003F0050002B1040002B2001D\r
+:101CA0000002B3020003F4040003F0030002B102D7\r
+:101CB0000002B20F0002B30100036A7800034A7CFD\r
+:101CC0000003FF000002B0010002B1020002B304F1\r
+:101CD00000036A7C000001FE0003FF000003FF0018\r
+:101CE0000002C00E000081FE000231D00000022779\r
+:101CF0000003400A0003400D0002A00E0003F0059F\r
+:101D00000002B00100024005000380060003F40455\r
+:101D10000003F0030002B004000240090003800247\r
+:101D20000002B103000268010000022B0003FF0063\r
+:101D30000003FF000002A40E0003F00B00001228B5\r
+:101D40000002B0230002B1030002B30100036A7471\r
+:101D500000034A7C0003FF000002B0010002B1044E\r
+:101D60000002B30400036A7C00034A640002B480EA\r
+:101D7000000011EF00024004000260080003A222EC\r
+:101D80000002B30100036A6400023095000230A231\r
+:101D9000000001FF0003FF000003FF000002A00E8F\r
+:101DA0000003F04E0003402C0002BC040003DCC022\r
+:101DB00000038FEA0002A0DE0003F0010003E8F058\r
+:101DC0000003D8F00002BC090002BF3F00024B1F15\r
+:101DD00000022F0B0003E8F00000F9FF000001FEF5\r
+:101DE0000003FF000003FF000002C00E000081FEA0\r
+:101DF0000003402500001A100002B2040002422035\r
+:101E00000002A0DE0003F0410003A3320002B90289\r
+:101E100000024993000262290002B980000249953C\r
+:101E2000000262290002B9860003E8800002A029AE\r
+:101E30000003F0410003C18E0000C1DA000009FD7B\r
+:101E40000003402E0003FF000002A001000207A2D1\r
+:101E50000002B001000241080003F005000002404A\r
+:101E60000003FF000003FF000002A00E000207A213\r
+:101E700000034A7400007A280003FF000003FF00FB\r
+:101E80000003C12F00036A74000231D00000022752\r
+:101E90000003400A0003400D0002A00E0003F005FD\r
+:101EA0000002B00400024005000380020003F404B5\r
+:101EB0000003F0020002B01000024009000079DACD\r
+:101EC0000002B1430003FF000002A0FE0003F04146\r
+:101ED0000002B123000268010000022B0003FF0092\r
+:101EE0000003FF000002A00E000207D40000122829\r
+:101EF0000002B0430002B1040002B30100036A749F\r
+:101F000000034A7C0003FF000002B0010002B1059B\r
+:101F10000002B30400036A7C00034A640002B48038\r
+:101F2000000011EF00024004000260080002B82027\r
+:101F3000000260080002B8BF000240080003A222AD\r
+:101F40000003C13E00036A640003F4040003F008C8\r
+:101F500000034A640002B480000011EF0002400454\r
+:101F6000000260080003A2220003C13E00036A646D\r
+:101F700000023095000230A2000042100002B002C0\r
+:101F80000002A0DE0003F0410003800200024008CE\r
+:101F90000003F0020003F4000001C7F50003400E47\r
+:101FA0000002B0100003FF00000241090002A0106F\r
+:101FB000000207F5000002270003FF000003FF00F6\r
+:101FC0000002C00E000082270002B1020002A4013C\r
+:101FD00000020735000041EF000001F90003FF0097\r
+:101FE0000003FF000003D8800003DC0000007A42F9\r
+:101FF0000002B0010003DC010002B0000003D801C0\r
+:10200000000049DA0003FF000003FF000002A09E69\r
+:102010000003F0460003E8F00002B1240002C8818A\r
+:102020000003D8800002C0010003D8810002308C78\r
+:10203000000001FE0003FF000003FF000002C00ECD\r
+:10204000000081FE000079DA000231D00002A0FE1B\r
+:102050000003F0450002B00F0003C1100003C120CF\r
+:102060000003C13000036A800003400A0002B04050\r
+:102070000003FF00000240090003A0020002B103B8\r
+:10208000000268010000022B0003FF000003FF00B4\r
+:102090000002A40E0003F00B000012280002B0435F\r
+:1020A0000002B1050002B30100036A7400034A7C18\r
+:1020B0000003FF000002B0010002B1060002B304F9\r
+:1020C00000036A7C00034A640002B480000011EF40\r
+:1020D00000024004000260080003A2220002B301D3\r
+:1020E00000036A6400023095000230A2000340251C\r
+:1020F000000042100002B020000240050003F0483A\r
+:102100000002B0020002A0DE0003F04100038002E2\r
+:10211000000240080003F0020003F4000001C8655B\r
+:10212000000011FE0002B0800002B3030002A023F1\r
+:102130000003F043000240050003F0010002319665\r
+:102140000003402E0003FF000002B0080002410817\r
+:102150000002A010000208650002B08000024108E1\r
+:102160000003F005000002400003FF000003FF0031\r
+:102170000002A00E00020865000002250003FF0017\r
+:102180000003FF000003E81000008A250002A40EEF\r
+:1021900000020777000001EF000041F90003FF0093\r
+:1021A0000003FF000003D8000003DC8000007A4237\r
+:1021B0000002B0000003D8010002B0010003DC01FE\r
+:1021C0000003400D0002BD200003FF0000024DD5BA\r
+:1021D0000002A6DE0003F00300022F2B0003F4042C\r
+:1021E0000003F00A0002B07F0002B1FF0002B2FF5C\r
+:1021F000000368600003686B000011E50002B3C0D3\r
+:102200000003E8D00003604C00022F660002B0011A\r
+:102210000003E8100003E8200003E83000036A60D0\r
+:1022200000034A640002B4800002400400036A64B0\r
+:10223000000021F50003FF00000348080003FF0031\r
+:102240000003C104000368080003EC000003E80079\r
+:102250000003E8100002A0DE0003F0030003691C85\r
+:102260000003F4040003F001000369340003EC00F0\r
+:1022700000006A3F0003FF000003FF000002A0DE31\r
+:102280000003F0030002BB620003F4000003F0410E\r
+:102290000002BB680003FF000003FF000000D9FC40\r
+:1022A0000002328E0003E8000002303B0002BB0255\r
+:1022B0000000DA3E000348010002B0BF00024440C3\r
+:1022C00000036801000349980002B40F0002B5FD45\r
+:1022D00000026004000241150003C12E0003C13E4C\r
+:1022E0000002A0DE0003F001000383300003683029\r
+:1022F000000348080002B440000081F500026004B9\r
+:10230000000368080003E8000002B1600003E82051\r
+:102310000003E830000369A00003E8000002B110E8\r
+:102320000003E8200003E83000036A440002B00123\r
+:102330000003E8100003E8200003E83000036A60AF\r
+:102340000002BF02000231D50003E8000003C00014\r
+:102350000003C1100002B2FD0003686000000A3BE8\r
+:102360000000120C00001A0B0002B00A0002A0DEEE\r
+:102370000003F0410002B00C00038116000260016E\r
+:102380000003822A0002B10C000262210002A43E76\r
+:102390000003F0010002B3040002B11600036A60FA\r
+:1023A00000038FE100022E7B0003686B0003FF0037\r
+:1023B0000003FE00000231FE00034A600000320C00\r
+:1023C00000003A0B0002B4F60002B5030003866A6F\r
+:1023D000000262260002A47E0003F0010002B7049E\r
+:1023E00000026337000301150002400400036A6025\r
+:1023F0000003400A0002B0010002B1020002B21262\r
+:102400000003E83000036A680002B0800000124256\r
+:10241000000240080003F0010003E8200002B013AE\r
+:102420000002B102000382260003E83000036A7054\r
+:102430000002B0210002B1020002B2010002B301A9\r
+:1024400000036A740002B0010002B1020002B20F80\r
+:102450000002B30100036A7800034A7C0003FF0016\r
+:102460000002B0020002B1020002B30400036A7C61\r
+:102470000002B0FF0002B1BF0003C120000368608A\r
+:102480000003E87000034A640002B48000024004C4\r
+:102490000003E8200003E83000036A6400034A6494\r
+:1024A0000002B480000011FC000240040002B403EA\r
+:1024B000000260040002B31000036A640002309559\r
+:1024C00000034A640002B40800024440000267743A\r
+:1024D0000002A57E0002095C0003E8000002303B18\r
+:1024E0000002A0DE0003F003000348220003F40012\r
+:1024F0000003F041000348260003FF0000038CE6C0\r
+:102500000002CAAC0003F0410002CBBE0002A0DE14\r
+:102510000003F0040003682200036A8A0003F40049\r
+:102520000003F0420003682600036A8E0003E8708F\r
+:102530000002A6BE0003F0020003F4000001C9215E\r
+:10254000000340120000F1F40002BF040002A0DE0C\r
+:102550000003F00300026AAF0003F4000003F0413F\r
+:1025600000026BBF000360120003F4000001C95CAD\r
+:102570000002B0010003E8100003E8200003E83087\r
+:1025800000036A6000034A640002B4800002400451\r
+:1025900000036A64000021F50003FF0000034808FF\r
+:1025A0000003FF000003C104000368080003EC00FF\r
+:1025B00000006A3F0000F1FF0003E8000000821302\r
+:1025C000000340080003402D0002B8400002B90893\r
+:1025D00000024A080003AAAA00024B490003ABB458\r
+:1025E0000002B30400026FAB0003F0410002B3022B\r
+:1025F00000024FAB0003F0010002B3060003402DC0\r
+:1026000000000A110002B040000240400003F04107\r
+:102610000003E8300002411E0003F0010003E8302F\r
+:1026200000009A12000021F40003E8500003FF00AC\r
+:102630000000A2190000A9F400006A3F0003FF0097\r
+:102640000003FF000002A0DE0003F003000059F1C8\r
+:102650000003F4000003F043000059F00003FF0002\r
+:102660000003FF000000D9EF00034800000384EAE4\r
+:102670000003C0440003FF000002400400036800A0\r
+:10268000000348040003C07E0003FF000003FF00B6\r
+:1026900000024337000368040003402C00005A2B5B\r
+:1026A0000002B4040003E8F0000244400003F0011B\r
+:1026B0000002BF0100024BBE0002A0BE0003F003F7\r
+:1026C000000230FD0003F4000001C9B50002BFCBD9\r
+:1026D000000233410000F2260000F2250002B0FFA4\r
+:1026E0000002B1BF0003C120000368600002B00116\r
+:1026F0000003E8100003E8200003E83000036A60EC\r
+:1027000000000A3B0000120C00001A0B0002B0028D\r
+:102710000002A0DE0003F0410002B00400038116B5\r
+:1027200000026001000340150003822A0002B1800C\r
+:10273000000262210002A43E0003F0010002B30483\r
+:102740000002B6F0000244460002B1080002611423\r
+:1027500000036A600003400A0002B0010002B102F7\r
+:102760000002B2000002B3010002A02B0003F0023D\r
+:102770000003E8200003C13B00036A680002B001C7\r
+:1027800000001241000240090003F0010003E820AC\r
+:102790000002B0130002B102000382260003E830F9\r
+:1027A00000036A700003402D00006211000012282F\r
+:1027B0000002BF4000024F4F0003F0030002A0CE12\r
+:1027C0000003F0010002B2080002B0210002B102D1\r
+:1027D0000002B30100036A7400000A2B0002B0017A\r
+:1027E0000003FF00000241100002A41E0003F005D8\r
+:1027F0000002B1040002B2000002B3020003F404BC\r
+:102800000003F0030002B1020002B20F0002B301A4\r
+:1028100000036A7800034A7C0003FF000002B00155\r
+:102820000002B1020002B30400036A7C00000A2B1C\r
+:102830000003FF000003FF000002411E0002A41E6F\r
+:1028400000020A54000002130003FF000003FF000F\r
+:102850000002C00E00008213000231D000000226E8\r
+:102860000003400A0003400D0002A00E0003F00523\r
+:102870000002B00200024005000380040003F404DB\r
+:102880000003F0030002B0080002400900038000CA\r
+:102890000002B103000268010000022B0003FF00E8\r
+:1028A0000003FF000002400E0002A40E0003F00B24\r
+:1028B000000012280002B0230002B1030002B3019D\r
+:1028C00000036A7400034A7C0003FF000002B001A9\r
+:1028D0000002B1040002B30400036A7C00034A64EE\r
+:1028E0000002B480000011EF000240040002600802\r
+:1028F0000003A2220002B30100036A6400023095C3\r
+:10290000000230A2000001FF0003FF000003FF00EF\r
+:102910000002A00E0003F04E0003402C0002BC0495\r
+:102920000003DCC00002BFC00002A0DE0003F00113\r
+:102930000002BF800003D8F000038CE40002BF3F18\r
+:1029400000024B1F00022F0B0003E8F00000F9FF0C\r
+:10295000000002130003FF000003FF000002C00E8E\r
+:102960000000821300005A2B00007A250002B808EC\r
+:1029700000024ABE0002A0AE0001CA780003AAB05D\r
+:1029800000024AAE0003F04300022D680003F40089\r
+:102990000001CA7400034A700002BA880002B970CC\r
+:1029A0000002A0F80003F0430003C12A0003F40072\r
+:1029B0000001CA720003ABB200024BBE0002A0BE0F\r
+:1029C0000003F0410003C12900036A700002330BC9\r
+:1029D0000002B0FF0002B1BF0003C1200003686025\r
+:1029E00000000A12000002130003402E0003FF0043\r
+:1029F0000002A00100020A8C0002B001000241089E\r
+:102A00000003F005000002400003FF000003FF0088\r
+:102A10000002A00E00020A8C00034A7400007A280B\r
+:102A20000003FF000003FF000003C12F00036A74CE\r
+:102A3000000231D0000002260003400A0003400DCE\r
+:102A40000002A00E0003F0050002B00800024005DD\r
+:102A5000000380000003F4040003F0030002B02030\r
+:102A6000000240090003A0000002B1430002680117\r
+:102A70000000022B0003FF000003FF000002400ED5\r
+:102A80000002A00E00020ABC000012280002B0439F\r
+:102A90000002B1040002B30100036A7400034A7C1F\r
+:102AA0000003FF000002B0010002B1050002B30400\r
+:102AB00000036A7C00034A640002B480000011EF46\r
+:102AC00000024004000260080002B8200002600812\r
+:102AD0000002B8BF000240080003A2220002B104B5\r
+:102AE0000003C13E00036A640003F4040003F0081D\r
+:102AF00000034A640002B480000011EF00024004A9\r
+:102B0000000260080003A2220002B30100036A640D\r
+:102B100000023095000230A200005A2B0002BA01D8\r
+:102B20000003FF0000024BBA0002A0BA0003F0420B\r
+:102B30000003F4000001CAE5000042100002B001E9\r
+:102B40000002A0DE0003F041000380020002400802\r
+:102B50000003F0020003F4000001CAE50003400A8C\r
+:102B60000003FF000002B040000241080002A01074\r
+:102B700000020AE5000002260003FF000003FF0038\r
+:102B80000002C00E000082260002B1020002A40171\r
+:102B900000020A11000001EF000041F90003FF00EC\r
+:102BA0000003FF000003D8000003DC8000007A412E\r
+:102BB0000002B0000003D8010002B0010003DC01F4\r
+:102BC0000002308C000002130003FF000003FF002E\r
+:102BD0000002C00E00008213000231D00003400A40\r
+:102BE0000002B0800003FF00000240090003A004BF\r
+:102BF0000002B103000268010000022B0003FF0085\r
+:102C00000003FF000002400E0002A40E0003F00BC0\r
+:102C1000000012280002B0430002B1050002B30117\r
+:102C200000036A7400034A7C0003FF000002B00145\r
+:102C30000002B1060002B30400036A7C00034A6488\r
+:102C40000002B480000011EF00024004000260089E\r
+:102C50000003A2220002B3010002B10000036A6473\r
+:102C600000023095000230A200005A2B0002BA0385\r
+:102C70000002B9010003FF00000248BA0002A48963\r
+:102C80000001CB570002B9040003FF00000248BA5C\r
+:102C90000002A08A0001CB39000002250002B20820\r
+:102CA0000002B3000003FF000002A4020001CB57A2\r
+:102CB0000002A00E0003F04300009A250003F40078\r
+:102CC0000001CA5400024BB90002A0B90001CB5761\r
+:102CD000000092250003F4000001CA540003F40030\r
+:102CE0000001CB57000042100002B0010002A0DE3C\r
+:102CF0000003F04100038002000240080003F002DC\r
+:102D00000003F4000001CB570003402E0003FF0036\r
+:102D10000002B008000241080002A01000020B5798\r
+:102D20000002B080000241080003F00500000240EC\r
+:102D30000003FF000003FF000002A00E00020B577B\r
+:102D4000000002250003FF000003FF000003E8105D\r
+:102D500000008A250002A40E00020A5400005A2B2B\r
+:102D60000003FF0000034A700003FF0000024BBE97\r
+:102D70000002A0BE0003F0420002B28000036A70AD\r
+:102D8000000061F9000059EF0003FF000003DCC000\r
+:102D90000003D8B000007A410002B0000003D8015F\r
+:102DA0000002B0010003DC010003400D0002BD4041\r
+:102DB0000003FF0000024DD50002A6DE0003F00371\r
+:102DC00000022F2B0003F4040003F00A0002B07F7E\r
+:102DD0000002B1FF0002B2FF000368600003686BED\r
+:102DE000000011E50002B3C00003E8D00003604C0E\r
+:102DF00000022F660002B0010003E8100003E82083\r
+:102E00000003E83000036A60000231D00003EC00E8\r
+:102E100000006A3F0003FF000003FF000002A0DE85\r
+:102E20000003F0030002BB530003F4000003F04171\r
+:102E30000002BB5B0003FF000003FF000000D9FCA1\r
+:102E4000000340100002BB0F000348290002A0DE6F\r
+:102E50000003F0410003482D0002BF040002400BB4\r
+:102E60000003AB0200030FFB00038CF600026CCFE3\r
+:102E700000038FF6000349E80002A34C0003F004AE\r
+:102E80000003044C0003055F0003F4000003F04559\r
+:102E9000000384E6000385560003A556000265542E\r
+:102EA0000002644E0003C1040003C1150002A0DE4D\r
+:102EB0000003F00400036829000369E80003F4003C\r
+:102EC0000003F0420003682D000369EC0003E800F2\r
+:102ED0000002304F000348010002B0BF000244402E\r
+:102EE000000368010003E8000002B1400003E8208D\r
+:102EF0000003E83000036A440002B0010003E81058\r
+:102F00000003E8200003E83000036A600002BF020B\r
+:102F1000000231D500000A3B0000120C00001A0B21\r
+:102F20000002B0020002A0DE0003F0410002B00483\r
+:102F300000038116000260010003822A0002B184AE\r
+:102F4000000262210002A43E0003F0010002B3046B\r
+:102F50000002B11800036A600003400A0002B001D9\r
+:102F60000002B1020002B2120003E83000036A68F6\r
+:102F70000002B08000001241000240080003F0018E\r
+:102F80000003E8200002B0130002B1020003822611\r
+:102F90000003E83000036A700002B0210002B102B1\r
+:102FA0000002B2010002B30100036A740002B00122\r
+:102FB0000002B1020002B20F0002B30100036A78FE\r
+:102FC00000034A7C0003FF000002B0020002B102CD\r
+:102FD0000002B30400036A7C0003E8000003C000A1\r
+:102FE0000002B1BF0003C120000368600003E87065\r
+:102FF00000034A640002B4800002400400036A64D3\r
+:1030000000034A640002B480000011FC0002400486\r
+:103010000002B403000260040002B31000036A64FB\r
+:103020000002309500034A640002B40800024440E4\r
+:10303000000267740002A57E00020C3C0003E80059\r
+:103040000002304F0002A0DE0003F0040003482A13\r
+:10305000000349E80003F4000003F0420003482E97\r
+:10306000000349EC0002BC110002BF100002C99F1E\r
+:103070000002C88C0003C1080003C1190002A0DED1\r
+:103080000003F0040003682A000369E80003F40069\r
+:103090000003F0420003682E000369EC0002BB014C\r
+:1030A0000000DA3E0003E87000038BE500038BB6F6\r
+:1030B0000002A58B0003F0020003F4000001CBFC2A\r
+:1030C000000340120000F1F40002BF200002A0DE65\r
+:1030D0000003F00300026AAF0003F4000003F041B4\r
+:1030E00000026BBF000360120003F4000001CC3C3F\r
+:1030F0000002B0010003E8100003E8200003E830FC\r
+:1031000000036A6000034A640002B48000024004C5\r
+:1031100000036A640003EC0000006A3F0003E8005B\r
+:10312000000081D90002B008000081FB0002A0DE8F\r
+:103130000003F003000059F10003F4000003F04124\r
+:10314000000059F00002B07F0002A1FE0003F04130\r
+:1031500000024BB00000D9EF0002B0FF0002B1BF87\r
+:103160000003C120000368600002B0010003E81002\r
+:103170000003E8200003E83000036A6000000A3B17\r
+:103180000000120C00001A0B0002B0020002A0DEC8\r
+:103190000003F0410002B004000381160002600148\r
+:1031A0000003822A0002B180000262210002A43ED4\r
+:1031B0000003F0010002B304000340150002B1084F\r
+:1031C0000002B6F0000244460002611400036A6087\r
+:1031D0000002B0010002B1020002B2000002B3021C\r
+:1031E00000036A68000011FB0002B0130002B10284\r
+:1031F000000382260003E83000036A7000001228F2\r
+:103200000002B0210002B1020002B30100036A749F\r
+:103210000002B0010002B1020002B20F0002B301CD\r
+:1032200000036A7800034A7C0003FF000002B0013B\r
+:103230000002B1020002B30400036A7C0002BC0475\r
+:103240000003DCC0000079EF000061FB0002BB1846\r
+:103250000003D8F000022F0B000001D90003402525\r
+:103260000002BF100002C00E000081D900024F5FB3\r
+:103270000003F00300022D680003F4000001CCA954\r
+:103280000002BF080002A00E0003F0010003C1FE0F\r
+:103290000002330B00034A800002A0FE0003F0414D\r
+:1032A00000036A84000061EF0002B0800003E8F0D0\r
+:1032B0000002A1C00003F0410003C1FE00022D1B6B\r
+:1032C000000231D0000011EF0003E8100002B0232B\r
+:1032D0000003A2220002B30100036A6400023095D9\r
+:1032E000000061D9000001EF000009F90003402649\r
+:1032F0000002B2100003D8000003DC10000079FBCC\r
+:103300000002B0000003D8010002B0010003DC019C\r
+:10331000000242290003F0450003AFF00002A0CEF6\r
+:103320000003F0020003FB000003FB010003D09E3A\r
+:103330000003FB000002A52E0003F0010003FB00C8\r
+:103340000003D49F0003FB010002A52E0003F0013F\r
+:103350000003FB0100030FFE00020CCB000001D9AB\r
+:103360000003FF000003FF000002C00E000081D92F\r
+:10337000000061EF0002B0800003C1FE0002A1C0A6\r
+:103380000003F0410003E8F000022D1B000231D0E1\r
+:10339000000011EF0002B0030003E8100003A222B6\r
+:1033A0000002B30100036A6400023095000230A2FB\r
+:1033B00000034025000001D90002B1030002B20859\r
+:1033C0000002B310000243350003F0020002422560\r
+:1033D0000003F0020002A5010001CC96000061F993\r
+:1033E000000059EF0003FF000003DCC00003D8B069\r
+:1033F0000002B0000003D8010002B0010003DC01AC\r
+:10340000000079FB0003400D0002BD400003FF00F7\r
+:1034100000024DD50002A6DE0003F00300022F2BB0\r
+:103420000003F4040003F00A0002B07F0002B1FFC1\r
+:103430000002B2FF000368600003686B000011E542\r
+:103440000002B3C00003E8D00003604C00022F6606\r
+:103450000002B0010003E8100003E8200003E83098\r
+:1034600000036A60000231D00003EC000002BC11CE\r
+:103470000002A0DE0003F004000348CC000348D1A2\r
+:103480000003F4000003F042000348EC000348F19D\r
+:1034900000022D530002A0DE0003F004000368CCFC\r
+:1034A000000368D10003F4000003F042000368EC5D\r
+:1034B000000368F10002A0DE0003F004000348D41A\r
+:1034C000000348D90003F4000003F042000348F46D\r
+:1034D000000348F900022D530002A0DE0003F004AF\r
+:1034E000000368D4000368D90003F4000003F0422D\r
+:1034F000000368F4000368F90002A0DE0003F00393\r
+:10350000000348DC0003F4000003F041000348FC22\r
+:103510000002A0FE0003F0040002C00C0002C11C67\r
+:103520000003F4000003F0420003000C0003011C40\r
+:103530000002A0DE0003F003000368DC0003F400D7\r
+:103540000003F041000368FC0003EC000002A0FE51\r
+:103550000003F00A0002C00C0002C11C0002C22CD1\r
+:103560000002C33C0002C44C0002C55C0002C66CF1\r
+:103570000002C77C0003F4000003F0480003000CC5\r
+:103580000003011C0003022C0003033C0003044C55\r
+:103590000003055C0003066C0003077C0003EC00DD\r
+:1035A0000002B07F0002B1FF0002B2FF00036860BA\r
+:1035B0000003686B000009E50003E8000003A003B6\r
+:1035C0000003DC000003D810000340310002BF03F9\r
+:1035D0000002BC020002A6FC0003F0410003C10788\r
+:1035E0000002A0FC0003F0410003C1060002A0FE9F\r
+:1035F0000003F0410003C1050002A1FE0003F041F9\r
+:103600000003C1040003C1100003C1200003C13046\r
+:103610000003FE000003D41E0003686B0003FB00E0\r
+:1036200000030FFE00020D75000340350002BF03CA\r
+:103630000003FF000002A6FC0003F0410003C107E5\r
+:103640000002A0FC0003F0410003C1060002A0FE3E\r
+:103650000003F0410003C1050002A1FE0003F04198\r
+:103660000003C1040003C1100003C1200003C130E6\r
+:103670000003FE000003D41E0003686B0003FB0080\r
+:1036800000030FFE00020D8D000340380003403D93\r
+:103690000003FF0000036A8400036A810003EC005A\r
+:1036A00000036150000361550003615A0003615F2C\r
+:1036B000000348540003FF000003E8300003A33375\r
+:1036C000000368540003686B000348550003E800DA\r
+:1036D0000003E8700002B2EF0002B1FF0002B0BFC9\r
+:1036E000000368600003686B0003497C0002B404B7\r
+:1036F000000261140003697C0003493C0003FF00E1\r
+:103700000002611E0003693C00034A940003413932\r
+:103710000003FF000003FF000002A6370003F007CC\r
+:103720000002A6260003F0050002A6150003F00320\r
+:103730000002A5040003F00100036138000360FCEF\r
+:103740000003FF000003FE000003FF0000034864C5\r
+:103750000002B410000242240002A0240003F0433F\r
+:1037600000022E150003F4000001CDD00002B0FFCE\r
+:103770000002B1FF0002B2FF0002B3FF00036A9033\r
+:103780000003493C0003C04E000241140003693CA1\r
+:10379000000348540002B53F00024353000368543D\r
+:1037A0000003E800000081F40000821A0000821B80\r
+:1037B0000003486400038CEA0000F21500024C0C80\r
+:1037C0000003F048000348340003FF0000038008B2\r
+:1037D0000003A00C0002A00E0003F80100020DF18E\r
+:1037E000000082150003F803000348550003E800B9\r
+:1037F00000038707000368550003493D0002BF101E\r
+:103800000002444F0003F0040002BFFF00022E7BC1\r
+:103810000002BF5000022E7B0003A7700003077E4A\r
+:1038200000020E070003C0200003C0100003C00008\r
+:10383000000368600003686B0003A0100003686069\r
+:1038400000034150000341550003415A0003415F0A\r
+:103850000003EC000003F803000349D00002B8089D\r
+:10386000000249380002A09800020E68000349D403\r
+:103870000002B410000243340002A03400020E44DF\r
+:10388000000348080002B808000260080003680846\r
+:10389000000348280002B820000263380003482DC6\r
+:1038A00000036828000369E8000267780003682DB8\r
+:1038B000000369ED000348C80002B8FB000242287B\r
+:1038C000000368C8000348980002B820000260089E\r
+:1038D000000348B10003689800026448000368B11F\r
+:1038E0000003C10E0003C11E0003C12E0003C13E30\r
+:1038F00000036330000363700003633400036374E8\r
+:1039000000036338000363780003F4000001CE680D\r
+:10391000000348080002B8F70002400800036808E6\r
+:10392000000348280002B8DF000243380003482D96\r
+:1039300000036828000369E8000247780003682D47\r
+:10394000000369ED000348C80002B80400026228C1\r
+:10395000000368C8000348980002B8DF000240086E\r
+:10396000000348B10003689800024448000368B1AE\r
+:103970000002B0030003C1100003C1200003C130E6\r
+:103980000003633000036370000363340003637457\r
+:103990000003C12E0003C13E0003633800036378B7\r
+:1039A0000003497C0002B4FB000241140003697C5F\r
+:1039B0000003686B0003EC00000348CA0002B00477\r
+:1039C0000002B1400003C12800026820000368CA59\r
+:1039D0000003C182000368CA00026821000368CAAC\r
+:1039E0000003C182000368CA0003EC000003F8036F\r
+:1039F00000030FFE00020E7C0003EC000003E80051\r
+:103A00000003C0100003C0200003A0100003686082\r
+:103A10000003686B0003C10E0003E8100003E820F8\r
+:103A20000003E8300003A4130003D8100003DC40B7\r
+:103A30000003FE000003D41E0003686B000369A4AA\r
+:103A40000003E8000003FE000003D41E0003686BBF\r
+:103A5000000369A40002A0DE0003F003000342603B\r
+:103A60000003F4000003F0410003425C00034259EC\r
+:103A70000002A0DE000369A40003F0030003426813\r
+:103A80000003F4000003F04100034264000369A155\r
+:103A90000003FE000003D41E0003686B0003686B84\r
+:103AA0000003EC000003E8000003C0200003C01086\r
+:103AB0000003A010000368600003686B0003425617\r
+:103AC0000003C10E0003E8100003E8200003E83003\r
+:103AD0000003A4130003D8100003DC400003D41E2D\r
+:103AE0000002BF0200022E7B0003686B000369A482\r
+:103AF000000369A20003E8000003FF000003D41ED6\r
+:103B00000002BF0200022E7B0003686B000369A461\r
+:103B10000003E8000003C0200003C0100003C00041\r
+:103B2000000368600003686B0003EC000003686B2F\r
+:103B30000002B07F0002B1FF0002B2FF0003686024\r
+:103B40000002B10C0003E8000003A0030003DC0046\r
+:103B50000003D8100003E8000003E8100003E82089\r
+:103B60000003E8300003FE000003D41E0003686B6E\r
+:103B70000003FB000003FB00000388E30003F803DD\r
+:103B80000003FE000003D41E0003686B0003FB006B\r
+:103B90000003088E00020EE00003EC00000021FA92\r
+:103BA0000003E8500003E8600003E8700002B90871\r
+:103BB0000002B8C00003DC810003D891000342502A\r
+:103BC0000003F8030003FF0000036A440003E82039\r
+:103BD0000003011E00036A440003FE000003D45FDB\r
+:103BE0000003686B0002B4190003FE000003D45FF9\r
+:103BF0000003686B000349A50003FF000003FF00FA\r
+:103C00000003C1040003C115000382E00002622624\r
+:103C10000003C137000369A40002B9080003099E2C\r
+:103C200000020F07000369A50003EC000002A1BE1B\r
+:103C30000003F00A0003D01E00030FBE0003F803C8\r
+:103C40000003000E0003011E0003022E0003033ECA\r
+:103C50000003D41E00030FFE00020F100003FB0040\r
+:103C600000030CCE00020F0B0003EC000002A1BE0B\r
+:103C70000003F00A0003D01E00030FBE0003F80388\r
+:103C80000002C00E0002C11E0002C22E0002C33E8E\r
+:103C90000003D41E00030FFE00020F200003FB00F0\r
+:103CA00000030CCE00020F1B0003EC000003D09EAB\r
+:103CB0000003D01F0002BC3F0002488C0002499C58\r
+:103CC00000024AAC00024BBC0002440C0002451C3E\r
+:103CD0000002462C0002473C0002BC200002C084C7\r
+:103CE0000003A0000002A3480003F0410002C00C42\r
+:103CF0000002C1950003A1100002A3590003F04186\r
+:103D00000002C11C0002C2A60003A2200002A36A96\r
+:103D10000003F0410002C22C0002C3B70003A3302D\r
+:103D20000002A37B0003F0410002C33C0003E8D083\r
+:103D300000038CE9000304800002E88D0003059174\r
+:103D40000002E99D000306A20002EAAD000307B3EA\r
+:103D50000002EBBD0003626E0002488C0002499C29\r
+:103D600000024AAC00024BBC0003D49E0003426E2A\r
+:103D700000026445000264460002644700020F4DE1\r
+:103D800000006A3F0003FB000003FB0100030FFE7D\r
+:103D900000020F2B0003EC000003D09E0003D01F95\r
+:103DA0000002BC3F0002488C0002499C00024AAC61\r
+:103DB00000024BBC0002440C0002451C0002462CD1\r
+:103DC0000002473C0002BC200002C0840003A000A7\r
+:103DD0000002A3480003F0410002C00C0002C1959C\r
+:103DE0000003A1100002A3590003F0410002C11C0E\r
+:103DF0000002C2A60003A2200002A36A0003F04151\r
+:103E00000002C22C0002C3B70003A3300002A37B50\r
+:103E10000003F0410002C33C0002BC070002A3DC27\r
+:103E20000003F04E0003704C0003504E0003FF00EF\r
+:103E30000003FF000003FE000003D41E0003686BB4\r
+:103E40000003FB000003704E0003504C0003FF0012\r
+:103E50000003FF000003F4040003F0080002BC08A4\r
+:103E60000002A4DC0003F00100036A840002BC0924\r
+:103E70000002A4DC0003F00100036A800002B0FF2E\r
+:103E80000002B1BF0002B2FF000368600003FB0044\r
+:103E90000003FB010002CDDE0002A6DF00020F6678\r
+:103EA00000034A640002B4800002400400036A6414\r
+:103EB0000002B0000002B1000002B2000002B30133\r
+:103EC00000036A740002B0310002B1060002B204BD\r
+:103ED0000002B30000036A7800034A7C0003FF007D\r
+:103EE0000002B0010002B1010002B30000036A7CCD\r
+:103EF00000034A640002B480000240040002B403DC\r
+:103F00000002600400036A640002309500034A6402\r
+:103F10000002B4800002400400036A6400006A3FAB\r
+:103F20000002336C0003EC00000059F60000623E12\r
+:103F30000003FF000002A1BE0003F0420000F1F404\r
+:103F40000003EC000002A1CE0003F04100030BBE11\r
+:103F500000030CCE0000D9F60000E23E00034A4008\r
+:103F600000005A160003FF000003FF000002A0BE7D\r
+:103F70000003F0420003A0000003A2200003D05E73\r
+:103F80000000620A000059F20003A2020002400988\r
+:103F9000000242290002A58E00020FF50003088EE0\r
+:103FA0000002A00D0003F00B000042070002C44F06\r
+:103FB0000003C1540002A0BE0003F0460003D45E1B\r
+:103FC0000002C44F0003C1540003D45E0002C44F7A\r
+:103FD0000003C1540002A5AE0002100500030AAEA2\r
+:103FE0000002A02D0003F00B000052070002C66F74\r
+:103FF0000003C1760002A0BE0003F0460003D45EB9\r
+:104000000002C66F0003C1760003D45E0002C66FD3\r
+:104010000003C1760003D45E00030CCE000210063C\r
+:1040200000026B8A00020FCA0003EC00000342701A\r
+:104030000000521600038FEC000388EA0003AAA0D8\r
+:104040000002A4AE0003F0060002A1480003F04104\r
+:104050000002C4480002A1680003F0410002C668E3\r
+:1040600000038AE00002A64F0003F0430003044867\r
+:1040700000030008000301180002A66F0003F043CC\r
+:1040800000030668000302280003033800030AAE99\r
+:10409000000210190003C1540003C1760003D45E6E\r
+:1040A000000362700003EC000003C1620003066EAF\r
+:1040B0000003DC100003D8000003D09E0003FF00C3\r
+:1040C0000003FF0000024885000268830003C198D6\r
+:1040D0000003C1A80003C1B80003D49E0003FB0085\r
+:1040E0000003066E0002102E0003EC000003C11056\r
+:1040F0000003C1200003C1300002A0DE0003F0086D\r
+:10410000000369080003690C0003691000036914C7\r
+:10411000000369180003691C0003F4000003F04663\r
+:104120000003692000036924000369280003692C47\r
+:1041300000036930000369340003EC000003C11080\r
+:104140000003C1200003C1300002A0DE0003F0071D\r
+:10415000000368CC000368D0000368D4000368D86B\r
+:10416000000368DC0003F4000003F045000368EC82\r
+:10417000000368F0000368F4000368F8000368FCBB\r
+:104180000003EC00000349D40003FF00000380E5B6\r
+:1041900000024103000349D20003FF000002400A6D\r
+:1041A000000349C20002A5100003F001000349C644\r
+:1041B0000003EC000002B07F0002B1FF0002B2FF7A\r
+:1041C000000368600003686B0003E8000003E81068\r
+:1041D0000003C12E0002B330000369A40003E8000D\r
+:1041E0000002B1300003E8200003E8300003E8409B\r
+:1041F0000003A5430003D8400003DC500003FE0089\r
+:104200000003D41E0003686B0003FB000003FB00E7\r
+:104210000002B0120003E8100003FE000003D41EE9\r
+:104220000003686B0003088E000210860003EC0098\r
+:104230000003D09E0003FB000003FF000003FF000B\r
+:104240000003D49F0003FB0100030FFE0002108C4B\r
+:104250000003EC000003F8010002BF0400034A64FD\r
+:104260000003FF000003FF000002410F000210974F\r
+:104270000003F8030003686B0003FF000003FF0066\r
+:104280000003FE000003EC0000034A640003FF008B\r
+:104290000002BF080002410F0002A01F000210C36D\r
+:1042A000000340120002B5100002A5250003F0042F\r
+:1042B0000002BF0200026AAF0003F4000001D0C098\r
+:1042C0000002C4550002A5240003F0040002BF024E\r
+:1042D00000026BBF0003F4000001D0C00002C4451F\r
+:1042E0000002A5240003F0040002BF1000026AAF20\r
+:1042F0000003F4000001D0C00002BF1000026BBF39\r
+:104300000000F1F400036012000230C40003EC006E\r
+:1043100000034A700003FF000003C1C20003402EE7\r
+:104320000002B00100036AA80003FF000003FF00C1\r
+:104330000003FF0000034AAC0002B40200036AA9B4\r
+:104340000003C0000003C0110003C0220003C033FB\r
+:1043500000034AAD0002BF900002A0CF0003F005A9\r
+:104360000003C0440002BF0F00024F4F0003F400DF\r
+:104370000003F0410003C0F40002A0DE0003F00BD4\r
+:10438000000340190003FF000003FF000002644027\r
+:104390000002655100026662000267730003601943\r
+:1043A00000026AAF0003F4000003F0490003401D5F\r
+:1043B0000003FF000003FF0000026440000265519B\r
+:1043C00000026662000267730003601D00026BBF9B\r
+:1043D0000003602E0003EC000002C44600036AA93B\r
+:1043E0000003FF000003FF000003FF0000034AACCE\r
+:1043F0000003EC000002B07F0002B1FF0002B2FF38\r
+:10440000000368600003686B000009E50002B0C0AB\r
+:104410000003DC000003D8100002A0FE0003F0043B\r
+:104420000003E8000003E8100003E8200003E83080\r
+:104430000002A0FE0003F0440002B0550003C110CA\r
+:104440000003C1200003C1300002A0FE0003F004FD\r
+:104450000002B4FF0003C1540003C1640003C1742F\r
+:104460000002A0FE0003F0440002B4AA0003C154FD\r
+:104470000003C1640003C1740002BC070002A3FE74\r
+:10448000000211790000420D0003FF000003FF004D\r
+:104490000002A08E0002113F0002A0DE0003F00324\r
+:1044A000000340420003F4040003F001000340460F\r
+:1044B0000000EA3F00006A0E0002A4DE0003F004E0\r
+:1044C0000003C0880003C0990003C0AA0003C0BB5A\r
+:1044D00000026008000261190002622A0002633BC8\r
+:1044E00000026448000265590002666A0002677BA8\r
+:1044F00000006A3F0003FF000003FF000003FE000E\r
+:104500000003D41E0003686B0003FB0000030CCE05\r
+:104510000003FE000003D45E0003686B0003FB0091\r
+:1045200000030CCE0002113F0000420D0000620E9D\r
+:104530000003FF000002A08E000211640003404A45\r
+:104540000002A4CE0003F0040003C0880003C09959\r
+:104550000003C0AA0003C0BB0002A4DE0003F002F7\r
+:104560000003C18A0003C19B0002BA0F00024AA8DF\r
+:1045700000038BA600026AAB0002BBF000024BB83E\r
+:104580000003A7B600026BB70003F4040003F003B6\r
+:104590000003E8600003E8A00003E8B00002B4F004\r
+:1045A0000002604A0003C1100003C1200003C130B3\r
+:1045B00000036A840002A0FE0003F0030002B4F0CE\r
+:1045C0000003F4040003F0010002B40F0002604B8A\r
+:1045D0000003C1100003C1200003C13000036A8042\r
+:1045E0000003EC000003FE000003D41E0003686B10\r
+:1045F0000003FB0000030CCE0002B9030002A0F987\r
+:104600000003F0440003E8400003E8500003E860C2\r
+:104610000003E8700003FE000003D45E0003686B33\r
+:104620000003FB0000030CCE000211850002B0F075\r
+:104630000002B1FF0002A0F90003F0420003E8000D\r
+:104640000003E8100003C1210003C13100036A84A4\r
+:1046500000036A800003EC000002B07F0002B1FF9B\r
+:104660000002B2FF000368600003686B000009E508\r
+:104670000002B0C00003DC000003D8100002B4FF49\r
+:104680000003C1640003C1740002BC070003FE0004\r
+:104690000002B5FF0003D45E0003686B0003FB005B\r
+:1046A00000030CCE0003FE000002B5EF0003D45E51\r
+:1046B0000003686B0003FB0000030CCE000211A393\r
+:1046C0000002B5FF00036A850002B0F00003C110CC\r
+:1046D0000003C1200003C13000036A8000034A6266\r
+:1046E000000231D00003E8F0000231DC00036A620E\r
+:1046F000000009E50002B0C00003DC000003D81090\r
+:104700000002B4FF0003C1540003C1640003C1747C\r
+:104710000002BC070003FE000003D45E0003686BC8\r
+:104720000003FB0000030CCE000211C50002B0FF25\r
+:104730000002B1BF0003C120000368600003EC0069\r
+:1047400000034A640002B4800002400400036A646B\r
+:104750000003EC000002B0040002A0F00003F0032C\r
+:10476000000230FD0003F4040003F00100022D6894\r
+:104770000003E8000003C0000003C1100002B2FD06\r
+:104780000003686000000A3B0000320C00001A0BB6\r
+:104790000002B00A0002A0DE0003F0410002B00CEB\r
+:1047A00000038116000260010002B1160002A43E5F\r
+:1047B0000003F0010002B3040003866A0002B202A3\r
+:1047C0000002B4040002A3FE0003F0030002A0F400\r
+:1047D0000003F0010002B2040002622600036A60D6\r
+:1047E00000038FE100022E7B0003686B0003FF00D3\r
+:1047F0000003FE000003EC0000034A600003FF001A\r
+:104800000003E8300002600E00036A6000034A649F\r
+:104810000002B4F20002400400036A640003EC00EA\r
+:1048200000006A3F000340040003FF000002B804D8\r
+:10483000000245E00002A05E0003F0440002A0DE9A\r
+:104840000003F042000340240003FF00000061F871\r
+:104850000003FF000003FF000003DCC000038FEA39\r
+:104860000002A0DE0003F0010003E8F00003D8F02E\r
+:1048700000038CE40003C1B20003493D0002A0DE46\r
+:104880000003F041000349410003FF000002446EB1\r
+:104890000003F0010002BC07000240080003F043DF\r
+:1048A00000022F0B0003F4000003F04100022F1B55\r
+:1048B0000002446E0003F0090003E8C00003AB628D\r
+:1048C0000003A5600002455E0003F04300022F0BC9\r
+:1048D0000003F4000003F04100022F1B0003EC0072\r
+:1048E000000348C0000348C50003E8100003E85077\r
+:1048F0000002A0DE0003F008000368C000000231DF\r
+:1049000000000A300003FF000003FF00000368C03E\r
+:104910000003F4000003F046000368C50000222FE6\r
+:1049200000002A2E0003FF000003FF00000368C5FB\r
+:104930000003EC0000006A3F0003FF000003FF00DB\r
+:10494000000051F90002A0DE0003F003000059F15D\r
+:104950000003F4000003F041000059F00003FF00E1\r
+:104960000003DCA00003D8B0000340060003FF00F2\r
+:104970000003FF00000240E80003F0030002A0DE95\r
+:104980000003F041000340260003FF000003FF0086\r
+:10499000000349410002A00E0003F0430002A0DE24\r
+:1049A0000003F0410003C1450002454E0003F043FF\r
+:1049B00000038CE40003F4000003F04100038CE3E7\r
+:1049C000000389980003AA9C0002A0AE0003F00334\r
+:1049D00000022F0B0003F4000003F04100022F1B24\r
+:1049E000000340060003FF000003FF0000034941ED\r
+:1049F0000002408E0002A00E0003F0430002A0DE81\r
+:104A00000003F0410003C1450003E8C00003AB42CE\r
+:104A10000002454E0003F0070003A5400002455E7A\r
+:104A20000003F04300022F0B0003F4000003F041E9\r
+:104A300000022F1B0003EC000002A0DE0003F003C5\r
+:104A4000000348210003F4000003F041000348255F\r
+:104A50000003FF000002BB010003A26600038166A1\r
+:104A60000003A11600038776000260270003000BF5\r
+:104A70000003A70600038206000266210002A0DEF2\r
+:104A80000003F0040003682100036A890003F400B6\r
+:104A90000003F0420003682500036A8D0003EC0068\r
+:104AA00000038FED00022E7B0003E830000382E05C\r
+:104AB0000003E8100003E8000003683000038FEDF6\r
+:104AC00000022E7B0003E8F0000349700003E87049\r
+:104AD0000002B6010003C1510003C1400003683168\r
+:104AE0000002B8FC0003C1530003C1420002455854\r
+:104AF00000034974000232F8000368310003C15119\r
+:104B00000003C140000232F8000368310003C153C2\r
+:104B10000003C14200034998000232F800036831E3\r
+:104B20000003C1510003C140000232F800036831A4\r
+:104B30000003C1530003C1420003499C000232F844\r
+:104B4000000368310003C1510003C140000232F884\r
+:104B5000000368310003C1530003C142000348E869\r
+:104B6000000232F8000368310003C1510003C14064\r
+:104B70000002B710000232F8000368310003C1538D\r
+:104B80000003C142000232F8000368310003EC0068\r
+:104B90000003493D0002B008000240040003F00594\r
+:104BA00000034AA40003FF000003FF000002B20359\r
+:104BB00000036AA40002B004000241040002A01035\r
+:104BC0000003F046000348C0000348C50002B103DB\r
+:104BD0000002B503000368C0000368C50003EC00D1\r
+:104BE0000003FF000003FF000003FF000003EC00D0\r
+:104BF0000003614800036141000361460003627FD6\r
+:104C00000003C10E0003E8100003E8200003E830B1\r
+:104C1000000368E80003E8000003FF00000368E801\r
+:104C2000000341480003FF000003EC000002B07FD6\r
+:104C30000002B1FF0002B2FF000368600003686B6E\r
+:104C4000000009E50003E8000003A0030003DC0006\r
+:104C50000003D8100002BC030002B0F70002A0FE5F\r
+:104C60000003F0410002B07F0003C1100003C12027\r
+:104C70000003C1300002B4FF0003C1540003C1644B\r
+:104C80000003C1740003FE000003D41E0003686B20\r
+:104C90000003A0010003A1110003A2210003A3311E\r
+:104CA0000003FB000003FE000003D45E0003686BFA\r
+:104CB0000003FB0000030CCE000213210002B0FF32\r
+:104CC0000002BC080003C1100003C1200003C13072\r
+:104CD00000036A800002A4FE0001D33B0002A0FC96\r
+:104CE0000003F00200036A840003EC000002B0F746\r
+:104CF0000003A1010003A2110003A32100036A84A1\r
+:104D00000003EC000003493D0003FF000002B880EF\r
+:104D1000000264480003693D0002B0010002B102D4\r
+:104D20000002B23F0002422F0002B30000036A6893\r
+:104D30000002B0000002B1000002B2000002B302A3\r
+:104D400000036A740002B1010002B2080002B3005D\r
+:104D500000036A780002B0010002B20000036A7C1E\r
+:104D6000000011EF0002B0C00002400F0003A002DB\r
+:104D70000002600E0002B1000003A2220002B30193\r
+:104D800000036A640002B0FF0002B1BF0003C1204B\r
+:104D9000000368600003FF000003FF00000230957D\r
+:104DA0000002B87F000244480003693D0003EC00A4\r
+:104DB0000003E8000003E8100002B2030002B300A1\r
+:104DC000000368300003EC000003E8000000823FAD\r
+:104DD000000222FA0000F23F000222FA000233A889\r
+:104DE00000022E6E000349980002B4F7000241143D\r
+:104DF000000369980003C12E0003E8300003683007\r
+:104E000000000217000381E00003E8400002A00157\r
+:104E10000003F0010003C14E000234B20003480851\r
+:104E20000002B8FE00024118000368080003E80011\r
+:104E30000000823F0002245A0000F23F0002245A80\r
+:104E400000000217000381E00003FF000002A4102D\r
+:104E50000003F0020003C14E000234B2000234022B\r
+:104E60000003402C0002B8400002B9800002BBFFE2\r
+:104E700000034AA5000248180003F0010002BBCF5E\r
+:104E8000000249190003F0020002BA3F00024BBAC7\r
+:104E90000002455B00036AA50003F4000001C26C38\r
+:104EA000000349D10002B840000244780003844066\r
+:104EB0000003489C000385E20002600400026005D4\r
+:104EC0000003689C000368A0000368B4000368B88E\r
+:104ED00000034938000385E10003C0550002422564\r
+:104EE0000003693800036A5C0003A0E1000381E16C\r
+:104EF0000003E830000382E8000385E50002302A61\r
+:104F0000000343A6000380E80003FF000002488579\r
+:104F1000000268800003C1980003C1A80003C1B863\r
+:104F2000000363A6000363E60003E8000003E8D083\r
+:104F30000002303B0003C1DE0002303B0002306162\r
+:104F4000000384E20003C1C90003E800000381E11B\r
+:104F5000000383E40002C2310003022E0002C33EBC\r
+:104F6000000244490003F001000383E50003E85018\r
+:104F70000002302A000380EA0002302A000388E59C\r
+:104F8000000384E00002444C0003F002000388E4C4\r
+:104F90000002C88E0003C1980003C1A80003C1B875\r
+:104FA0000003632A0003636A00023061000381E2A8\r
+:104FB0000003A0E10003A396000382E40002C22ED6\r
+:104FC0000003E8500002302A0003A0E30002302A68\r
+:104FD00000023061000380E5000240A00003C11020\r
+:104FE0000003C1200003C130000364A8000364E88B\r
+:104FF000000380E0000282080002420200038224D3\r
+:10500000000091E30003EC000002306100034970EE\r
+:105010000002448E0003F0430002B5F30002422573\r
+:10502000000369700003E8700003C16E0003C15300\r
+:105030000003C142000368310002449E0003F006F1\r
+:105040000003499C0003A4E1000262240003C15351\r
+:105050000003C142000368310002448E0003F04D9A\r
+:105060000003499C000384E50003A5E70002400417\r
+:10507000000241150003A488000384400003854614\r
+:1050800000026005000261140003E8300003C12E35\r
+:1050900000036830000343A4000021E30002B50FC1\r
+:1050A0000003FF0000024005000260040003C1107D\r
+:1050B0000003C1200003C130000363A4000363E4C4\r
+:1050C000000381840003A01800038206000260022E\r
+:1050D0000003E8D00002304F0003C1DE0002304F71\r
+:1050E000000348900003A4BA0003A5E7000241159D\r
+:1050F0000002611400036890000368A8000368942C\r
+:10510000000368AC0003A0A60003C1100003C12087\r
+:105110000003C130000364240003646400038AB602\r
+:10512000000348210002B803000266680002B90FBC\r
+:105130000002BBFE000246690002666A0002477B6D\r
+:105140000003682100036A890003682500036A8D53\r
+:1051500000034808000348210002611E000368089C\r
+:10516000000348C80002B8400002B93F00026008CE\r
+:10517000000368C800024009000368C80002655EB9\r
+:105180000003682100036A890003682500036A8D13\r
+:105190000002455B0003682100036A89000368255B\r
+:1051A00000036A8D0003EC000003402C0002B840AD\r
+:1051B0000002B9800003E8B000034AA500024818C5\r
+:1051C0000003F0010002BB30000249190003F002A5\r
+:1051D0000002BAC000026BBA0002655B00036AA558\r
+:1051E0000003489C000348A10002BC7B0002400C65\r
+:1051F0000002444C0003689C000368A1000348B40B\r
+:10520000000348B90002400C0002444C000368B49B\r
+:10521000000368B900034890000384E20003A5E797\r
+:10522000000241150002611400036890000368A8A1\r
+:1052300000036894000368AC00034938000385E16B\r
+:10524000000262250003693800036A5C0003A0E1E4\r
+:10525000000381E1000383E8000382E8000385E5A1\r
+:105260000002302A0003E800000381E1000383E428\r
+:105270000002C2310003E8300003E8500002302A87\r
+:10528000000380EA0002302A000348080003482196\r
+:105290000003A8ED00024118000368080003A8EB12\r
+:1052A000000246680003C03E000245530003682127\r
+:1052B00000036A890003682500036A8D0003E84043\r
+:1052C000000234B20003EC00000349740003C16E15\r
+:1052D0000003E870000388480003C05E000385599E\r
+:1052E0000002422500026228000369740003C142E3\r
+:1052F0000003C153000368310003EC0000034808B9\r
+:105300000002B8FE00024118000368080003485478\r
+:105310000002BC600002622C00036854000349765E\r
+:105320000002BC10000264AC0003C15B0003C16E4C\r
+:105330000003E87000036831000232F800034854AB\r
+:105340000002BC9F0002422C000368540003C14AC3\r
+:1053500000036831000234540003EC000000F1DE69\r
+:105360000000F1DD0003C1FD0003C1CE00034804CD\r
+:105370000003C07E000243370003680400034808AE\r
+:105380000003FF00000384E80002600400036808D3\r
+:1053900000034998000385E20003C055000241154F\r
+:1053A000000384E5000260040003E8300003C12E1E\r
+:1053B000000368300003E8D000022ECB0003F801A0\r
+:1053C0000003400D0003FF000002B0010002400690\r
+:1053D0000002150B0002A0ED0003F0050002BB3E29\r
+:1053E00000024BB60003ABB00003F4040003F00D61\r
+:1053F0000002B0000002B2020003A36A00030BAE79\r
+:105400000002A0300003F00700030BBE0002A03E24\r
+:105410000003F00400030BBE0002A0320003F00101\r
+:1054200000030BBE0003F4040003F0010003E8B026\r
+:10543000000348190002B2E0000246620002666BF7\r
+:1054400000036819000349E50003FF0000024662FB\r
+:105450000002666B000369E50003C1AB00022E7F0A\r
+:1054600000022EE70002B40F00034A400003F801D7\r
+:105470000002A4400003F0060002A4410003F0046F\r
+:105480000002A4420003F0020002A043000215370C\r
+:105490000002CAAE0002B0200002A0A00003F0414A\r
+:1054A0000003E8A00002A0AB0002155F000348194A\r
+:1054B0000002B2E0000246620002666A0003681958\r
+:1054C000000349E50003FF00000246620002666A2D\r
+:1054D000000369E50003F404000215180000D1DFA1\r
+:1054E0000002A0DE0002153E0000D1E00002CDDE89\r
+:1054F0000003F404000214EF000041E00003FF0089\r
+:105500000003FF000002A0A8000215650002A1A888\r
+:105510000003F048000348210003038A000383309E\r
+:10552000000267730003682100036A890003F40422\r
+:1055300000021565000348190002B2E0000246624D\r
+:105540000002666800036819000349E50003FF00D4\r
+:105550000002466200026668000369E50003482510\r
+:10556000000303A80003833000026773000368256B\r
+:1055700000036A8D0003F404000215650003401166\r
+:105580000003E8C00000F1F40002B8800002677870\r
+:10559000000360110003C1DF00034998000385E2A6\r
+:1055A0000003C05500024115000369980003E8306C\r
+:1055B0000003C12E00036830000348080003FF0009\r
+:1055C000000384C800026004000368080003F803B5\r
+:1055D0000003EC000003FF000003FF0000006A3F2F\r
+:1055E0000003E80000008219000081DC0002B00125\r
+:1055F0000002B1110002B21000036A440002B110AF\r
+:105600000003E82000036A44000340240002A0DEF7\r
+:105610000003F0030002BB530003F4000003F04159\r
+:105620000002BB5B0000D9FC0002400E0003F04BFF\r
+:10563000000340100002BC040003DCC000038FEA3A\r
+:105640000002A0DE0003F0010003E8F00003D8F040\r
+:105650000002BC090003C1B100022F0B000340246B\r
+:105660000003FF000002BC020002400C0003F04BEC\r
+:10567000000340100002BC040003DCC00002BFC0F5\r
+:105680000002A0DE0003F0010002BF800003D8F09A\r
+:1056900000038CE40003C1B100022F0B0003499802\r
+:1056A000000388E50002B5FD0003C13E0002A0DE54\r
+:1056B0000003F001000383300003C12E00026008E4\r
+:1056C0000002411500036830000348080002B4409E\r
+:1056D000000081F50002600400036808000348012F\r
+:1056E0000002B0BF00024440000368010003E8006C\r
+:1056F0000002B1400003E8200003E83000036A44E0\r
+:105700000003402E0002B0010003E8100003E8206F\r
+:105710000003E83000036A6000022D680002B00157\r
+:105720000002B1020002B2060003E83000036A681A\r
+:10573000000012410002B0130002B10200038226F1\r
+:105740000003E83000036A700002B0210002B102D9\r
+:105750000002B2040002B30100036A740002B00147\r
+:105760000002B1020002B20F0002B30100036A7826\r
+:1057700000034A7C0003FF000002B0000002B100F9\r
+:105780000002B30400036A7C0002BF180002365115\r
+:105790000002367E0002BF00000231D500034A70CD\r
+:1057A0000003FF000003FF000002B29000036A70D4\r
+:1057B0000002BF13000236510002367E000340246F\r
+:1057C0000003FF000003FF000002400E0003F04B47\r
+:1057D000000340100002BC040003DCC000038FEA99\r
+:1057E0000002A0DE0003F0010003E8F00003D8F09F\r
+:1057F0000002BC0900038B1000022F1B0003402491\r
+:105800000003FF000002BC020002400C0003F04B4A\r
+:10581000000340100002BC040003DCC00002BFC053\r
+:105820000002A0DE0003F0010002BF800003D8F0F8\r
+:1058300000038CE400038B1000022F1B00034A704E\r
+:105840000003FF000003FF000002B28000036A7043\r
+:105850000002BF18000236510002367E0002BF006F\r
+:10586000000231D500034A700003FF000003FF006F\r
+:105870000002B29000036A700002BF1300023651AA\r
+:105880000002367E000340240003FF000003FF00F7\r
+:105890000002400E0003F04B000340100002BC0465\r
+:1058A0000003DCC000038FEA0002A0DE0003F00169\r
+:1058B0000003E8F00003D8F00002BC090003C1B106\r
+:1058C00000022F0B000340240003FF000002BC0273\r
+:1058D0000002400C0003F04B000340120002BC0425\r
+:1058E0000003DCC00002BFC00002A0DE0003F00124\r
+:1058F0000002BF800003D8F000038CE40003C1B9AC\r
+:1059000000022F0B0002B0010003E8100003E820A2\r
+:105910000003E83000036A6000034A640002B480B8\r
+:105920000002400400036A64000021F50003FF0048\r
+:10593000000348080003FF000003C10400036808D7\r
+:105940000003EC000003E8000003C0000002B1BF48\r
+:105950000003C120000368600002B0010003E810EA\r
+:105960000003E8200003E83000036A6000034A6493\r
+:105970000002B4800002400400036A6400000A3B95\r
+:105980000000120C00001A0B0002B0020002A0DEA0\r
+:105990000003F0410002B004000381160002600120\r
+:1059A0000003822A0002B184000262210002A43EA8\r
+:1059B0000003F0010002B3040003C11F00036A608A\r
+:1059C00000034A640002B480000011FC000240049D\r
+:1059D0000002B403000260040002B31000036A6412\r
+:1059E000000230950002BF0800024FF00003F001F2\r
+:1059F0000000F2190003EC00000002190003FF0090\r
+:105A00000003FF000002A50E0003F0010003EC00FC\r
+:105A10000003E80000008219000340120003FF00A9\r
+:105A20000003FF000002448E0002A04E0003F001BC\r
+:105A30000000F1F40002BF400002A0DE0003F0030A\r
+:105A400000026AAF0003F4000003F04100026BBFE4\r
+:105A500000036012000230C4000079DC0003FF0084\r
+:105A6000000340280002A0FE0003F0410003EC0008\r
+:105A70000002A0DE0003F0050002C00E0003F041AA\r
+:105A80000002C11E0003F4000003F0430002C22E16\r
+:105A90000003F0410002C33E000360280000F1DC77\r
+:105AA0000003EC000000021400000A4000006A3FFE\r
+:105AB0000003FF00000240010002A00E0003F001FD\r
+:105AC0000003EC000003489C000348A100034A4A7D\r
+:105AD0000002A0DE0003F043000348B4000348B90D\r
+:105AE00000034A4E0002BC100002622E0002666EE5\r
+:105AF0000002688C0002699C0002A0DE0003F00531\r
+:105B00000003689C000368A100036A4A0003F400D4\r
+:105B10000003F043000368B4000368B900036A4E51\r
+:105B20000003E8C00000E1DB0002B0100002B10099\r
+:105B30000002B2100002B300000362740002B080E1\r
+:105B40000003D8010002B0000003DC010002B01223\r
+:105B50000002B1020002B2120002B302000362743A\r
+:105B60000002B0100002B1120002B2100002B31223\r
+:105B700000036270000362440002B1020002B3023B\r
+:105B80000003624C000362480003402C0003FF0046\r
+:105B90000003FF000003E8200003E8300003602C4E\r
+:105BA0000003E8000003E810000061DB0003601858\r
+:105BB0000003601C0003C18C0003C19C0003C1AC46\r
+:105BC0000003C1BC0002377300023577000061DBBF\r
+:105BD0000003FF000002B0000003DC000002B04040\r
+:105BE00000038FC20002C00F0003D800000340185A\r
+:105BF0000002A0DE0003F0410003401C0003402D22\r
+:105C00000003FF000003D41E0003D45F0002BF00A6\r
+:105C10000003DCF00002BFC0000388C20002CFF81E\r
+:105C20000003D8F00003C4000003C4110003C42221\r
+:105C30000003C4330002B50F000244650003A566EB\r
+:105C40000002A0DE0003F0430002B50F000244751D\r
+:105C50000003A5760003A6420003844A0003A7526E\r
+:105C60000003855A0003C4440003C4660002C00157\r
+:105C70000002C0040002C2230002C2260003C415B1\r
+:105C80000003C4370003D41E0003427500034272B0\r
+:105C90000002BF100002A1040003F0460002A509A3\r
+:105CA0000003F0040003C18C0003C1900003C1ACE9\r
+:105CB0000003C1B00002A3090003F0420003C1AC1D\r
+:105CC0000003C1B000036272000342460002A12635\r
+:105CD0000003F0460002A5290003F0040003C18C74\r
+:105CE0000003C1920003C1AC0003C1B20002A329AA\r
+:105CF0000003F0420003C1AC0003C1B200036246DE\r
+:105D00000003424E0002A1150003F0460002A5194F\r
+:105D10000003F0040003C18C0003C1910003C1AC77\r
+:105D20000003C1B10002A3190003F0420003C1AC9B\r
+:105D30000003C1B10003624E0003424A0002A137D2\r
+:105D40000003F0460002A5390003F0040003C18CF3\r
+:105D50000003C1930003C1AC0003C1B30002A33927\r
+:105D60000003F0420003C1AC0003C1B30003624A68\r
+:105D7000000362740003FB010002B1100002CCCEEC\r
+:105D80000000E1DB0002A0C10001D6E20003427086\r
+:105D9000000342450003FF000002C8020003A88080\r
+:105DA0000002CA460003AAA00003424C0003424975\r
+:105DB0000003FF000002C9020003A9900002CB46C5\r
+:105DC0000003ABB0000237730003EC000003489CF3\r
+:105DD000000348A10002A0DE0003F042000348B423\r
+:105DE000000348B90003C1180003C15A0003899693\r
+:105DF00000038BB6000261190002655B0002A0DEA1\r
+:105E00000003F0040003689C000368A10003F40091\r
+:105E10000003F042000368B4000368B90003EC001B\r
+:00000001FF\r
diff --git a/firmware/radeon/CAICOS_me.bin.ihex b/firmware/radeon/CAICOS_me.bin.ihex
new file mode 100644 (file)
index 0000000..0058adc
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000C00E0001CC000045CC00004ACC41225CBE\r
+:1001C000CC41A1FCD44DA1FD7C408000A0000000EA\r
+:1001D000CC80004D80000000CC41225DCC00004569\r
+:1001E000CC00004A084C00017C4100007C414000EA\r
+:1001F0001D58FFFF195C03F015600015CD81A102A9\r
+:10020000CDC12256CE01225C94C0000521240020DD\r
+:10021000CE41A1FC8000007B08CC0001CD01A1FCF7\r
+:10022000CC01A1027C408000A0000000CC80004DE9\r
+:100230007C4080007C40C000C02A00027C4100005D\r
+:100240007D2900071C9400011C9800061C9C0300DB\r
+:1002500015DC00087C4200007C4240009540000F05\r
+:10026000C02E000405F022587F2F0007CC3100007B\r
+:10027000C8280004CCC12169CD01216ACE81216B3F\r
+:1002800029B40002CC01216C9740000E29B4000073\r
+:10029000800000BBC834000E29B40002974000095A\r
+:1002A00029B40000C02E000405F022587F2F00075B\r
+:1002B000CC310000C8280004800000BBC834000E08\r
+:1002C000974000047E028000800000BBC834000E0E\r
+:1002D00029B400049740FF4B00000000CE01216DBF\r
+:1002E000CE41216EC8280003C834000E9B40000494\r
+:1002F000C83C000E84000343CC00004D29F40000EC\r
+:10030000974000070430A2B6840000DDCE81A2B77A\r
+:10031000CF81A2C480000000CFC1A2D129F4000186\r
+:10032000974000070430A2BA840000DDCE81A2BB52\r
+:10033000CF81A2C580000000CFC1A2D229F4000263\r
+:10034000974000070430A2BE840000DDCE81A2BF2A\r
+:10035000CF81A2C680000000CFC1A2D30430A2C2C8\r
+:10036000840000DDCE81A2C3CF81A2C7800000003F\r
+:10037000CFC1A2D4C02E00047F2F0007CC310000D3\r
+:10038000C82C0004C03000067EF34023C03000209B\r
+:100390007F6B8020880000007FB3C024CC00004227\r
+:1003A00080000000CC40001F7C40C0007C41000069\r
+:1003B0001914003D994000130414002E8400049D7C\r
+:1003C0000418002984000264C81C00130414002AC5\r
+:1003D0008400049D0418002DCD41A2A4C81C001364\r
+:1003E00095C00000C81C0013CCC12100CD01210123\r
+:1003F000CCC12102CD0121038000049ACD81A2A4A9\r
+:100400001D18100095800005C81C001329E4004049\r
+:100410009640FFFFC81C0013CCC12175CD01217689\r
+:10042000C820001496000000C820001416280001FF\r
+:100430009A800004CC00004F8000049ACC00007F1A\r
+:1004400080000107CCC121757C40C0007C410000C8\r
+:10045000CC000045CC00004A40D40003CD41225CD2\r
+:10046000CD01A1FCC01E00017C42000008CC0001AF\r
+:100470000624000106280002CE1DA1FDCE5DA1FDCF\r
+:1004800098C0FFFACE9DA1FD7C408000A000000036\r
+:10049000CC80004D7C40C0001CD0000114CC000179\r
+:1004A0007C414000950000067C418000CD41216DDB\r
+:1004B000CD81216E80000133C81C0003C0220004DE\r
+:1004C0007E160007CC210000C81C00047C424000BE\r
+:1004D00098C000047C42800080000000CDE5000050\r
+:1004E000CE412169CE81216ACDC1216B80000000FF\r
+:1004F000CC01216C7C40C0007C4100007C4140006C\r
+:100500007C4180007C41C00018A41FE82A68003CA0\r
+:100510009680000A7C0200007C4200003A30000312\r
+:10052000CC0000589B00000342200005042000403E\r
+:100530008000014F7C0240007E0240009A40000093\r
+:100540000A6400011CEC00109AC0000ACC00004DA7\r
+:10055000C02A0004C82C00207E928007CC000041F5\r
+:10056000CC290000CEC0001E8000015FC83000040E\r
+:10057000CD01216DCD41216EC83000037F1F0006E3\r
+:100580001CF40007137800019740002A07B80164A3\r
+:100590009F80000000000000800001747F1B800E1F\r
+:1005A000800001787F1B800F8000017C7F1B800C06\r
+:1005B000800001807F1B800D800001847F1B8011E3\r
+:1005C000800001887F1B80108000018D14A400082A\r
+:1005D0009B80001914A400088000019D1E6400FF88\r
+:1005E0009B80001514A400088000019D1E6400FF7C\r
+:1005F0009B80001114A400088000019D1E6400FF70\r
+:100600009B80000D14A400088000019D1E6400FF63\r
+:100610009B80000914A400088000019D1E6400FF57\r
+:100620009B80000514A400088000019D1E6400FF4B\r
+:1006300014A400081E6400FF2A68003C9A80FE7122\r
+:1006400014EC00087C4340007C4380007C43C000E5\r
+:1006500096C00007CC00004DCF412169CF81216AAF\r
+:10066000CFC1216B80000000CC01216C8000000014\r
+:10067000CFF50000CC0000598400049D2A68003C9E\r
+:100680009A800004C828001780000000D440007F32\r
+:100690009680FFAB7E02400084000296C00E0002EE\r
+:1006A000CC000041800001ABCCC1304A9400000076\r
+:1006B000C83C001C7C40C0007C410000C01E000102\r
+:1006C00015240012C022000296400005C026000436\r
+:1006D000C027FFFB7D250006C02600007DD28006D6\r
+:1006E0007E12C0067D2500077C4140007C418000D1\r
+:1006F000CCC121699A80000CCD01216ACD41216BCA\r
+:1007000096C0FE40CD81216C8400049DCC00007F0A\r
+:10071000C830001A97000000C830001A800000019D\r
+:100720007C4080008400049DCC00007FC81400152C\r
+:10073000C8180016CD41216B96C0FE32CD81216CC8\r
+:10074000800001C2CC00007F7C40C0007C40800063\r
+:1007500014940010115400051C88FFFF1088000538\r
+:100760007C40C00014D000101CCCFFFFC01A000455\r
+:1007700005981BA4CC190000C81800041D980FFF91\r
+:100780007D1900109900FE1F7D8D00109900FE1D3F\r
+:10079000CC000058CC0000598400049DCC81217409\r
+:1007A000C80C001794C0FFFFCC0000598000000166\r
+:1007B0007C408000CC0003E5C82C0020C00E204007\r
+:1007C0000410300020CC226B04143001CC00004116\r
+:1007D000D0110000CCD50000CEC0001EC80C00090E\r
+:1007E00098C00000C80C00097C4100007C4140001A\r
+:1007F000CC0003E7CC0003E8CC0003E9CC40004385\r
+:10080000CC400044D440007F800000007C80C000C9\r
+:100810007C40C00018D001E81128000195000010AC\r
+:1008200006A802099E80000000000000800002214E\r
+:10083000C01208008000022FC81400118000023688\r
+:10084000C81400128000023DCCC1A2A48000024660\r
+:100850001CE8003F8000026E7CC1800B1CD0003F72\r
+:1008600029280006292C00167EAE8007C81C00131C\r
+:100870009A80003D0414002E80000000CCC1A2A488\r
+:10088000C01208007C4140007D0CC007C012000867\r
+:1008900015580003155C000C7C4200007DD1C00699\r
+:1008A000122000147E1E40077E4E8007CE81A2A437\r
+:1008B00080000000CD81A1FEC81400110410211891\r
+:1008C00095400000C8140011D451000080000000C1\r
+:1008D000CCC1A2A4C8140012041021069540000047\r
+:1008E000C8140012D451000080000000CCC1A2A4A2\r
+:1008F000CCC1A2A404100001CD0000198400049D05\r
+:10090000CC00007FC810001B99000000C810001B1D\r
+:10091000800000017C4080002AA000042AA400146A\r
+:100920007E2600070414002E9600000804180029F3\r
+:1009300084000264C81C00130414002A8400049D6F\r
+:10094000040C002DCD41A2A404102100C81C0013EA\r
+:1009500095C00000C81C0013D45100008000049A08\r
+:10096000CCC1A2A48400049D041800298400026460\r
+:10097000C81C00130414002A8400049D0418002DD0\r
+:1009800084000264C81C0013800000017C408000C9\r
+:1009900095C00000C81C0013CD41A2A4CC012100C9\r
+:1009A000CC012101CD812102CD812103CD81A2A4E1\r
+:1009B00088000000CC00004D1D9800017C41000023\r
+:1009C0007C414000998000097C420000C83C003214\r
+:1009D00011980010C81C000B3BFC000197C0FFFFE2\r
+:1009E000C83C003280000280C83C003311980010DF\r
+:1009F000C81C000A3BFC000197C0FFFFC83C003345\r
+:100A00001568001D7D5940079A80000411E4000A12\r
+:100A10007E260007CDC00066CD012158CD41215969\r
+:100A2000CE01215ACCC1A2A49A8002100510000464\r
+:100A3000042C000112F0001D7D71400712E000102F\r
+:100A40002220000CCD012158CD412159CE01215A3F\r
+:100A50008000049ACCC1A2A4043C0005CFC1A2A48A\r
+:100A6000C036000288000000CF4120107C40C0004A\r
+:100A700014D0001D9900000814D4001C9540FD619D\r
+:100A8000C026000422642154CC2500008000000010\r
+:100A9000C82800048000049ACD4000618400049DB1\r
+:100AA0001C7400011C7800029B400003C80C002944\r
+:100AB00084000342C814002B9B8000030410001024\r
+:100AC00084000352CCC1A250CD01A0508400030F7A\r
+:100AD000041804008400049DCC000063C83C002D71\r
+:100AE0008400031DC8100029C81C002F1DDC000154\r
+:100AF000C824002795C00009C8340031C838003028\r
+:100B0000C83C002D537400207FB7802747B805509C\r
+:100B1000CC000062CFFA00009A400000C8240027F1\r
+:100B2000C82800233AA800029A80FFFFC8280023A3\r
+:100B3000C0300001C82800249A800000C828002482\r
+:100B4000CF00005B50D8000814DC0018C03E100035\r
+:100B500021DC80007DFDC007CD812180CDC12181B8\r
+:100B6000C01E002051200008152400187E7E40077A\r
+:100B70001330001E7E7240077D5D4007CE0121824A\r
+:100B8000CE412183CD4121847C408000A000000023\r
+:100B9000CC80004D8400049D1C7400011C78000270\r
+:100BA0009B400003C80C002A84000342C814002C98\r
+:100BB0009B8000030410001084000352CCC1A2608B\r
+:100BC000CD01A0608400030F041809808400049DF7\r
+:100BD000CC000064C83C002E8400031DC810002A0D\r
+:100BE000C81C002F1DDC0001C824002895C0000986\r
+:100BF000C8340031C8380030C83C002E537400207F\r
+:100C00007FB7802747B80554CC000062CFFA0000B8\r
+:100C10009A400000C8240028C82800233AA80002EF\r
+:100C20009A80FFFFC8280023C82800259A8000006A\r
+:100C3000C8280025800002D0C03000020598C000FE\r
+:100C400010DC000814E00018CDD90000C81C0022F8\r
+:100C5000C82400221DDC0FFFCDD900017E624007B1\r
+:100C6000CE590002D8185103D8185104880000004A\r
+:100C7000D81851071BF800F0C03608009780000311\r
+:100C8000C030008088000000C02A0004CF41217CD1\r
+:100C9000CF01217DCD01217E22A8217F04240008DF\r
+:100CA0009A4000000A640001CC290000C82000041A\r
+:100CB0001638001F9B80FFFB0424000888000000FA\r
+:100CC00000000000C82400247C4100009A4000007D\r
+:100CD000C8240024800000017C408000C824002536\r
+:100CE0007C4100009A400000C824002580000001DB\r
+:100CF0007C408000840003427C40C0007C40800037\r
+:100D0000A0000000CC80004DC83C000E97C000033E\r
+:100D1000D30003E688000000043C0005CFC1A2A474\r
+:100D2000CC01A1F48400049DCC00004788000000A1\r
+:100D3000CC00007F840003527C40C0007C408000D7\r
+:100D4000A0000000CC80004D043C0022CFC1A2A432\r
+:100D50008400049DCC00004888000000CC00007F87\r
+:100D60008400035D7C40C0007C408000A000000047\r
+:100D7000CC80004D043C0023CFC1A2A4CC01A1F340\r
+:100D80008400049DCC00004988000000CC00007F56\r
+:100D9000800000007C40C000800000007C40C0005B\r
+:100DA000C01200017C51400780000000D4550000B3\r
+:100DB000CC400065C838002DC83C002EC035E0008E\r
+:100DC000C03200047FB780067FF7C00623B810004A\r
+:100DD00023FC1000CF812154CFC12155CC312155A6\r
+:100DE000C82C0004C81C0025C82400247DE5C007C9\r
+:100DF00099C0FFFEC81C0025800000017C408000D7\r
+:100E00007C40C0007C41000019280030968000081A\r
+:100E1000C8280027C82400289A400000C8240027BA\r
+:100E20009A400000C8240028CC0003E07C41400028\r
+:100E30007C418000151C001FCCC000C7CD0000C83D\r
+:100E400095C00003C01C8000CDC12010E1830000CC\r
+:100E5000055C2000CC00004D80000000DC1F41003C\r
+:100E60007C40C0007C4100007C4140007C4180000F\r
+:100E7000CCC000C9CD0000CAE1830000055CA00021\r
+:100E800080000000DC1F41007C40C0007C4100006D\r
+:100E90007C4140007C418000CCC000CBCD0000CC28\r
+:100EA000E1830000055CE94080000000DC1F410098\r
+:100EB0007C40C0007C4100007C4140007C418000BF\r
+:100EC000CCC000CDCD0000CEE1830000055CE88001\r
+:100ED00080000000DC1F41007C40C0007C4100001D\r
+:100EE0007C4140007C418000CCC000CFCD0000D0D0\r
+:100EF000E1830000055CC00080000000DC1F4100B1\r
+:100F00007C40C0007C4100007C4140007C4180006E\r
+:100F1000CCC000D1CD0000D2E1830000055CF00020\r
+:100F200080000000DC1F41007C40C0007C410000CC\r
+:100F30007C4140007C418000CCC000D3CD0000D477\r
+:100F4000E1830000055CF3FC80000000DC1F410031\r
+:100F5000D44320007C408000A0000000CC80004DE5\r
+:100F6000D443A0007C408000A0000000CC80004D55\r
+:100F7000D443E9407C408000A0000000CC80004DBC\r
+:100F8000D443E8807C408000A0000000CC80004D6D\r
+:100F9000D443C0007C408000A0000000CC80004D05\r
+:100FA000D443F0007C408000A0000000CC80004DC5\r
+:100FB000D443F3FC7C408000A0000000CC80004DB6\r
+:100FC000041CA000CC43A0007C40C000D81FC1007E\r
+:100FD0007C408000A0000000CC80004D041CC000BC\r
+:100FE000CC43C0007C40C000D81FC1007C408000C2\r
+:100FF000A0000000CC80004D7C40C0007C4100007F\r
+:1010000094C000037C4140007C418000CC03F3FC91\r
+:10101000CC43F3FCCC43F3FC7C408000A0000000F8\r
+:10102000CC80004DC01E0010C80C002950D0000814\r
+:1010300010540002800004157D158020C01E002081\r
+:10104000C80C002A50D000080854040011540002B3\r
+:101050007D518020CDC00062D45A00007C408000C9\r
+:10106000A0000000CC80004D7C40C0001CD00003DC\r
+:10107000112800019500000A06A8041F9E800000A8\r
+:101080007C4180008000042D7C41C000800004333E\r
+:101090007C41C000800004397C41C0007C4180005C\r
+:1010A0007C41C00014D400100554A0008000000052\r
+:1010B000CD950000C02200040598A0007DA1800706\r
+:1010C000CC19000080000429C8180004C0220004C4\r
+:1010D000CD8125D6222025D7CC21000080000429EF\r
+:1010E000C8180004CD81216DCDC1216E8000042976\r
+:1010F000C81800037C40C00080000000CC4C03E016\r
+:101100001C8CFFFFD44D00007C408000A00000003C\r
+:10111000CC80004DC8140023315800049580FFFF97\r
+:10112000C8140023CC00005BCC412180204C8000FF\r
+:10113000CCC1218114D0001FCC412182CC4121831C\r
+:101140009500FBB0CC412184C81400239940FFFFD7\r
+:10115000C8140023800000017C408000C0160004F9\r
+:1011600021542140CC550000C81800048000000024\r
+:10117000CC0003E07C40C00018D00038C0160080CE\r
+:1011800095000003C02A00047CD4C007CCC1217C98\r
+:10119000CC41217DCC41217E7C41800014FC001F8C\r
+:1011A0001D98FFFF39B0000322A0217F9B000003A0\r
+:1011B000419C0005041C004099C0000009DC0001AE\r
+:1011C000CC210000C8240004166C001F419C0005BF\r
+:1011D0009AC0FFFACC80004D9BC0FB8A0000000043\r
+:1011E00080000000CC0003E07C40C0007C41000097\r
+:1011F0001518001F511400209980000B191C003194\r
+:10120000CD0000627D4D4027D456000095C0FB7D87\r
+:10121000C82000269A000000C82000268000000197\r
+:101220007C408000E03A0000C0260004CCC1216967\r
+:101230007D250007CD01216A0BB80002CC41216B4E\r
+:101240009B80FFFECC41216C99C0FD30CC00007F1B\r
+:10125000800000017C408000C00E0100CC000041F5\r
+:10126000CCC1304AC83C007FCC00007F8000000029\r
+:10127000CC00007FCC00007F88000000CC00007F05\r
+:10128000000000000000000000000000000000005E\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001044000100003001200050015001A3E\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007500300077003200E80034008C77\r
+:1014500000350062003900EA003A0112003B012524\r
+:10146000003C013D003D01AD003E01D2003F00E7E0\r
+:1014700000410445004204570043045D004401ED6F\r
+:101480000045013D004602040047020400480204F2\r
+:10149000004A029B004B0364004C02A7004D02E58A\r
+:1014A000004E0331004F0337005103580052033DF3\r
+:1014B0000053034D00540366005703680060038027\r
+:1014C000006103980062036C006303A2006403AC34\r
+:1014D000006503B6006603C0006703CA006803D452\r
+:1014E000006903D8006A0409006B03DC006C03E0A8\r
+:1014F000006D03E4006E03E8006F03EC007003E48A\r
+:101500000071040F007203FE007303F0007403F710\r
+:101510000075041A007D043D007A047A000F0496D9\r
+:10152000000F0496000F0496000F0496000F049617\r
+:10153000000F0496000F0496000F0496000F049607\r
+:10154000000F0496000F0496000F0496000F0496F7\r
+:10155000000F0496000F0496000F0496000F0496E7\r
+:10156000000F0496000F0496000F0496000F0496D7\r
+:10157000000F0496000F0496000F0496000F0496C7\r
+:00000001FF\r
diff --git a/firmware/radeon/CAICOS_pfp.bin.ihex b/firmware/radeon/CAICOS_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..1f6373f
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC4000298000035FCC40002AC5\r
+:100040009900000500000000CC40002B8000035FF9\r
+:10005000CC40002CCC40002D8000035FCC40002E13\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:100070008000035FCC0000528000035FCC0000547E\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000042F4\r
+:1000E000CD400042D10000427C40C000C81800034F\r
+:1000F000C81C0003C82000039580FFC2C824000369\r
+:1001000095C0FFC0C828001D9A800004CC0000558F\r
+:10011000D80003C0CC000040C8280016C02E000440\r
+:10012000C830000D1AA800277EF2C007CEC00040DC\r
+:10013000CC000040CD800040CDC00040CE0000404B\r
+:1001400096800003CE400040D080005CCC80004010\r
+:10015000CC000040CCC000407C408000A0000000EB\r
+:1001600004280001C810002CC80C002B51100020DE\r
+:100170007CD0C0277CC5002055140020CD00004253\r
+:10018000CD400042D14000427C40C000C81800036E\r
+:10019000C81C0003C8200003C82400039580FF99F1\r
+:1001A000C828000395C0FF97C82C03FD7E2F0011BF\r
+:1001B000970000037EE2C0017C02C006CEC3A29E6F\r
+:1001C000CC00006CCD00006DCD40006DC830001D2E\r
+:1001D0009B000004CC000055D80003C0CC000040B8\r
+:1001E000C82C0016C0320005C834000D1AEC0027D8\r
+:1001F0007F370007CF000040D0400040CD80004056\r
+:10020000CDC00040CE000040CE40004096C000036C\r
+:10021000CE800040D080005CCC800040CC0000400C\r
+:10022000CCC000407C408000A000000004280001F9\r
+:10023000C81800151D9800017C424000958002CE30\r
+:100240007C428000C81C0020C037C0007C40C00039\r
+:100250007C4100007CB48006C03600031AB801E877\r
+:1002600097800007D04003E084000362CC00007F49\r
+:10027000C83803E09B800000C83803E099C0000044\r
+:10028000C81C00207CB4800710D400027D654000AB\r
+:10029000CD400043CE800043CD000043CC800040E1\r
+:1002A000CE400040CE800040CCC00040E03A00008C\r
+:1002B0009780FF54CD0000407C40C000800000A229\r
+:1002C0007C4100001C8C000298C00009C810001C72\r
+:1002D00099000004C81C000684000365CC0000528D\r
+:1002E000C81800158000008E1D980002C810001E5E\r
+:1002F0009900FFFCC81C000884000365CC00005472\r
+:10030000C81800158000008E1D9800021C8C000289\r
+:10031000C810001D98C0000EC814004999000004C0\r
+:10032000C81C000784000365CC000053C8180015E2\r
+:1003300094C00003189401E8055400062010000141\r
+:100340007D1500038000008E7D9180069940FFF8A6\r
+:10035000C81C0007CDC00040CC000040800000CB8E\r
+:10036000CC00006EC00E8080CC00006704D080807E\r
+:10037000CC000068CD0003F1CD0003F2CD0003F303\r
+:10038000CD0003F4CD0003F6CD0003F7CD0003F854\r
+:1003900080000005CD0003F9CC800040D44000402F\r
+:1003A0007C408000A000000004280001800000EED6\r
+:1003B000D8000440D8000340CC000040CC8000406E\r
+:1003C000D44000407C408000A000000004280001D0\r
+:1003D000D80003C0800000FBCC000040800000FA81\r
+:1003E000D8000440D8000340CC000040C80C0029CD\r
+:1003F000C810002ACC800040CC40004051100020A2\r
+:100400007CD0C027105000027D0D00205514002024\r
+:10041000CD000043CD400043D0400043CC0000401D\r
+:100420007C408000A000000004280001D80003C028\r
+:10043000CC000040CC800040D44000407C40800094\r
+:10044000A0000000042800011C8C0002C810001D40\r
+:1004500098C00011C814004999000004C81C000786\r
+:1004600084000365CC000053C80C002FCC800040F2\r
+:10047000CC400040CC400040CC4000407CC4C00098\r
+:10048000CCC00040D44000407C408000A000000070\r
+:10049000042800019940FFF5C81C0007CDC00040AA\r
+:1004A000CC0000408000011ACC00006E7C40C000EF\r
+:1004B000C81000479900000BC8140044994000047C\r
+:1004C000C8180009CD800040CC00004080000144E5\r
+:1004D000CC8000407C40C000C81000479500FFF76A\r
+:1004E000C814004599400004C818000ACD80004097\r
+:1004F000CC00004080000144D80008407C40C0008F\r
+:10050000C81000479900FFFC00000000CC800040AC\r
+:10051000CCC00040D44000407C408000A0000000DF\r
+:1005200004280001C8100046D8000740CD00004054\r
+:100530008400015BCD000040C80C004394C0000A59\r
+:10054000C81400488000015404100003C81000467D\r
+:10055000D80007C0CD0000408400015BCD00004002\r
+:10056000C81400489D400000CC00006AC82800164E\r
+:100570001EA800019A800003C02900018800000025\r
+:10058000C02C0156CE80005CD80008C0CEC0004010\r
+:1005900088000000CC0000401C8C0002C810001E27\r
+:1005A00094C00008C814001C9900000AC81C000868\r
+:1005B00084000365CC00005480000175CC800040AD\r
+:1005C00099400004C81C000684000365CC0000525A\r
+:1005D000CC80004080000000D4400040CC40002788\r
+:1005E000CC4000288000035FCC00006BC0320003C9\r
+:1005F000C037FFFF800001807CB080077C43400053\r
+:10060000C8200028C81C0027C8180026CF43A29E77\r
+:100610007C414000522000207DE1C0277D58C0036E\r
+:100620007CDCC02054D0002080000195CC800040AC\r
+:100630007C418000CC80004080000192CD80004051\r
+:10064000C019FFFFCC800040CD83A29E7C40C0003B\r
+:100650007C4100007C414000CCC3A1FACD03A1F94C\r
+:10066000CD43A29DCCC00040CD000040CD40004015\r
+:10067000CC4000407C408000A00000000428000125\r
+:100680007C40C0001CD00001CCC3A29F9500000399\r
+:10069000D0400026D0800026CC80004080000000A2\r
+:1006A000CCC000407C40C000CC800040CCC3A2A2A3\r
+:1006B00080000000CCC000407C40C00014D4001F6B\r
+:1006C000CC800040954000037C410000CCC0005924\r
+:1006D0001518001FCCC0004095800003CD000040DD\r
+:1006E000CD00005A8000035FCC00007FC820001FAF\r
+:1006F0007C410000D8200244CE2000447C414000D0\r
+:100700007C418000CDA00049CD200041CD6000415A\r
+:10071000CDA0004115100008115400187D53C007EA\r
+:10072000CFC0002F06200001CE0000588000035FDC\r
+:10073000CC00007FC820001FCA0C001794C0000521\r
+:100740007C410000D82002C6800001BFCE200046B8\r
+:10075000CC000048800001D500000000C820001F28\r
+:100760007C4180000A200001CA14001ACA18001730\r
+:100770007D59800795800005CE000058CCA000462A\r
+:1007800080000000CD600046CCA000448000000046\r
+:10079000CD6000448000035FCC40006AC80C03FABF\r
+:1007A00098C0000BD04003FAC8180042C81C004390\r
+:1007B000C810001DC814001C111000019980FF5BB7\r
+:1007C0007D15000799C0FF6300000000D00003FA08\r
+:1007D000800000007C40C000CC8000408000000011\r
+:1007E000D44000407C40C0007C4100007C4380003D\r
+:1007F0007C43C000041C0002CF800042CFC00042F6\r
+:10080000CDC00042041C0004CCC00042CD00004218\r
+:10081000CDC00042041C0000042000017C02400006\r
+:10082000C8140003C8180003519800207D594027C0\r
+:10083000C8280003C82C0003C8300003C8340003D4\r
+:1008400052EC00207EAE8027537400207F370027B3\r
+:100850007F2B40217E76402056A8003F5730003F36\r
+:100860007EB280067E2A000699C0FFF209DC0001F4\r
+:100870009680FFE153F400207F7B40277D65402078\r
+:1008800055580020CC00005BCD760000CDB60000AE\r
+:10089000C82000419A000000C820004180000001EB\r
+:1008A0007C4080007C40C0007C410000CCC003FE46\r
+:1008B000CD0003FFCCC00042CD0000421514001F44\r
+:1008C000191800F0275C00017D760006998000056C\r
+:1008D0007D5E4006CC0000428000035FCC00004DEE\r
+:1008E00015980001152C0008998000311EEC0001BC\r
+:1008F000960000041530000C8000035FCC0000421D\r
+:1009000004140004CD4000421F30000120280001E3\r
+:1009100004380004043C0000C8140003C818000395\r
+:10092000C81C0003C82000037D5D400D7DA1C00DE3\r
+:100930007D5D40071610001F159C001F7D1D0006E1\r
+:100940007D1740067E9280069B4000120BB8000483\r
+:100950009BC0FFF20BFC0001C80C03FE9A8000094B\r
+:10096000C81003FF9B000106CC00004D04140004D6\r
+:10097000CCC00042CD00004280000243CD40004286\r
+:1009800096C000FFCC00004D8000035FCC00004EFD\r
+:100990009AC00003CC00004DCC00004E9780FD991A\r
+:1009A000E383000080000000DC0301FF96400004A8\r
+:1009B000CC00004E8000035FCC000042D200004219\r
+:1009C000C8080003C80C0003C8100003C8140003C3\r
+:1009D000C8180003C81C0003C8240003C82800036B\r
+:1009E00015FC001F16B0001F7FF3C00614F0001F97\r
+:1009F0007FF3C0061570001F7FF3C0067D8880015D\r
+:100A000097C0000D7DCCC0017E5100017E95400154\r
+:100A10007C90800C7CD4C00C9AC000037C8F400674\r
+:100A200024B400019B4000D6CC00004D8000035F41\r
+:100A3000CC00004EC80C03FEC81003FFCCC000421F\r
+:100A40008000026FCD0000427C40C0007C4100006D\r
+:100A50007C42C0007C430000C03B001F7C43400040\r
+:100A60007FB78006C03E10009780FD667D3D000781\r
+:100A70007F3F00071914003BCC00005B954000133A\r
+:100A8000C8140040315800029580FFFFC814004090\r
+:100A9000CC000063211C8000CCC12185CDC1218602\r
+:100AA0001514001FCEC12187CF0121889540FD5527\r
+:100AB000CF412189C81400409940FFFFC81400406D\r
+:100AC000800000017C408000CC800040CCC0004011\r
+:100AD000CD000040CEC00040CF00004080000000AC\r
+:100AE000CF400040D08003E0CC800040840003620F\r
+:100AF000CC400040C80C03E098C00000C80C03E0E4\r
+:100B00007C408000A00000007E8280067C40C00007\r
+:100B1000840002CC14D0001F9900FD3AD04003E0BD\r
+:100B200084000362CC00007F800002BEC80C03E09A\r
+:100B3000CC800040CCC0004088000000D440004081\r
+:100B4000CC800040CC400040CC400040CC40004035\r
+:100B50007C40C000CCC00021CCC00040D44000404C\r
+:100B6000C037FFFFD00003FBD00003FCD00003FA26\r
+:100B700080000000CF4003FD7C40C00014DC001D5D\r
+:100B800099C00007CC80004018DC003C99C0007C74\r
+:100B9000CCC000408000035FCC00006A18D8003C45\r
+:100BA000CD800066CC00006A8000035FCCC00040AE\r
+:100BB0007C40C0005050002084000362CC00005DE7\r
+:100BC0007CD0C027C820001FC8D60000994000086C\r
+:100BD0007C438000E3830000CFA0004F84000362C9\r
+:100BE000CC00005E80000000D440007F8000035FE6\r
+:100BF000CC00005E84000362CC00005DC820001FB2\r
+:100C00007C40C000C036FF00C8100021C0303FFF4C\r
+:100C10007CF540067D5180067D81800A9980000820\r
+:100C20007CF38006E3830000CFA0004F84000362C2\r
+:100C3000CC00005E80000000D440007F8000035F95\r
+:100C4000CC00005E840003627C40C00014DC00081D\r
+:100C500095C000191CDC00107C41000099C0000404\r
+:100C6000505400208000031DC91D00007D15002781\r
+:100C7000C91E00007C4200007C4240007C41800094\r
+:100C80007DE5C0067DE280119A80FCDE41AC000566\r
+:100C90009AC000000AEC00011CDC001099C000049E\r
+:100CA0000000000080000320C91D00008000032018\r
+:100CB000C91E0000CC800040CCC000408000000075\r
+:100CC000D4400040D8000340CC000040CC8000401D\r
+:100CD000D44000407C408000A000000004280001B7\r
+:100CE000D80003C0CC000040CC800040D44000407D\r
+:100CF0007C408000A0000000042800017C40C0006F\r
+:100D00001CD000062910000699000006C814001C1B\r
+:100D100099400004CC00005284000365C81C000602\r
+:100D2000CC800040CCC0004080000000D440004097\r
+:100D30007C40C0007C4100001518001FCD00005B06\r
+:100D4000998000045114002080000000D44D000060\r
+:100D50007D4D4027191C0031D456000095C0FCA9D8\r
+:100D6000C82000419A000000C82000418000000116\r
+:100D70007C40800080000000D440007FCC00007FD9\r
+:100D800080000000CC00007FCC00007F88000000C5\r
+:100D9000CC00007FCDC0004088000000CC000040A7\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003033100040338000501BBA4\r
+:10101000000600ED000700F90008010B000900F4CC\r
+:10102000000A00EB000B00F7000C012B000D01354E\r
+:10103000000E0149000F01530010035D0011000A6A\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025005900260177001701D7001801E587\r
+:10106000001A01E7002202EC002302FD0027018C98\r
+:10107000001F01F900200229002801AE0029017B90\r
+:10108000002A01A0002B0190002F01A9003201CD00\r
+:101090000034033F0035017F003901F6003C0311A5\r
+:1010A000003F01BB00410292004202B9004302C36B\r
+:1010B000004402D0004A02DE005503330056033AD2\r
+:1010C0000060008C006100B1006200D9006300C3C1\r
+:1010D000006400C3006500C3006600C3006700C36E\r
+:1010E000006800E6006900EF006A013F006B010D37\r
+:1010F000006C010D006D010D006E010D006F010D02\r
+:1011000000700112007300FB007400FB00750166A3\r
+:10111000007B034C000000050000000500000005F6\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/CAYMAN_mc.bin.ihex b/firmware/radeon/CAYMAN_mc.bin.ihex
new file mode 100644 (file)
index 0000000..7a81c3e
--- /dev/null
@@ -0,0 +1,1511 @@
+:100000000003E8E00002BE01000002140003FF004C\r
+:100010000003FF000002A00E0001C01C0003E80066\r
+:100020000003E8100003E8200003E830000360202C\r
+:10003000000360280002333E0002B0FF0002B1FF5F\r
+:100040000002B2FF0002B3FF000361380003496CF5\r
+:100050000003FF000003AF0A0002B40400026FF4C3\r
+:100060000000FA3B0002B40F00024F140000FA1720\r
+:10007000000340240002B4400002B50F00034AA66A\r
+:10008000000244410003F0020002499500036AA601\r
+:1000900000022D6E00034842000349D400003243A1\r
+:1000A0000000221800003A150002B51000009A4323\r
+:1000B000000245530003F0080002A07E0003F04652\r
+:1000C0000002A0630003F0440000F20F000234B00D\r
+:1000D0000003F4000001C0240003E8000000820FC8\r
+:1000E000000340240002B4400002B5F000034AA619\r
+:1000F000000244410003F0020002699500036AA671\r
+:10010000000340000003FF000003F8010003C440A7\r
+:100110000003C4510002C645000200000003401065\r
+:100120000003FF000003FF000003E8200003E830A5\r
+:10013000000360100003F803000233380002327439\r
+:10014000000348080002B49F00024004000368084E\r
+:10015000000348210002B3C1000247730003682175\r
+:1001600000036A89000348250002B3C100024773F7\r
+:100170000003682500036A8D000348C0000348C6D9\r
+:100180000000823100008A300000C22F0000CA2E19\r
+:100190000003E8100003E890000368C0000368C68D\r
+:1001A00000034AA40003E8400003FF0000024224C9\r
+:1001B00000036AA400034800000348050002BB3F97\r
+:1001C0000002BCBF0002BFEF0000923300008A347F\r
+:1001D000000082380000BA360000AA3A0002411B33\r
+:1001E0000002BBFB0002422B0002400C000368002F\r
+:1001F0000002455F0003680500034810000349DD65\r
+:100200000002BBF10002BC0200008A370000AA39DC\r
+:100210000002411B0002611C000368100002455BE4\r
+:100220000002655C000369DD0003400D0003FF0070\r
+:100230000003FF000003A14C00008A0D0002B3027E\r
+:10024000000243340003A33000009A0C0002B30400\r
+:10025000000243340003A33200009A0B0002B008EE\r
+:10026000000082410002B0090000824200034829D8\r
+:10027000000349700002BF070002400F0003800026\r
+:100280000003000E00038406000385560003A556F4\r
+:100290000002655400026440000349E80003682935\r
+:1002A0000003682D0003C1040003C115000369E8C1\r
+:1002B000000369EC0003E8000003E8D000023015F9\r
+:1002C000000368E40003C1DE000230150003690486\r
+:1002D0000003402C0003FF000002B40200024404AB\r
+:1002E0000000A216000349D60002B5100002445BCC\r
+:1002F0000003A4460000A2180002A04E0003F00371\r
+:100300000002345B0003F4000001C0C50003F400E8\r
+:100310000001D3490003400E0000F2400003E8F062\r
+:100320000003A0B6000349D50000FA110002B10F86\r
+:10033000000242170002A5200003F0010000FA406D\r
+:100340000002431B0002A5230003F0010000F2118C\r
+:10035000000340000003402E0002B6100002B40C5F\r
+:1003600000002A40000242240003A222000243347B\r
+:1003700000026C23000246680003F0030002A05E46\r
+:100380000003F0010003E8C00000E2100003400891\r
+:100390000002B40000007A110002A0240003F04122\r
+:1003A0000002B2080002A0FE0003F0410002B20405\r
+:1003B0000002B43F000242240000922800034A9445\r
+:1003C0000003FF000003606C000340000003FF0017\r
+:1003D0000002B440000244040003F0030003E800FC\r
+:1003E0000000823F000222FA000340000003FF00E9\r
+:1003F0000002B440000244140003F0020000F23F87\r
+:10040000000222FA000340000003FF000002B44093\r
+:10041000000244140003F00100022E3400034A9449\r
+:100420000003FF0000036070000340000003FF00B2\r
+:100430000002B402000244240003F0030003E800B9\r
+:100440000000823F00022331000340000003FF0050\r
+:100450000002B402000244340003F0020000F23F44\r
+:100460000002233100034A940003FF0000036134BB\r
+:1004700000023338000340000003FF000003FF00C8\r
+:100480000002440E0003F0030003E8000000823F76\r
+:100490000002245A00023338000340000003FF002A\r
+:1004A0000003FF000002441E0003F0020000F23FC0\r
+:1004B0000002245A00022E6F00034A940003FF003A\r
+:1004C000000360740002B0000000822B00034000B3\r
+:1004D0000003FF000002B402000244400003F003E6\r
+:1004E0000003E8000000823F0002261800034A943F\r
+:1004F0000003FF0000036078000340000003FF00DA\r
+:100500000002B404000244400003F0030003E800CA\r
+:100510000000823F0002288C00034A940003FF0081\r
+:100520000003607C000340000003FF000002B410E1\r
+:10053000000244400003F00C0003E8000000823F8A\r
+:10054000000229500000020D0003FF000003FF001D\r
+:100550000002A40E0003F0040000F20E0002295075\r
+:100560000003E8000000820E00034A940003FF002D\r
+:10057000000360AC000340000003FF000002B42051\r
+:10058000000244400003F0030003E8000000823F43\r
+:1005900000022B6000034A940003FF00000360B0D8\r
+:1005A0000003E8000000823F0002B0FF0002B1FF3C\r
+:1005B0000003C12000036860000368680003400076\r
+:1005C0000003FF000002B410000244400003F042A8\r
+:1005D0000003F4000002018F0003400D00034026D9\r
+:1005E0000002B1400002B2100002B3080002411440\r
+:1005F0000003A11A000242240003A2240002622187\r
+:10060000000243380003A330000262230000922B53\r
+:100610000002A41E0003F0090003493D0002B2805D\r
+:100620000003C02200024442000229500003493D59\r
+:100630000003FF000002B2800002644200000210CA\r
+:100640000003FF000002B401000244040003F004B0\r
+:100650000003E8000000823F0003C1FE00022C14EA\r
+:10066000000002100003FF000002B4020002440474\r
+:100670000003F0040003E8000000823F0003E8F0FC\r
+:1006800000022C14000340000003FF000003FF00E1\r
+:100690000002442E0003F0030003E8000000823F44\r
+:1006A0000002359E000340000003FF000002B4106A\r
+:1006B000000244240003F0030003E8000000823F2E\r
+:1006C000000236BF0003F80300034A940003FF0052\r
+:1006D000000360B40002B0000000822B0003400061\r
+:1006E0000003FF000002B402000244410003F002D4\r
+:1006F0000000F23F0002261800034A940003FF00A6\r
+:10070000000360B8000340000003FF000002B404CF\r
+:10071000000244410003F0020000F23F0002288C76\r
+:1007200000034A940003FF00000360BC0003400084\r
+:100730000003FF000002B410000244410003F00B6C\r
+:100740000000F23F000229500000020D0003FF00EC\r
+:100750000003FF000002A40E0003F0040000F20EEC\r
+:10076000000229500003E8000000820E00034A94B2\r
+:100770000003FF00000360EC000340000003FF00E3\r
+:100780000002B420000244410003F0020000F23FE6\r
+:1007900000022B6000034A940003FF00000360F096\r
+:1007A0000000F23F0002B0FF0002B1FF0003C120D1\r
+:1007B0000003686000036868000340000003FF0056\r
+:1007C0000002B410000244410003F0420003F400B0\r
+:1007D0000002020E0003400D000340260002B1405B\r
+:1007E0000002B2100002B308000241140003A11A73\r
+:1007F000000242240003A2240002622100024338C6\r
+:100800000003A330000262230000922B0002A41E0A\r
+:100810000003F0090003493D0002B2800003C0223A\r
+:1008200000024442000229500003493D0003FF003A\r
+:100830000002B28000026442000002100003FF00C8\r
+:100840000002B404000244040003F0030000F23F7D\r
+:100850000003C1FE00022C14000002100003FF0080\r
+:100860000002B408000244040003F0030000F23F59\r
+:100870000003E8F000022C14000340000003FF0016\r
+:100880000003FF000002443E0003F0020000F23FBC\r
+:100890000002359E000340000003FF000002B41078\r
+:1008A000000244340003F0020000F23F000236BFB1\r
+:1008B00000034A940003FF00000360F40003F80300\r
+:1008C000000002180003FF000003FF000002A00E5A\r
+:1008D0000003F0420003F4000002026C0003402C0D\r
+:1008E0000003FF000002B420000240400002A00408\r
+:1008F0000003F0480003E8000000823F000231D40A\r
+:10090000000232190000F23F000231D40002321915\r
+:10091000000232B0000340000003FF000002B408F0\r
+:10092000000244040003F00C000348080003FF0029\r
+:100930000002B44000026004000368080003499804\r
+:100940000002B4FD00024114000369980003E8307E\r
+:100950000003C12E00036830000232C40003E80027\r
+:100960000003E8100003E8300002B203000368301F\r
+:10097000000340000003FF000002B5080002451517\r
+:100980000003F001000234FE00034A940003FF005C\r
+:10099000000360F8000002400003FF000003FF00B6\r
+:1009A0000002A10E0003F0020003E8000000821420\r
+:1009B00000022E6F000348000003480500000A34BF\r
+:1009C000000002380000123300002A3A00003A36D4\r
+:1009D0000003FF00000368000003680500034810DF\r
+:1009E000000349DD00000A3700002A390003FF0038\r
+:1009F00000036810000369DD000349710002B201C1\r
+:100A00000003E8300003C1060003C117000368308B\r
+:100A10000003496C0002B5160002A0510001C29FFC\r
+:100A20000002B0CF0002B1050002B2010002B30023\r
+:100A300000036830000232C40002B0B40003683022\r
+:100A4000000232C40002B0BC00036830000232C4AD\r
+:100A50000002B0B800036830000232C40002B0CB1C\r
+:100A600000036830000232C40002B08C000368301A\r
+:100A7000000232C40002B0D100036830000232C468\r
+:100A80000003E8000003E8100002B2030002B30014\r
+:100A900000036830000002180003FF000003FF009D\r
+:100AA0000002A00E0003F0420003F4000001C000A9\r
+:100AB000000001F4000340120003401500000A1B6F\r
+:100AC0000002A00E0003F0020003F4000001C2CFF8\r
+:100AD0000002C11E00008A1B00026BBA0002655BA7\r
+:100AE0000002C66E0003F0410002C77E00036015DD\r
+:100AF0000002B20F000244420002A5140003F007F6\r
+:100B00000003E8A00003E8B0000360120003E8005F\r
+:100B1000000081F40003F4000001C04D0003402CEC\r
+:100B20000003FF000002B420000240400002A004C5\r
+:100B30000003F0420003F4000001C2E40003E800F7\r
+:100B40000000823F000231D4000232190000F23F5F\r
+:100B5000000231D400023219000232B0000340100A\r
+:100B60000003FF000003FF000003A006000380064F\r
+:100B70000003C1F000022E410003C1F000022E412B\r
+:100B80000003C1F000022E410003C1F000022E411B\r
+:100B9000000340200003FF000003FF000002C00E1E\r
+:100BA0000003F0450002C11E0003F0430002C22E04\r
+:100BB0000003F0410002C33E00036020000233380E\r
+:100BC000000349480002B43F0002B58000024334EC\r
+:100BD000000263350003694800024334000369489A\r
+:100BE0000003F4000001C0000003400400006A3F5D\r
+:100BF0000003E8800003E8900003E8A00003E8B0E9\r
+:100C00000002B510000244150003F0060002A0DE49\r
+:100C10000003F003000364AA0003F4000003F041A2\r
+:100C2000000364EA0003F8010002B508000244056D\r
+:100C30000002031C000061F80002A0DE0003F003C4\r
+:100C40000003E8400003F4000003F041000384EADD\r
+:100C50000003D8400003DCC0000079F70003F8036C\r
+:100C60000003D49E0003FB0000030FFE00020318E4\r
+:100C70000003F801000385E4000244150002032F7D\r
+:100C8000000021F90002A0DE0003F003000061F182\r
+:100C90000003F4000003F041000061F00002BF080F\r
+:100CA0000003DC400003D8C00003F8030003D49E17\r
+:100CB0000003FB0000030FFE0002032B0003F803F8\r
+:100CC0000003EC000000021400000A4000006A3F2C\r
+:100CD0000003FF00000240010002A00E0003F0012B\r
+:100CE0000003EC00000349380002A0DE0003F041DD\r
+:100CF00000034A5C0002B8FE000242280002A0DEA7\r
+:100D00000003F003000369380003F4000003F0411E\r
+:100D100000036A5C000349D00002B40400026114BD\r
+:100D20000002B2010002B3120002A0DE0003F04193\r
+:100D30000002B31100036830000349710002B8EFEC\r
+:100D40000002B9040003C1060002617900024338C1\r
+:100D500000036830000348090002B8FD000244485F\r
+:100D60000003680900022E45000349A00002B411E7\r
+:100D70000003C1240002B10F000369A000034A442C\r
+:100D80000002B4FE0002611E00036A440002411426\r
+:100D900000036A440002A0DE0003F0030003426186\r
+:100DA0000003F4000003F0410003425D0003FF0074\r
+:100DB0000003FF000003E860000369A50003686BFF\r
+:100DC0000002BA0C0002B8C00003DC810003D8A105\r
+:100DD0000002B0F80002B1070003E8200003E83089\r
+:100DE0000003FE000003D41F0003686B0003E8F05B\r
+:100DF000000223FF000223E20002241C0002A1FEE5\r
+:100E00000003F0410003627A000342780003FF0010\r
+:100E10000003FF000002A0800001C3930002A09124\r
+:100E20000001C3930002A0A20001C3930002A0B37B\r
+:100E30000001C3930002CFFE0002BC0C0002A1FC23\r
+:100E40000003F0420003F4000001C37D0000FA0437\r
+:100E50000003E8F0000223E2000223FF0002241C4A\r
+:100E6000000342780003FF000003FF000002A0809F\r
+:100E70000001C3A90002A0910001C3A90002A0A221\r
+:100E80000001C3A90002A0B30001C3A90002CFFE64\r
+:100E90000002BC0C0002A1FC0003F0420003F400BD\r
+:100EA0000001C396000062040000FA030003FF0083\r
+:100EB0000002A5CF0001C3B90002A5FC0001C3B424\r
+:100EC0000003E8F00003E8C00003F4000001C3BC25\r
+:100ED00000030CCF0003ACC00003E8F00003F400F3\r
+:100EE0000001C3BC00030FFC0003AFF00003E8C027\r
+:100EF000000223FF0003C1FC000223E20003493883\r
+:100F00000002A0DE0003F04100034A5C0003FF0082\r
+:100F10000002622E0002A0DE0003F0030003693825\r
+:100F20000003F4000003F04100036A5C000349D0B1\r
+:100F30000002B4FB000241140002B2010002B3122D\r
+:100F40000002A0DE0003F0410002B311000368308C\r
+:100F5000000349710002B8EF0002B9FB0003C106AB\r
+:100F60000002417900024338000368300003480959\r
+:100F70000002B8FD00024448000368090002B018EE\r
+:100F8000000224400003EC00000344B90002A0DE8C\r
+:100F90000003F041000344F90003C10F0003C11F27\r
+:100FA0000003C12F0003C13F0003C14F0003C15F15\r
+:100FB0000002A0DE0003F005000364B0000364B487\r
+:100FC000000364B90003F4000003F043000364F07D\r
+:100FD000000364F4000364F9000348C80002B4F39A\r
+:100FE0000002B5040002400400026005000368C866\r
+:100FF00000024004000368C80003EC00000344B989\r
+:101000000002A0DE0003F041000344F90003C10F19\r
+:101010000003C11F0003C12F0003C13F0003C16FC4\r
+:101020000003C17F0002A0DE0003F005000364ACF2\r
+:10103000000364BC000364B90003F4000003F04340\r
+:10104000000364EC000364FC000364F9000348C877\r
+:101050000002B4F30002B50400024004000260057F\r
+:10106000000368C800024004000368C80003EC00E5\r
+:101070000002B01000022440000232C4000232C458\r
+:10108000000232C4000232C4000232C400034A1C0F\r
+:101090000002244C0003C18C00034A200002244CAF\r
+:1010A00000038CC60002688C00034A240002244C12\r
+:1010B0000003C19C00034A280002244C00038CC694\r
+:1010C0000002699C00034A2C0002244C0003C1ACBE\r
+:1010D00000034A300002244C00038CC600026AACB4\r
+:1010E00000034A340002244C0003C1BC00034A3808\r
+:1010F0000002244C00038CC600026BBC0003EC0011\r
+:101100000003686B0002B9080002B8C00003DC806D\r
+:101110000003D8900003E8100003E8200003E83043\r
+:101120000003FE000003D41E0003686B0003EC0004\r
+:101130000003E8C00003873C0003A7760003862C69\r
+:101140000003A6680003851C0003A55A0003840C55\r
+:101150000003A44C00026CC700026CC600026CC500\r
+:1011600000026CC40003EC00000340240003FF00F5\r
+:101170000003FF000003A0060002A10E0003F0011F\r
+:1011800000008207000349A4000349A100006A3F50\r
+:1011900000038BEA0003C0AB000245A50002A0DEFD\r
+:1011A0000003F003000243A30003F4000003F04136\r
+:1011B000000263B3000369A4000369A10002B2FF47\r
+:1011C0000002B1FF0002B07F000368600003E80086\r
+:1011D0000003E8200003E8300002A0DE0003F00373\r
+:1011E00000000A090003F4000003F04100000A08AF\r
+:1011F0000002B8C00003686B0003D8000003DC8065\r
+:101200000003D41E0002BF0200022E41000380E052\r
+:1012100000008204000082030003E8000000820254\r
+:10122000000082010000F200000348540002A0DE2A\r
+:101230000003F003000384E80003F4000003F0411E\r
+:10124000000384EA00026224000368540003499802\r
+:10125000000388E50003C13E0002A0DE0003F001A8\r
+:10126000000383300003C12E0002600800036830D1\r
+:1012700000034975000388E6000260680003C11797\r
+:101280000003C12E0003C13E0002A0DE0003F001F6\r
+:101290000003833000036830000348540002A0DEDE\r
+:1012A0000003F003000384E80003F4000003F041AE\r
+:1012B000000384EA0003C04400024224000368548F\r
+:1012C0000002BF0200022E41000002180003FF00CE\r
+:1012D0000003FF000002A00E0003F0020003F40070\r
+:1012E000000204D6000230270003E870000384E601\r
+:1012F0000002464B0002A0640003F04F000349D2F5\r
+:101300000003E86000038AB20003AAAA000384A6CF\r
+:101310000002644A0003C1540002A0DE0003F0038F\r
+:10132000000368E50003F4000003F04100036905D1\r
+:101330000003F4000001C5810002BF0800024FF95C\r
+:101340000003AFF400038BB20003ABBC000225A581\r
+:101350000003F400000205810003400C0003FF00BD\r
+:101360000002BF0800024FF00003F0420003F40047\r
+:101370000001C4F30002BF000002BB01000225A56A\r
+:10138000000002110003FF000003FF000002A00E96\r
+:101390000003F0420003F4000001C5810002B10225\r
+:1013A0000002B0110002C4400002C5500002A0DEDD\r
+:1013B0000003F003000368E50003F4000003F041BC\r
+:1013C000000369050003011E000204E80000F202A8\r
+:1013D0000000F2010002A0DE0003F00300007A0624\r
+:1013E0000003F4000003F04100007A0500038DE2E1\r
+:1013F0000003DCD00003D8F0000389E60002699EF8\r
+:101400000000F1F2000042070003E8D000038FE083\r
+:101410000003C1A800038CED0000E1F60000E23EED\r
+:1014200000022F900002B701000042070003E8A06D\r
+:101430000000D1F20002A07E0003F0010003A880AA\r
+:1014400000030FDF0003C1D90003C1A800038CED26\r
+:101450000000E1F60000E23E00022F9000022FD1D2\r
+:101460000003C1040003C126000362700002BF0133\r
+:1014700000034011000388E00002A0FE0003F00416\r
+:10148000000244480003F0020003F4000002056774\r
+:101490000002B701000042070003FF000002A07E27\r
+:1014A0000003F0010003A8800003E8D000038FE0F0\r
+:1014B0000003C1A800038CED0000E1F60000E23E4D\r
+:1014C00000022F9000022FD10003427000038CEB2A\r
+:1014D00000038CEA0003E8F00002C8400003A88083\r
+:1014E00000002A160002CA620003AAA00002A65E3B\r
+:1014F0000002054400006A3F0000F2160003C158D4\r
+:101500000003C17A000362710003F400000204FECC\r
+:101510000002A15E0003F00E00006A3F0003C191CB\r
+:101520000003C1B30002A0DE0003F0030003612E3C\r
+:101530000003F4000003F041000361320002C081A7\r
+:101540000003A8000002C2A30003AA2000038550E4\r
+:101550000000AA16000381E0000300840003F024C9\r
+:101560000002A1840003F0010002C4410003044E04\r
+:101570000003C154000302A60003F0240002A1A648\r
+:101580000003F0010002C6610003066E0003C1768D\r
+:101590000003D45E000260020002055600006A3FAC\r
+:1015A0000002BF0200022E4100034971000381E4E2\r
+:1015B0000003C1060003A26C0002A02E00020581F8\r
+:1015C000000261710003C12E0003C13E0002A0DED3\r
+:1015D0000003F00100038330000386600003F0473E\r
+:1015E0000003683000038FED00022E4100038FEDF1\r
+:1015F00000022E4100038FED00022E4100038FED0B\r
+:1016000000022E41000349750003C12E0003C106EC\r
+:101610000003C1170003C13E0002A0DE0003F00179\r
+:101620000003833000036830000349980003FF0083\r
+:101630000003C13E0002A0DE0003F001000383307E\r
+:101640000003C12E0003683000000A0F000001F4FF\r
+:101650000003FF000002411E0003F0010003EC0044\r
+:101660000002A50E0003F048000340110002A0DEB6\r
+:101670000003F0030002666E0003F4000003F04173\r
+:101680000002677E000360110003E800000081F49F\r
+:101690000003EC00000232C400034A400000420094\r
+:1016A00000004A04000052030002BC330002440C54\r
+:1016B0000002451C000264450002462C0002473C23\r
+:1016C00000026667000264460002A14E0003F001BA\r
+:1016D0000002B4010002A08E0003F0050002A4493C\r
+:1016E0000003F0430002A44B0003F0410000F202AB\r
+:1016F0000000A2040002BCCC0002440C0002451C05\r
+:101700000002462C0002473C000264450002644689\r
+:10171000000264470002A14E0003F0010002B40180\r
+:101720000002A08E0003F0050002A44A0003F0436B\r
+:101730000002A44B0003F0410000F2010000A203EC\r
+:101740000003E8400000A200000343290002A0DEDD\r
+:101750000003F0410003436900000202000012018F\r
+:101760000002B10F0002B3070002A5FE000205FB54\r
+:101770000002A00E0003F0060002BC0F0002A4410C\r
+:101780000003F0010002BC090003C14C0003C15C6E\r
+:101790000002A02E0003F0060002BC0F0002A461AC\r
+:1017A0000003F0010002BC090003C16C0003C17C0E\r
+:1017B0000002A0DE0003F003000363290003F4002D\r
+:1017C0000003F0410003636900024C020002A0CE56\r
+:1017D0000003F0060002CFFE0002BC090002A5FCD7\r
+:1017E0000003F0020003F4000001C5A5000348E572\r
+:1017F0000002A0DE0003F041000349050002B81119\r
+:101800000002A00E0003F0010002C448000249419A\r
+:101810000002A4930003F0010000F2020002A02ED7\r
+:101820000003F0010002C558000249510002A493D0\r
+:101830000003F0010000F2010002A0DE0003F0034B\r
+:10184000000368E50003F4000003F04100036905AC\r
+:10185000000240020002A00E000205A50003EC00F9\r
+:1018600000006A3F0003E8000002300100034998CD\r
+:101870000002B80F0002B5F50002B3010002A0DEBD\r
+:101880000003F001000383300003C12E0002600852\r
+:1018900000024115000368300002BF0000022E4123\r
+:1018A0000000F1FF0003E800000081FE0003400C8F\r
+:1018B0000003402D0002B8100002B90800024A18C7\r
+:1018C0000003AAA600024B490003ABB40002B30414\r
+:1018D00000026FAB0003F0410002B30200024FAB05\r
+:1018E0000003F0010002B3060003402D00000A11BE\r
+:1018F0000002B040000240400003F0410003E83025\r
+:101900000002411E0003F0010003E830000099FDD1\r
+:1019100000022E450002BC010002A0DE0003F00917\r
+:101920000003482100038CC6000386660003A666F8\r
+:101930000002666C0003682100036A890003F4005A\r
+:101940000003F0470003482500038CC600038666A9\r
+:101950000003A6660002666C0003682500036A8D1A\r
+:101960000002319B0002BF03000231A100034808BE\r
+:10197000000384EA000081F50002600400036808A7\r
+:101980000002BF6400022E4100006A3F0003FF0016\r
+:101990000003FF000002A0DE0003F0030002BB0012\r
+:1019A0000003F4000003F0410002BB400000D9EF47\r
+:1019B0000003C10E0003C11E000381160002611E58\r
+:1019C000000382E600036A440003C11E000381167F\r
+:1019D0000003E82000036A440003E8000003C0009D\r
+:1019E0000003C1100002B2FD0003686000034A60FA\r
+:1019F0000002BFF70002B1130002400F0002600EA8\r
+:101A000000036A600000320C00003A0B0002BC08C0\r
+:101A10000002BFFE0003866A000262260002A47E66\r
+:101A20000003F0010002B3040002400F0002600C4A\r
+:101A300000036A6000038FE100022E410003686B1F\r
+:101A40000003FF000003FE000000623D00005A3C5E\r
+:101A50000003FF000003D8C10003DCB100038FE3E3\r
+:101A600000022E410003D01F00038CEF00038FE41F\r
+:101A700000026FFE00024001000242230002400209\r
+:101A800000024CC00003FB010003D01F00030FFE47\r
+:101A90000002069D0002A0DE0003F00300034821BF\r
+:101AA0000003F4000003F041000348250003C0CC0C\r
+:101AB000000206C900038CE60002C66C0003F04178\r
+:101AC0000002C77E0002A0DE0003F00400036821CC\r
+:101AD00000036A890003F4000003F0420003682554\r
+:101AE00000036A8D0002A57E0003F0020003F400EB\r
+:101AF0000001C66C000340110002B0080000F1F4C0\r
+:101B00000002A0DE0003F003000266600003F400A0\r
+:101B10000003F04100026770000360110003F4004D\r
+:101B20000002087A000380E1000381060002611EC2\r
+:101B3000000382E700036A44000381060003E820F3\r
+:101B400000036A440002319B0003402C00005A2B22\r
+:101B50000002B4040003E8F0000244400003F00176\r
+:101B60000002BF010002A4BE0003F0010002BF0496\r
+:101B7000000231A10000F2270000F2250002B0FFB0\r
+:101B80000002B1BF0003C120000368600002B00181\r
+:101B90000003E8100003E8200003E83000036A6057\r
+:101BA00000000A3B0000120C00001A0B0002B002F9\r
+:101BB0000002A0DE0003F0410002B0040003822A0C\r
+:101BC0000002A43E0003F0010002B30400038116EA\r
+:101BD000000260010002B13300036A600003400AA2\r
+:101BE0000002B0010002B1020002B2000002B30123\r
+:101BF0000002A02B0003F0020003E8200003C13B19\r
+:101C000000036A680003C10E00001242000240098E\r
+:101C10000003F0010003E8200002B0130002B1024B\r
+:101C2000000382260003E83000036A700003402DA1\r
+:101C300000006211000012280002BF4000024F4F56\r
+:101C40000003F0030002A0CE0003F0010002B2087E\r
+:101C50000002B0210002B1020002B30100036A7465\r
+:101C600000000A2B0002B0010003FF000002A41EC6\r
+:101C70000003F0050002B1040002B2000002B3024A\r
+:101C80000003F4040003F0030002B1020002B20FEB\r
+:101C90000002B30100036A7800034A7C0003FF00DE\r
+:101CA0000002B0010002B1020002B30400036A7C2A\r
+:101CB000000001FE0003FF000003FF000002C00E51\r
+:101CC000000081FE00023196000002270003400A56\r
+:101CD0000003400D0002A00E0003F0050002B00159\r
+:101CE00000024005000380060003F4040003F00333\r
+:101CF0000002B00400024009000380020002B103A8\r
+:101D0000000268010000022B0003FF000003FF0037\r
+:101D10000002A40E0003F00B000012280002B02302\r
+:101D20000002B1030002B30100036A7400034A7C9D\r
+:101D30000003FF000002B0010002B1040002B3047E\r
+:101D400000036A7C00034A640002B480000011EFC3\r
+:101D500000024004000260080003A2220002B30156\r
+:101D600000036A640002305B00023068000001FF7B\r
+:101D70000003FF000003FF000002A00E0003F04E6E\r
+:101D80000003402C0002BC040003DCC000038FEA07\r
+:101D90000002A0DE0003F0010003E8F00003D8F029\r
+:101DA0000002BC090002BF3F00024B1F00022ED1FF\r
+:101DB0000003E8F00000F9FF000001FE0003FF004F\r
+:101DC0000003FF000002C00E000081FE000340255A\r
+:101DD00000001A100002B204000242200002A0DE3D\r
+:101DE0000003F0410003A3320002B902000249934C\r
+:101DF000000262290002B9800002499500026229AE\r
+:101E00000002B9860003E8800002A0290003F04127\r
+:101E10000003C18E0000C1DA000009FD0003402E5E\r
+:101E20000003FF000002A001000207990002B001B8\r
+:101E3000000241080003F005000002400003FF001B\r
+:101E40000003FF000002A00E0002079900034A747D\r
+:101E500000007A280003FF000003FF000003C12FE9\r
+:101E600000036A7400023196000002270003400A52\r
+:101E70000003400D0002A00E0003F0050002B004B4\r
+:101E800000024005000380020003F4040003F00296\r
+:101E90000002B01000024009000079DA0002B143EC\r
+:101EA0000003FF000002A0FE0003F0410002B12386\r
+:101EB000000268010000022B0003FF000003FF0086\r
+:101EC0000002A00E000207CB000012280002B0435F\r
+:101ED0000002B1040002B30100036A7400034A7CEB\r
+:101EE0000003FF000002B0010002B1050002B304CC\r
+:101EF00000036A7C00034A640002B480000011EF12\r
+:101F000000024004000260080002B82000026008DD\r
+:101F10000002B8BF000240080003A2220003C13E35\r
+:101F200000036A640003F4040003F00800034A6439\r
+:101F30000002B480000011EF0002400400026008BB\r
+:101F40000003A2220003C13E00036A640002305B6A\r
+:101F500000023068000042100002B0020002A0DE61\r
+:101F60000003F04100038002000240080003F00279\r
+:101F70000003F4000001C7EC0003400E0002B010A3\r
+:101F80000003FF00000241090002A010000207EC5C\r
+:101F9000000002270003FF000003FF000002C00E44\r
+:101FA000000082270002B1020002A4010002072CF7\r
+:101FB000000041EF000001F90003FF000003FF00F3\r
+:101FC0000003D8800003DC0000007A420002B00168\r
+:101FD0000003DC010002B0000003D801000049DA70\r
+:101FE0000003FF000003FF000002A09E0003F04674\r
+:101FF0000003E8F00002B1240002C8810003D88089\r
+:102000000002C0010003D88100023052000001FE2E\r
+:102010000003FF000003FF000002C00E000081FE6D\r
+:10202000000079DA000231960002A0FE0003F045BC\r
+:102030000002B00F0003C1100003C1200003C13033\r
+:1020400000036A800003400A0002B0400003FF0062\r
+:10205000000240090003A0020002B103000268016F\r
+:102060000000022B0003FF000003FF000002A40E8B\r
+:102070000003F00B000012280002B0430002B1057B\r
+:102080000002B30100036A7400034A7C0003FF00EE\r
+:102090000002B0010002B1060002B30400036A7C32\r
+:1020A00000034A640002B480000011EF0002400403\r
+:1020B000000260080003A2220002B30100036A6468\r
+:1020C0000002305B0002306800034025000042102F\r
+:1020D0000002B020000240050003F0480002B002F8\r
+:1020E0000002A0DE0003F04100038002000240086D\r
+:1020F0000003F0020003F4000001C85C000011FEC0\r
+:102100000002B0800002B3030002A0230003F043EA\r
+:10211000000240050003F0010002315C0003402E84\r
+:102120000003FF000002B008000241080002A010F6\r
+:102130000002085C0002B080000241080003F005C4\r
+:10214000000002400003FF000003FF000002A00E99\r
+:102150000002085C000002250003FF000003FF00EE\r
+:102160000003E81000008A250002A40E0002076E9A\r
+:10217000000001EF000041F90003FF000003FF0031\r
+:102180000003D8000003DC8000007A420002B000A7\r
+:102190000003D8010002B0010003DC010003400D80\r
+:1021A0000002BD200003FF0000024DD50002A6DEA4\r
+:1021B0000003F00300022EF10003F4040003F00A10\r
+:1021C0000002B07F0002B1FF0002B2FF00036860AE\r
+:1021D0000003686B000011E50002B3C00003E8D003\r
+:1021E0000003604C00022F2C0002319B000231964C\r
+:1021F000000021F50003FF00000348080003FF0072\r
+:102200000003C104000368080003EC000003E800B9\r
+:102210000003E8100002A0DE0003F0030003691CC5\r
+:102220000003F4040003F001000369340003EC0030\r
+:1022300000006A3F0003FF000003FF000002A0DE71\r
+:102240000003F0030002BB620003F4000003F0414E\r
+:102250000002BB680003FF000003FF000000D9FC80\r
+:102260000002325A0003E800000230010002BB0203\r
+:102270000000DA3E000348010002B0BF0002444003\r
+:1022800000036801000349980002B40F0002B5FD85\r
+:1022900000026004000241150003C12E0003C13E8C\r
+:1022A0000002A0DE0003F001000383300003683069\r
+:1022B000000348080002B440000081F500026004F9\r
+:1022C000000368080003E8000002B1600003E82092\r
+:1022D0000003E830000369A00003E8000002B11029\r
+:1022E0000003E8200003E83000036A440002B00164\r
+:1022F0000003E8100003E8200003E83000036A60F0\r
+:102300000002BF02000231A10003E8000003C00088\r
+:102310000003C1100002B2FD0003686000000A3B28\r
+:102320000000120C00001A0B0002B00A0002A0DE2E\r
+:102330000003F0410002B00C0003811600026001AE\r
+:102340000003822A0002B10C000262210002A43EB6\r
+:102350000003F0010002B3040002B11600036A603A\r
+:1023600000038FE100022E410003686B0003FF00B1\r
+:102370000003FE00000231CA00034A600000320C74\r
+:1023800000003A0B0002B4F60002B5030003866AAF\r
+:10239000000262260002A47E0003F0010002B704DE\r
+:1023A00000026337000301150002400400036A6065\r
+:1023B0000003400A0002B0010002B1020002B212A2\r
+:1023C0000003E83000036A680002B0800000124297\r
+:1023D000000240080003F0010003E8200002B013EF\r
+:1023E0000002B102000382260003E83000036A7095\r
+:1023F0000002B0210002B1020002B2010002B301EA\r
+:1024000000036A740002B0010002B1020002B20FC0\r
+:102410000002B30100036A7800034A7C0003FF0056\r
+:102420000002B0020002B1020002B30400036A7CA1\r
+:102430000002B0FF0002B1BF0003C12000036860CA\r
+:102440000003E8700002319600034A640002B48081\r
+:10245000000011FC000240040002B403000260040A\r
+:102460000002B31000036A640002305B00034A6498\r
+:102470000002B40800024440000267740002A57E16\r
+:10248000000209470003E800000230010002A0DE5C\r
+:102490000003F003000348220003F4000003F041AE\r
+:1024A000000348260003FF0000038CE60002CAACCC\r
+:1024B0000003F0410002CBBE0002A0DE0003F004E6\r
+:1024C0000003682200036A8A0003F4000003F0425C\r
+:1024D0000003682600036A8E0003E8700002A6BEAF\r
+:1024E0000003F0020003F4000001C91100034012D0\r
+:1024F0000000F1F40002BF040002A0DE0003F003BC\r
+:1025000000026AAF0003F4000003F04100026BBF59\r
+:10251000000360120003F4000001C9470002319B70\r
+:1025200000023196000021F50003FF000003480877\r
+:102530000003FF000003C104000368080003EC006F\r
+:1025400000006A3F0000F1FF0003E8000000821372\r
+:10255000000340080003402D0002B8400002B90803\r
+:1025600000024A080003AAAA00024B490003ABB4C8\r
+:102570000002B30400026FAB0003F0410002B3029B\r
+:1025800000024FAB0003F0010002B3060003402D30\r
+:1025900000000A110002B040000240400003F04178\r
+:1025A0000003E8300002411E0003F0010003E830A0\r
+:1025B00000009A12000021F40003E8500003FF001D\r
+:1025C0000000A2190000A9F400006A3F0003FF0008\r
+:1025D0000003FF000002A0DE0003F003000059F139\r
+:1025E0000003F4000003F043000059F00003FF0073\r
+:1025F0000003FF000000D9EF00034800000384EA55\r
+:102600000003C0440003FF00000240040003680010\r
+:10261000000348040003C07E0003FF000003FF0026\r
+:1026200000024337000368040003402C00005A2BCB\r
+:102630000002B4040003E8F0000244400003F0018B\r
+:102640000002BF0100024BBE0002A0BE0003F00367\r
+:10265000000230C30003F4000001C9990002BFCB9F\r
+:102660000002330D0000F2260000F2250002B0FF48\r
+:102670000002B1BF0003C120000368600002319B6B\r
+:1026800000000A3B0000120C00001A0B0002B0020E\r
+:102690000002A0DE0003F0410002B0040003811636\r
+:1026A00000026001000340150003822A0002B1808D\r
+:1026B000000262210002A43E0003F0010002B30404\r
+:1026C0000002B6F0000244460002B10800026114A4\r
+:1026D00000036A600003400A0002B0010002B10278\r
+:1026E0000002B2000002B3010002A02B0003F002BE\r
+:1026F0000003E8200003C13B00036A680002B00148\r
+:1027000000001241000240090003F0010003E8202C\r
+:102710000002B0130002B102000382260003E83079\r
+:1027200000036A700003402D0000621100001228AF\r
+:102730000002BF4000024F4F0003F0030002A0CE92\r
+:102740000003F0010002B2080002B0210002B10251\r
+:102750000002B30100036A7400000A2B0002B001FA\r
+:102760000003FF00000241100002A41E0003F00558\r
+:102770000002B1040002B2000002B3020003F4043C\r
+:102780000003F0030002B1020002B20F0002B30125\r
+:1027900000036A7800034A7C0003FF000002B001D6\r
+:1027A0000002B1020002B30400036A7C00000A2B9D\r
+:1027B0000003FF000003FF000002411E0002A41EF0\r
+:1027C00000020A34000002130003FF000003FF00B0\r
+:1027D0000002C00E000082130002319600000226A3\r
+:1027E0000003400A0003400D0002A00E0003F005A4\r
+:1027F0000002B00200024005000380040003F4045C\r
+:102800000003F0030002B00800024009000380004A\r
+:102810000002B103000268010000022B0003FF0068\r
+:102820000003FF000002400E0002A40E0003F00BA4\r
+:10283000000012280002B0230002B1030002B3011D\r
+:1028400000036A7400034A7C0003FF000002B00129\r
+:102850000002B1040002B30400036A7C00034A646E\r
+:102860000002B480000011EF000240040002600882\r
+:102870000003A2220002B30100036A640002305B7D\r
+:1028800000023068000001FF0003FF000003FF00AA\r
+:102890000002A00E0003F04E0003402C0002BC0416\r
+:1028A0000003DCC00002BFC00002A0DE0003F00194\r
+:1028B0000002BF800003D8F000038CE40002BF3F99\r
+:1028C00000024B1F00022ED10003E8F00000F9FFC8\r
+:1028D000000002130003FF000003FF000002C00E0F\r
+:1028E0000000821300005A2B00007A250002B8086D\r
+:1028F00000024ABE0002A0AE0001CA580003AAB0FE\r
+:1029000000024AAE0003F04300022D2E0003F40043\r
+:102910000001CA5400034A700002BA880002B9706C\r
+:102920000002A0F80003F0430003C12A0003F400F2\r
+:102930000001CA520003ABB200024BBE0002A0BEAF\r
+:102940000003F0410003C12900036A70000232D77E\r
+:102950000002B0FF0002B1BF0003C12000036860A5\r
+:1029600000000A12000002130003402E0003FF00C3\r
+:102970000002A00100020A6C0002B001000241083E\r
+:102980000003F005000002400003FF000003FF0009\r
+:102990000002A00E00020A6C00034A7400007A28AC\r
+:1029A0000003FF000003FF000003C12F00036A744F\r
+:1029B00000023196000002260003400A0003400D89\r
+:1029C0000002A00E0003F0050002B008000240055E\r
+:1029D000000380000003F4040003F0030002B020B1\r
+:1029E000000240090003A0000002B1430002680198\r
+:1029F0000000022B0003FF000003FF000002400E56\r
+:102A00000002A00E00020A9C000012280002B0433F\r
+:102A10000002B1040002B30100036A7400034A7C9F\r
+:102A20000003FF000002B0010002B1050002B30480\r
+:102A300000036A7C00034A640002B480000011EFC6\r
+:102A400000024004000260080002B8200002600892\r
+:102A50000002B8BF000240080003A2220002B10435\r
+:102A60000003C13E00036A640003F4040003F0089D\r
+:102A700000034A640002B480000011EF0002400429\r
+:102A8000000260080003A2220002B30100036A648E\r
+:102A90000002305B0002306800005A2B0002BA01CD\r
+:102AA0000003FF0000024BBA0002A0BA0003F0428C\r
+:102AB0000003F4000001CAC5000042100002B0018A\r
+:102AC0000002A0DE0003F041000380020002400883\r
+:102AD0000003F0020003F4000001CAC50003400A2D\r
+:102AE0000003FF000002B040000241080002A010F5\r
+:102AF00000020AC5000002260003FF000003FF00D9\r
+:102B00000002C00E000082260002B1020002A401F1\r
+:102B1000000209F1000001EF000041F90003FF008D\r
+:102B20000003FF000003D8000003DC8000007A41AE\r
+:102B30000002B0000003D8010002B0010003DC0174\r
+:102B400000023052000002130003FF000003FF00E8\r
+:102B50000002C00E00008213000231960003400AFA\r
+:102B60000002B0800003FF00000240090003A0043F\r
+:102B70000002B103000268010000022B0003FF0005\r
+:102B80000003FF000002400E0002A40E0003F00B41\r
+:102B9000000012280002B0430002B1050002B30198\r
+:102BA00000036A7400034A7C0003FF000002B001C6\r
+:102BB0000002B1060002B30400036A7C00034A6409\r
+:102BC0000002B480000011EF00024004000260081F\r
+:102BD0000003A2220002B3010002B10000036A64F4\r
+:102BE0000002305B0002306800005A2B0002BA037A\r
+:102BF0000002B9010003FF00000248BA0002A489E4\r
+:102C00000001CB370002B9040003FF00000248BAFC\r
+:102C10000002A08A0001CB19000002250002B208C0\r
+:102C20000002B3000003FF000002A4020001CB3742\r
+:102C30000002A00E0003F04300009A250003F400F8\r
+:102C40000001CA3400024BB90002A0B90001CB3721\r
+:102C5000000092250003F4000001CA340003F400D0\r
+:102C60000001CB37000042100002B0010002A0DEDC\r
+:102C70000003F04100038002000240080003F0025C\r
+:102C80000003F4000001CB370003402E0003FF00D7\r
+:102C90000002B008000241080002A01000020B3739\r
+:102CA0000002B080000241080003F005000002406D\r
+:102CB0000003FF000003FF000002A00E00020B371C\r
+:102CC000000002250003FF000003FF000003E810DE\r
+:102CD00000008A250002A40E00020A3400005A2BCC\r
+:102CE0000003FF0000034A700003FF0000024BBE18\r
+:102CF0000002A0BE0003F0420002B28000036A702E\r
+:102D0000000061F9000059EF0003FF000003DCC080\r
+:102D10000003D8B000007A410002B0000003D801DF\r
+:102D20000002B0010003DC010003400D0002BD40C1\r
+:102D30000003FF0000024DD50002A6DE0003F003F1\r
+:102D400000022EF10003F4040003F00A0002B07F39\r
+:102D50000002B1FF0002B2FF000368600003686B6D\r
+:102D6000000011E50002B3C00003E8D00003604C8E\r
+:102D700000022F2C0002319B000231960003EC0070\r
+:102D800000006A3F0003FF000003FF000002A0DE16\r
+:102D90000003F0030002BB530003F4000003F04102\r
+:102DA0000002BB5B0003FF000003FF000000D9FC32\r
+:102DB000000340100002BB0F000348290002A0DE00\r
+:102DC0000003F0410003482D0002BF040002400B45\r
+:102DD0000003AB0200030FFB00038CF600026CCF74\r
+:102DE00000038FF6000349E80002A34C0003F0043F\r
+:102DF0000003044C0003055F0003F4000003F045EA\r
+:102E0000000384E6000385560003A55600026554BE\r
+:102E10000002644E0003C1040003C1150002A0DEDD\r
+:102E20000003F00400036829000369E80003F400CC\r
+:102E30000003F0420003682D000369EC0003E80082\r
+:102E400000023015000348010002B0BF00024440F8\r
+:102E5000000368010003E8000002B1400003E8201D\r
+:102E60000003E83000036A440002319B0002BF0205\r
+:102E7000000231A100000A3B0000120C00001A0BF6\r
+:102E80000002B0020002A0DE0003F0410002B00424\r
+:102E900000038116000260010003822A0002B1844F\r
+:102EA000000262210002A43E0003F0010002B3040C\r
+:102EB0000002B11800036A600003400A0002B0017A\r
+:102EC0000002B1020002B2120003E83000036A6897\r
+:102ED0000002B08000001241000240080003F0012F\r
+:102EE0000003E8200002B0130002B10200038226B2\r
+:102EF0000003E83000036A700002B0210002B10252\r
+:102F00000002B2010002B30100036A740002B001C2\r
+:102F10000002B1020002B20F0002B30100036A789E\r
+:102F200000034A7C0003FF000002B0020002B1026D\r
+:102F30000002B30400036A7C0003E8000003C00041\r
+:102F40000002B1BF0003C120000368600003E87005\r
+:102F50000002319600034A640002B480000011FCB4\r
+:102F6000000240040002B403000260040002B31037\r
+:102F700000036A640002305B00034A640002B40884\r
+:102F800000024440000267740002A57E00020C119A\r
+:102F90000003E800000230150002A0DE0003F00488\r
+:102FA0000003482A000349E80003F4000003F0424C\r
+:102FB0000003482E000349EC0002BC110002BF10C0\r
+:102FC0000002C99F0002C88C0003C1080003C11998\r
+:102FD0000002A0DE0003F0040003682A000369E891\r
+:102FE0000003F4000003F0420003682E000369ECC4\r
+:102FF0000002BB010000DA3E0003E87000038BE52D\r
+:1030000000038BB60002A58B0003F0020003F4005E\r
+:103010000001CBD4000340120000F1F40002BF20F5\r
+:103020000002A0DE0003F00300026AAF0003F40018\r
+:103030000003F04100026BBF000360120003F400C4\r
+:103040000001CC110002319B000231960003EC001C\r
+:1030500000006A3F0003E800000081D90002B008C8\r
+:10306000000081FB0002A0DE0003F003000059F124\r
+:103070000003F4000003F041000059F00002B07FAB\r
+:103080000002A1FE0003F04100024BB00000D9EFA6\r
+:103090000002B0FF0002B1BF0003C120000368605E\r
+:1030A0000002319B00000A3B0000120C00001A0BCA\r
+:1030B0000002B0020002A0DE0003F0410002B004F2\r
+:1030C00000038116000260010003822A0002B18021\r
+:1030D000000262210002A43E0003F0010002B304DA\r
+:1030E000000340150002B1080002B6F00002444699\r
+:1030F0000002611400036A600002B0010002B10224\r
+:103100000002B2000002B30200036A68000011FB73\r
+:103110000002B0130002B102000382260003E8306F\r
+:1031200000036A70000012280002B0210002B10200\r
+:103130000002B30100036A740002B0010002B10290\r
+:103140000002B20F0002B30100036A7800034A7C58\r
+:103150000003FF000002B0010002B1020002B3044C\r
+:1031600000036A7C0002BC040003DCC0000079EFAD\r
+:10317000000061FB0002BB180003D8F000022ED152\r
+:10318000000001D9000340250002BF100002C00E5C\r
+:10319000000081D900024F5F0003F00300022D2ED2\r
+:1031A0000003F4000001CC730002BF080002A00E6F\r
+:1031B0000003F0010003C1FE000232D700034A8081\r
+:1031C0000002A0FE0003F04100036A84000061EFEA\r
+:1031D0000002B0800003E8F00002A1C00003F0414B\r
+:1031E0000003C1FE00022CE100023196000011EF45\r
+:1031F0000003E8100002B0230003A2220002B30182\r
+:1032000000036A640002305B000061D9000001EF36\r
+:10321000000009F9000340260002B2100003D800A4\r
+:103220000003DC10000079FB0002B0000003D801AD\r
+:103230000002B0010003DC01000242290003F04556\r
+:103240000003AFF00002A0CE0003F0020003FB0079\r
+:103250000003FB010003D09E0003FB000002A52E2B\r
+:103260000003F0010003FB000003D49F0003FB01F7\r
+:103270000002A52E0003F0010003FB0100030FFE76\r
+:1032800000020C95000001D90003FF000003FF00BD\r
+:103290000002C00E000081D9000061EF0002B08082\r
+:1032A0000003C1FE0002A1C00003F0410003E8F0EA\r
+:1032B00000022CE100023196000011EF0002B00381\r
+:1032C0000003E8100003A2220002B30100036A64B5\r
+:1032D0000002305B0002306800034025000001D985\r
+:1032E0000002B1030002B2080002B310000243352D\r
+:1032F0000003F002000242250003F0020002A501D3\r
+:103300000001CC60000061F9000059EF0003FF00EC\r
+:103310000003DCC00003D8B00002B0000003D801F5\r
+:103320000002B0010003DC01000079FB0003400D46\r
+:103330000002BD400003FF0000024DD50002A6DEE2\r
+:103340000003F00300022EF10003F4040003F00A6E\r
+:103350000002B07F0002B1FF0002B2FF000368600C\r
+:103360000003686B000011E50002B3C00003E8D061\r
+:103370000003604C00022F2C0002319B00023196AA\r
+:103380000003EC000002BC110002A0DE0003F00408\r
+:10339000000348CC000348D10003F4000003F042CE\r
+:1033A000000348EC000348F100022D190002A0DEE2\r
+:1033B0000003F004000368CC000368D10003F400AC\r
+:1033C0000003F042000368EC000368F10002A0DE95\r
+:1033D0000003F004000348D4000348D90003F400BC\r
+:1033E0000003F042000348F4000348F900022D19DD\r
+:1033F0000002A0DE0003F004000368D4000368D9D3\r
+:103400000003F4000003F042000368F4000368F9CD\r
+:103410000002A0DE0003F003000348DC0003F40018\r
+:103420000003F041000348FC0002A0FE0003F0048A\r
+:103430000002C00C0002C11C0003F4000003F042B3\r
+:103440000003000C0003011C0002A0DE0003F003D7\r
+:10345000000368DC0003F4000003F041000368FC93\r
+:103460000003EC000002A0FE0003F00A0002C00C02\r
+:103470000002C11C0002C22C0002C33C0002C44C6A\r
+:103480000002C55C0002C66C0002C77C0003F400A9\r
+:103490000003F0480003000C0003011C0003022C91\r
+:1034A0000003033C0003044C0003055C0003066CAE\r
+:1034B0000003077C0003EC000002B07F0002B1FFB4\r
+:1034C0000002B2FF000368600003686B000009E5BA\r
+:1034D0000003E8000003A0030003DC000003D81091\r
+:1034E000000340310002BF030002BC020002A6FC40\r
+:1034F0000003F0410003C1070002A0FC0003F041FB\r
+:103500000003C1060002A0FE0003F0410003C10554\r
+:103510000002A1FE0003F0410003C1040003C1103A\r
+:103520000003C1200003C1300003FE000003D41ECD\r
+:103530000003686B0003FB0000030FFE00020D3B5D\r
+:10354000000340350002BF030003FF000002A6FC99\r
+:103550000003F0410003C1070002A0FC0003F0419A\r
+:103560000003C1060002A0FE0003F0410003C105F4\r
+:103570000002A1FE0003F0410003C1040003C110DA\r
+:103580000003C1200003C1300003FE000003D41E6D\r
+:103590000003686B0003FB0000030FFE00020D53E5\r
+:1035A000000340380003403D0003FF0000036A842D\r
+:1035B00000036A810003EC000003615000036155C1\r
+:1035C0000003615A0003615F000348540003FF00D9\r
+:1035D0000003E8300003A333000368540003686B62\r
+:1035E000000348550003E8000003E8700002B2EF52\r
+:1035F0000002B1FF0002B0BF000368600003686B07\r
+:103600000003497C0002B404000261140003697CD9\r
+:103610000003493C0003FF000002611E0003693CF7\r
+:1036200000034A94000341390003FF000003FF0038\r
+:103630000002A6370003F0070002A6260003F005EB\r
+:103640000002A6150003F0030002A5040003F00128\r
+:1036500000036138000360FC0003FF000003FE006C\r
+:103660000003FF00000348640002B410000242247B\r
+:103670000002A0240003F04300022DDB0003F4004D\r
+:103680000001CD960002B0FF0002B1FF0002B2FFC0\r
+:103690000002B3FF00036A900003493C0003C04EE0\r
+:1036A000000241140003693C000348540002B53F86\r
+:1036B00000024353000368540003E800000081F453\r
+:1036C0000000821A0000821B0003486400038CEA99\r
+:1036D0000000F21500024C0C0003F04800034834CF\r
+:1036E0000003FF00000380080003A00C0002A00EEE\r
+:1036F0000003F80100020DB7000082150003F80373\r
+:10370000000348550003E8000003870700036855DD\r
+:103710000003493D0002BF100002444F0003F004C3\r
+:103720000002BFFF00022E410002BF5000022E41E6\r
+:103730000003A7700003077E00020DCD0003C02028\r
+:103740000003C0100003C000000368600003686B42\r
+:103750000003A010000368600003415000034155BE\r
+:103760000003415A0003415F0003EC000003F8032B\r
+:10377000000349D00002B808000249380002A098AE\r
+:1037800000020E2E000349D40002B410000243349C\r
+:103790000002A03400020E0A000348080002B80824\r
+:1037A0000002600800036808000348280002B820EF\r
+:1037B000000263380003482D00036828000369E80D\r
+:1037C000000267780003682D000369ED000348C814\r
+:1037D0000002B8FB00024228000368C800034898B2\r
+:1037E0000002B82000026008000348B10003689896\r
+:1037F00000026448000368B10003C10E0003C11E4B\r
+:103800000003C12E0003C13E000363300003637058\r
+:1038100000036334000363740003633800036378B8\r
+:103820000003F4000001CE2E000348080002B8F7A0\r
+:103830000002400800036808000348280002B8DFBF\r
+:10384000000243380003482D00036828000369E89C\r
+:10385000000247780003682D000369ED000348C8A3\r
+:103860000002B80400026228000368C800034898F8\r
+:103870000002B8DF00024008000348B10003689866\r
+:1038800000024448000368B10002B0030003C11005\r
+:103890000003C1200003C1300003633000036370E4\r
+:1038A00000036334000363740003C12E0003C13EB0\r
+:1038B00000036338000363780003497C0002B4FB13\r
+:1038C000000241140003697C0003686B0003EC00F4\r
+:1038D000000348CA0002B0040002B1400003C1283E\r
+:1038E00000026820000368CA0003C182000368CA9E\r
+:1038F00000026821000368CA0003C182000368CA8D\r
+:103900000003EC000003F80300030FFE00020E4268\r
+:103910000003EC000003E8000003C0100003C02017\r
+:103920000003A010000368600003686B0003C10E71\r
+:103930000003E8100003E8200003E8300003A413AC\r
+:103940000003D8100003DC400003FE000003D41E77\r
+:103950000003686B000369A40003E8000003FE0095\r
+:103960000003D41E0003686B000369A40002A0DEFC\r
+:103970000003F003000342600003F4000003F04181\r
+:103980000003425C000342590002A0DE000369A468\r
+:103990000003F003000342680003F4000003F04159\r
+:1039A00000034264000369A10003FE000003D41E6B\r
+:1039B0000003686B0003686B0003EC000003E80081\r
+:1039C0000003C0200003C0100003A01000036860C3\r
+:1039D0000003686B000342560003C10E0003E810A9\r
+:1039E0000003E8200003E8300003A4130003D8100C\r
+:1039F0000003DC400003D41E0002BF0200022E417F\r
+:103A00000003686B000369A4000369A20003E800D7\r
+:103A10000003FF000003D41E0002BF0200022E417B\r
+:103A20000003686B000369A40003E8000003C020E2\r
+:103A30000003C0100003C000000368600003686B4F\r
+:103A40000003EC000003686B0002B07F0002B1FFCE\r
+:103A50000002B2FF000368600002B10C0003E8003E\r
+:103A60000003A0030003DC000003D8100003E800FB\r
+:103A70000003E8100003E8200003E8300003FE0024\r
+:103A80000003D41E0003686B0003FB000003FB006F\r
+:103A9000000388E30003F8030003FE000003D41EC4\r
+:103AA0000003686B0003FB000003088E00020EA6F3\r
+:103AB0000003EC00000021FA0003E8500003E86076\r
+:103AC0000003E8700002B9080002B8C00003DC81FE\r
+:103AD0000003D891000342500003F8030003FF00E5\r
+:103AE00000036A440003E8200003011E00036A4447\r
+:103AF0000003FE000003D45F0003686B0002B419EA\r
+:103B00000003FE000003D45F0003686B000349A5B7\r
+:103B10000003FF000003FF000003C1040003C11500\r
+:103B2000000382E0000262260003C137000369A49B\r
+:103B30000002B9080003099E00020ECD000369A52A\r
+:103B40000003EC000002A1BE0003F00A0003D01E37\r
+:103B500000030FBE0003F8030003000E0003011E64\r
+:103B60000003022E0003033E0003D41E00030FFED9\r
+:103B700000020ED60003FB0000030CCE00020ED1A3\r
+:103B80000003EC000002A1BE0003F00A0003D01EF7\r
+:103B900000030FBE0003F8030002C00E0002C11EA6\r
+:103BA0000002C22E0002C33E0003D41E00030FFE1B\r
+:103BB00000020EE60003FB0000030CCE00020EE143\r
+:103BC0000003EC000003D09E0003D01F0002BC3FA6\r
+:103BD0000002488C0002499C00024AAC00024BBC27\r
+:103BE0000002440C0002451C0002462C0002473C27\r
+:103BF0000002BC200002C0840003A0000002A34811\r
+:103C00000003F0410002C00C0002C1950003A110A6\r
+:103C10000002A3590003F0410002C11C0002C2A629\r
+:103C20000003A2200002A36A0003F0410002C22C9C\r
+:103C30000002C3B70003A3300002A37B0003F041DE\r
+:103C40000002C33C0003E8D000038CE900030480B9\r
+:103C50000002E88D000305910002E99D000306A221\r
+:103C60000002EAAD000307B30002EBBD0003626E81\r
+:103C70000002488C0002499C00024AAC00024BBC86\r
+:103C80000003D49E0003426E0002644500026446B5\r
+:103C90000002644700020F1300006A3F0003FB00AC\r
+:103CA0000003FB0100030FFE00020EF10003EC0015\r
+:103CB0000003D09E0003D01F0002BC3F0002488CCE\r
+:103CC0000002499C00024AAC00024BBC0002440CBA\r
+:103CD0000002451C0002462C0002473C0002BC20AA\r
+:103CE0000002C0840003A0000002A3480003F041CA\r
+:103CF0000002C00C0002C1950003A1100002A359EC\r
+:103D00000003F0410002C11C0002C2A60003A22071\r
+:103D10000002A36A0003F0410002C22C0002C3B7F4\r
+:103D20000003A3300002A37B0003F0410002C33C68\r
+:103D30000002BC070002A3DC0003F04E0003704C3D\r
+:103D40000003504E0003FF000003FF000003FE00CD\r
+:103D50000003D41E0003686B0003FB000003704ED9\r
+:103D60000003504C0003FF000003FF000003F404B5\r
+:103D70000003F0080002BC080002A4DC0003F0010C\r
+:103D800000036A840002BC090002A4DC0003F00105\r
+:103D900000036A800002B0FF0002B1BF0002B2FF60\r
+:103DA000000368600003FB000003FB010002CDDE9E\r
+:103DB0000002A6DF00020F2C00034A640002B48058\r
+:103DC0000002400400036A640002B0000002B10077\r
+:103DD0000002B2000002B30100036A740002B031B5\r
+:103DE0000002B1060002B2040002B30000036A78C8\r
+:103DF00000034A7C0003FF000002B0010002B10191\r
+:103E00000002B30000036A7C00034A640002B4802D\r
+:103E1000000240040002B4030002600400036A646C\r
+:103E20000002305B00034A640002B48000024004D8\r
+:103E300000036A6400006A3F000233380003EC00AC\r
+:103E4000000059F60000623E0003FF000002A1BE20\r
+:103E50000003F0420000F1F40003EC000002A1CEE8\r
+:103E60000003F04100030BBE00030CCE0000D9F6A6\r
+:103E70000000E23E00034A4000005A160003FF0023\r
+:103E80000003FF000002A0BE0003F0420003A000F8\r
+:103E90000003A2200003D05E0000620A000059F275\r
+:103EA0000003A20200024009000242290002A58E7E\r
+:103EB00000020FBB0003088E0002A00D0003F00BF0\r
+:103EC000000042070002C44F0003C1540002A0BE1C\r
+:103ED0000003F0460003D45E0002C44F0003C15447\r
+:103EE0000003D45E0002C44F0003C1540002A5AE1B\r
+:103EF00000020FCB00030AAE0002A02D0003F00B5E\r
+:103F0000000052070002C66F0003C1760002A0BE87\r
+:103F10000003F0460003D45E0002C66F0003C176C2\r
+:103F20000003D45E0002C66F0003C1760003D45EB6\r
+:103F300000030CCE00020FCC00026B8A00020F902F\r
+:103F40000003EC00000342700000521600038FECE7\r
+:103F5000000388EA0003AAA00002A4AE0003F00652\r
+:103F60000002A1480003F0410002C4480002A16819\r
+:103F70000003F0410002C66800038AE00002A64F79\r
+:103F80000003F04300030448000300080003011885\r
+:103F90000002A66F0003F043000306680003022836\r
+:103FA0000003033800030AAE00020FDF0003C15410\r
+:103FB0000003C1760003D45E000362700003EC00CE\r
+:103FC0000003C1620003066E0003DC100003D8008A\r
+:103FD0000003D09E0003FF000003FF00000248859D\r
+:103FE000000268830003C1980003C1A80003C1B8A0\r
+:103FF0000003D49E0003FB000003066E00020FF4D2\r
+:104000000003EC000003C1100003C1200003C13015\r
+:104010000002A0DE0003F008000369080003690C39\r
+:104020000003691000036914000369180003691C88\r
+:104030000003F4000003F046000369200003692434\r
+:10404000000369280003692C000369300003693408\r
+:104050000003EC000003C1100003C1200003C130C5\r
+:104060000002A0DE0003F007000368CC000368D064\r
+:10407000000368D4000368D8000368DC0003F40080\r
+:104080000003F045000368EC000368F0000368F4E7\r
+:10409000000368F8000368FC0003EC00000349D447\r
+:1040A0000003FF00000380E500024103000349D242\r
+:1040B0000003FF000002400A000349C20002A510ED\r
+:1040C0000003F001000349C60003EC000002B07FCA\r
+:1040D0000002B1FF0002B2FF000368600003686BDA\r
+:1040E0000003E8000003E8100003C12E0002B33013\r
+:1040F000000369A40003E8000002B1300003E820D7\r
+:104100000003E8300003E8400003A5430003D84063\r
+:104110000003DC500003FE000003D41E0003686BA4\r
+:104120000003FB000003FB000002B0120003E810D4\r
+:104130000003FE000003D41E0003686B0003088E1A\r
+:104140000002104C0003EC000003D09E0003FB00B3\r
+:104150000003FF000003FF000003D49F0003FB01E6\r
+:1041600000030FFE000210520003EC000003F801F0\r
+:104170000002BF0400034A640003FF000003FF00C5\r
+:104180000002410F0002105D0003F8030003686B9A\r
+:104190000003FF000003FF000003FE000003EC002B\r
+:1041A00000034A640003FF000002BF080002410F41\r
+:1041B0000002A01F00021089000340120002B51087\r
+:1041C0000002A5250003F0040002BF0200026AAF4E\r
+:1041D0000003F4000001D0860002C4550002A524AB\r
+:1041E0000003F0040002BF0200026BBF0003F400F2\r
+:1041F0000001D0860002C4450002A5240003F0049B\r
+:104200000002BF1000026AAF0003F4000001D08674\r
+:104210000002BF1000026BBF0000F1F40003601247\r
+:104220000002308A0003EC0000034A700003FF0024\r
+:104230000003C1C20003402E0002B00100036AA8BF\r
+:104240000003FF000003FF000003FF0000034AAC6F\r
+:104250000002B40200036AA90003C0000003C011F9\r
+:104260000003C0220003C03300034AAD0002BF9028\r
+:104270000002A0CF0003F0050003C0440002BF0FFE\r
+:1042800000024F4F0003F4000003F0410003C0F4AC\r
+:104290000002A0DE0003F00B000340190003FF0042\r
+:1042A0000003FF00000264400002655100026662E4\r
+:1042B000000267730003601900026AAF0003F40094\r
+:1042C0000003F0490003401D0003FF000003FF004E\r
+:1042D00000026440000265510002666200026773DA\r
+:1042E0000003601D00026BBF0003602E0003EC00A2\r
+:1042F0000002C44600036AA90003FF000003FF0098\r
+:104300000003FF0000034AAC0003EC000002B07F92\r
+:104310000002B1FF0002B2FF000368600003686B97\r
+:10432000000009E50002B0C00003DC000003D81063\r
+:104330000002A0FE0003F0040003E8000003E81000\r
+:104340000003E8200003E8300002A0FE0003F04470\r
+:104350000002B0550003C1100003C1200003C130AA\r
+:104360000002A0FE0003F0040002B4FF0003C154E9\r
+:104370000003C1640003C1740002A0FE0003F04406\r
+:104380000002B4AA0003C1540003C1640003C17455\r
+:104390000002BC070002A3FE0002113F0000420D14\r
+:1043A0000003FF000003FF000002A08E00021105C1\r
+:1043B0000002A0DE0003F003000340420003F40407\r
+:1043C0000003F001000340460000EA3F00006A0ECF\r
+:1043D0000002A4DE0003F0040003C0880003C099BB\r
+:1043E0000003C0AA0003C0BB0002600800026119FC\r
+:1043F0000002622A0002633B000264480002655921\r
+:104400000002666A0002677B00006A3F0003FF004B\r
+:104410000003FF000003FE000003D41E0003686BCE\r
+:104420000003FB0000030CCE0003FE000003D45E7B\r
+:104430000003686B0003FB0000030CCE00021105B3\r
+:104440000000420D0000620E0003FF000002A08E7B\r
+:104450000002112A0003404A0002A4CE0003F00427\r
+:104460000003C0880003C0990003C0AA0003C0BBBA\r
+:104470000002A4DE0003F0020003C18A0003C19B16\r
+:104480000002BA0F00024AA800038BA600026AAB22\r
+:104490000002BBF000024BB80003A7B600026BB7E6\r
+:1044A0000003F4040003F0030003E8600003E8A045\r
+:1044B0000003E8B00002B4F00002604A0003C1103B\r
+:1044C0000003C1200003C13000036A840002A0FE83\r
+:1044D0000003F0030002B4F00003F4040003F00151\r
+:1044E0000002B40F0002604B0003C1100003C120A2\r
+:1044F0000003C13000036A800003EC000003FE00EB\r
+:104500000003D41E0003686B0003FB0000030CCE05\r
+:104510000002B9030002A0F90003F0440003E840E0\r
+:104520000003E8500003E8600003E8700003FE00A9\r
+:104530000003D45E0003686B0003FB0000030CCE95\r
+:104540000002114B0002B0F00002B1FF0002A0F91E\r
+:104550000003F0420003E8000003E8100003C1215B\r
+:104560000003C13100036A8400036A800003EC0089\r
+:104570000002B07F0002B1FF0002B2FF00036860DA\r
+:104580000003686B000009E50002B0C00003DC0016\r
+:104590000003D8100002B4FF0003C1640003C1741B\r
+:1045A0000002BC070003FE000002B5FF0003D45E5A\r
+:1045B0000003686B0003FB0000030CCE0003FE0049\r
+:1045C0000002B5EF0003D45E0003686B0003FB003C\r
+:1045D00000030CCE000211690002B5FF00036A85DA\r
+:1045E0000002B0F00003C1100003C1200003C1307D\r
+:1045F00000036A8000034A62000231960003E8F07B\r
+:10460000000231A800036A62000009E50002B0C0A0\r
+:104610000003DC000003D8100002B4FF0003C15403\r
+:104620000003C1640003C1740002BC070003FE0064\r
+:104630000003D45E0003686B0003FB0000030CCE94\r
+:104640000002118B0002B0FF0002B1BF0003C120C5\r
+:10465000000368600003EC0000034A640002B480B9\r
+:104660000002400400036A640003EC000002B00191\r
+:104670000003E8100003E8200003E83000036A604C\r
+:104680000003EC000002B0040002A0F00003F003FD\r
+:10469000000230C30003F4040003F00100022D2ED9\r
+:1046A0000003E8000003C0000003C1100002B2FDD7\r
+:1046B0000003686000000A3B0000320C00001A0B87\r
+:1046C0000002B00A0002A0DE0003F0410002B00CBC\r
+:1046D00000038116000260010002B1160002A43E30\r
+:1046E0000003F0010002B3040003866A0002B20274\r
+:1046F0000002B4040002A3FE0003F0030002A0F4D1\r
+:104700000003F0010002B2040002622600036A60A6\r
+:1047100000038FE100022E410003686B0003FF00DD\r
+:104720000003FE000003EC0000034A600003FF00EA\r
+:104730000003E8300002600E00036A6000034A6470\r
+:104740000002B4F20002400400036A640003EC00BB\r
+:1047500000006A3F000340040003FF000002B804A9\r
+:10476000000245E00002A05E0003F0440002A0DE6B\r
+:104770000003F042000340240003FF00000061F842\r
+:104780000003FF000003FF000003DCC000038FEA0A\r
+:104790000002A0DE0003F0010003E8F00003D8F0FF\r
+:1047A00000038CE40003C1B20003493D0002A0DE17\r
+:1047B0000003F041000349410003FF000002446E82\r
+:1047C0000003F0010002BC07000240080003F043B0\r
+:1047D00000022ED10003F4000003F04100022EE19C\r
+:1047E0000002446E0003F0090003E8C00003AB625E\r
+:1047F0000003A5600002455E0003F04300022ED1D5\r
+:104800000003F4000003F04100022EE10003EC007D\r
+:10481000000348C0000348C50003E8100003E85047\r
+:104820000002A0DE0003F008000368C000000231AF\r
+:1048300000000A300003FF000003FF00000368C00F\r
+:104840000003F4000003F046000368C50000222FB7\r
+:1048500000002A2E0003FF000003FF00000368C5CC\r
+:104860000003EC0000006A3F0003FF000003FF00AC\r
+:10487000000051F90002A0DE0003F003000059F12E\r
+:104880000003F4000003F041000059F00003FF00B2\r
+:104890000003DCA00003D8B0000340060003FF00C3\r
+:1048A0000003FF00000240E80003F0030002A0DE66\r
+:1048B0000003F041000340260003FF000003FF0057\r
+:1048C000000349410002A00E0003F0430002A0DEF5\r
+:1048D0000003F0410003C1450002454E0003F043D0\r
+:1048E00000038CE40003F4000003F04100038CE3B8\r
+:1048F000000389980003AA9C0002A0AE0003F00305\r
+:1049000000022ED10003F4000003F04100022EE16A\r
+:10491000000340060003FF000003FF0000034941BD\r
+:104920000002408E0002A00E0003F0430002A0DE51\r
+:104930000003F0410003C1450003E8C00003AB429F\r
+:104940000002454E0003F0070003A5400002455E4B\r
+:104950000003F04300022ED10003F4000003F041F5\r
+:1049600000022EE10003EC000002A0DE0003F003D1\r
+:10497000000348210003F4000003F0410003482530\r
+:104980000003FF000002BB010003A2660003816672\r
+:104990000003A11600038776000260270003000BC6\r
+:1049A0000003A70600038206000266210002A0DEC3\r
+:1049B0000003F0040003682100036A890003F40087\r
+:1049C0000003F0420003682500036A8D0003EC0039\r
+:1049D00000038FED00022E410003E830000382E067\r
+:1049E0000003E8100003E8000003683000038FEDC7\r
+:1049F00000022E410003E8F0000349700003E87054\r
+:104A00000002B6010003C1510003C1400003683138\r
+:104A10000002B8FC0003C1530003C1420002455824\r
+:104A200000034974000232C4000368310003C1511D\r
+:104A30000003C140000232C4000368310003C153C7\r
+:104A40000003C14200034998000232C400036831E8\r
+:104A50000003C1510003C140000232C400036831A9\r
+:104A60000003C1530003C1420003499C000232C449\r
+:104A7000000368310003C1510003C140000232C489\r
+:104A8000000368310003C1530003C142000348E83A\r
+:104A9000000232C4000368310003C1510003C14069\r
+:104AA0000002B710000232C4000368310003C15392\r
+:104AB0000003C142000232C4000368310003EC006D\r
+:104AC0000003493D0002B008000240040003F00565\r
+:104AD00000034AA40003FF000003FF000002B2032A\r
+:104AE00000036AA40002B004000241040002A01006\r
+:104AF0000003F046000348C0000348C50002B103AC\r
+:104B00000002B503000368C0000368C50003EC00A1\r
+:104B10000003FF000003FF000003FF000003EC00A0\r
+:104B20000003614800036141000361460003627FA6\r
+:104B30000003C10E0003E8100003E8200003E83082\r
+:104B4000000368E80003E8000003FF00000368E8D2\r
+:104B5000000341480003FF000003EC000002B07FA7\r
+:104B60000002B1FF0002B2FF000368600003686B3F\r
+:104B7000000009E50003E8000003A0030003DC00D7\r
+:104B80000003D8100002BC030002B0F70002A0FE30\r
+:104B90000003F0410002B07F0003C1100003C120F8\r
+:104BA0000003C1300002B4FF0003C1540003C1641C\r
+:104BB0000003C1740003FE000003D41E0003686BF1\r
+:104BC0000003A0010003A1110003A2210003A331EF\r
+:104BD0000003FB000003FE000003D45E0003686BCB\r
+:104BE0000003FB0000030CCE000212ED0002B0FF38\r
+:104BF0000002BC080003C1100003C1200003C13043\r
+:104C000000036A800002A4FE0001D3070002A0FC9A\r
+:104C10000003F00200036A840003EC000002B0F716\r
+:104C20000003A1010003A2110003A32100036A8471\r
+:104C30000003EC000003493D0003FF000002B880C0\r
+:104C4000000264480003693D0002B0010002B102A5\r
+:104C50000002B23F0002422F0002B30000036A6864\r
+:104C60000002B0000002B1000002B2000002B30274\r
+:104C700000036A740002B1010002B2080002B3002E\r
+:104C800000036A780002B0010002B20000036A7CEF\r
+:104C9000000011EF0002B0C00002400F0003A002AC\r
+:104CA0000002600E0002B1000003A2220002B30164\r
+:104CB00000036A640002B0FF0002B1BF0003C1201C\r
+:104CC000000368600003FF000003FF000002305B88\r
+:104CD0000002B87F000244480003693D0003EC0075\r
+:104CE0000003E8000003E8100002B2030002B30072\r
+:104CF000000368300003EC000003402C0003FF00B9\r
+:104D00000003FF000003E8200003E8300003602CEC\r
+:104D10000003E8000003E810000360180003601CB3\r
+:104D20000003EC000003E8000000823F000222FACA\r
+:104D30000000F23F000222FA0002338F00022E34FC\r
+:104D4000000349980002B4F70002B50F00024114B5\r
+:104D500000026005000369980003C12E0003E830DB\r
+:104D60000003683000000217000381E00003E84000\r
+:104D70000002A0010003F0010003C14E000234A3B1\r
+:104D8000000348080002B8FE00024118000368084A\r
+:104D90000003E8000000823F0002245A0000F23FB6\r
+:104DA0000002245A00000217000381E00003FF0004\r
+:104DB0000002A4100003F0020003C14E000234A35D\r
+:104DC000000233F3000340000002BC200003FF0098\r
+:104DD0000002422C0003F0020002BD00000234C8B1\r
+:104DE000000340000002BC200003FF000002433C1F\r
+:104DF0000003F0020002BD01000234C80003402C91\r
+:104E00000002B8400002B9800002BBFF00034AA5BF\r
+:104E1000000248180003F0010002BBCF000249194C\r
+:104E20000003F0020002BA3F00024BBA0002455BE9\r
+:104E300000036AA50003F4000001C26C000349D11D\r
+:104E40000002B84000024478000384400003489CFC\r
+:104E5000000348A2000385E200026004000260052E\r
+:104E600000026884000268850003689C000368A251\r
+:104E7000000348B4000348BA000385E2000260045E\r
+:104E8000000260050002688400026885000368B4BF\r
+:104E9000000368BA00034938000385E10003C055E8\r
+:104EA000000242250003693800036A5C0003A0E1A8\r
+:104EB000000381E10003E830000382E8000385E598\r
+:104EC00000022FF0000343A6000380E80003FF0068\r
+:104ED00000024885000268800003C1980003C1A851\r
+:104EE0000003C1B8000363A6000363E60003E80003\r
+:104EF0000003E8D0000230010003C1DE00023001EF\r
+:104F000000023027000384E20003C1C90003E80067\r
+:104F1000000381E1000383E40002C2310003022E9A\r
+:104F20000002C33E000244490003F001000383E590\r
+:104F30000003E85000022FF0000380EA00022FF087\r
+:104F4000000388E5000384E00002444C0003F00203\r
+:104F5000000388E40002C88E0003C1980003C1A8C2\r
+:104F60000003C1B80003632A0003636A000230270C\r
+:104F7000000381E20003A0E10003A396000382E4A2\r
+:104F80000002C22E0003E85000022FF00003A0E34D\r
+:104F900000022FF000023027000380E5000240A04D\r
+:104FA0000003C1100003C1200003C130000364A846\r
+:104FB000000364E8000380E000028208000242026D\r
+:104FC00000038224000091E30003EC00000230277C\r
+:104FD000000349700002448E0003F0430002B5F361\r
+:104FE00000024225000369700003E8700003C16EEF\r
+:104FF0000003C1530003C142000368310002449E14\r
+:105000000003F0060003499C0003A4E100026224AF\r
+:105010000003C1530003C142000368310002448E03\r
+:105020000003F04D0003499C000384E50003A5E75D\r
+:1050300000024004000241150003A48800038440DC\r
+:105040000003854600026005000261140003E83099\r
+:105050000003C12E00036830000343A4000021E3D5\r
+:105060000002B50F0003FF000002400500026004CB\r
+:105070000003C1100003C1200003C130000363A47A\r
+:10508000000363E4000381840003A0180003820688\r
+:10509000000260020003E8D0000230150003C1DE08\r
+:1050A00000023015000348900003A4BA0003A5E7EE\r
+:1050B000000241150002611400036890000368A813\r
+:1050C00000036894000368AC0003A0A60003C110AD\r
+:1050D0000003C1200003C1300003642400036464A2\r
+:1050E00000038AB6000348210002B8030002666884\r
+:1050F0000002B90F0002BBFE000246690002666AA8\r
+:105100000002477B0003682100036A8900036825C9\r
+:1051100000036A8D00034808000348210002611E55\r
+:1051200000036808000348C80002B8400002B93F05\r
+:1051300000026008000368C800024009000368C854\r
+:105140000002655E0003682100036A890003682588\r
+:1051500000036A8D0002455B0003682100036A8931\r
+:105160000003682500036A8D0003EC000003402C57\r
+:105170000002B8400002B9800003E8B000034AA56D\r
+:10518000000248180003F0010002BB300002491978\r
+:105190000003F0020002BAC000026BBA0002655BB5\r
+:1051A00000036AA50003489C000348A10002BC7BE1\r
+:1051B0000002400C0002444C0003689C000368A1FC\r
+:1051C000000348B4000348B90002400C0002444CFC\r
+:1051D000000368B4000368B900034890000384E248\r
+:1051E0000003A5E700024115000261140003689066\r
+:1051F000000368A800036894000368AC0003493802\r
+:10520000000385E1000262250003693800036A5C3F\r
+:105210000003A0E1000381E1000383E8000382E8CA\r
+:10522000000385E500022FF00003E800000381E1A0\r
+:10523000000383E40002C2310003E8300003E850B9\r
+:1052400000022FF0000380EA00022FF0000348085C\r
+:10525000000348210003A8ED00024118000368087C\r
+:105260000003A8EB000246680003C03E000245535D\r
+:105270000003682100036A890003682500036A8D22\r
+:105280000003E840000234A30003EC00000349746B\r
+:105290000003C16E0003E870000388480003C05E8D\r
+:1052A0000003855900024225000262280003697448\r
+:1052B0000003C1420003C153000368310003EC0046\r
+:1052C000000348080002B8FE000241180003680805\r
+:1052D000000348540002BF600002622F00036854BC\r
+:1052E000000349760002BF10000264AF0003C15BF7\r
+:1052F0000003C16E0003E87000036831000232C48D\r
+:10530000000348540002BF9F0002422F000368546C\r
+:105310000003C14A00036831000234450003EC0079\r
+:1053200000022E450002319B00022D2E0002369F06\r
+:105330000003E8C00000E2100003C13C000234F5A5\r
+:105340000002333E00022E34000234B00002BF18C7\r
+:10535000000236470002308A000062100002B000EE\r
+:105360000003DC000002B0000003DC0100038FC278\r
+:105370000002B0400002C00F0003D8000002B0805D\r
+:105380000002C00F0003D801000340180002A0DE95\r
+:105390000003F0410003401C0003402D0003FF0008\r
+:1053A0000003D41E0003D45F0002B0100002CCCE74\r
+:1053B0000000E2100002A5C0000214CE0002302757\r
+:1053C0000003A396000234F50002319B00023196DF\r
+:1053D0000003EC000002B1040002B0800002A0DE75\r
+:1053E0000003F0410002B0C00002B2090003E8501F\r
+:1053F00000022FF00003EC000000F1DE0000F1DD00\r
+:105400000003C1FD0003C1CE000348040003C07EB9\r
+:105410000002433700036804000348080003FF004C\r
+:10542000000384E800026004000368080003499850\r
+:10543000000385E20003C05500024115000384E526\r
+:10544000000260040003E8300003C12E000368304E\r
+:105450000003E8D000022E910003F8010003400D84\r
+:105460000003FF000002B0010002400600021532F6\r
+:105470000002A0ED0003F0050002BB3E00024BB6A7\r
+:105480000003ABB00003F4040003F00D0002B00011\r
+:105490000002B2020003A36A00030BAE0002A030B8\r
+:1054A0000003F00700030BBE0002A03E0003F0045F\r
+:1054B00000030BBE0002A0320003F00100030BBE8C\r
+:1054C0000003F4040003F0010003E8B000034819EE\r
+:1054D0000002B2E0000246620002666B0003681937\r
+:1054E000000349E50003FF00000246620002666B0C\r
+:1054F000000369E50003C1AB00022E4500022EAD9A\r
+:105500000002B40F00034A400003F8010002A44067\r
+:105510000003F0060002A4410003F0040002A442CC\r
+:105520000003F0020002A0430002155E0002CAAEB2\r
+:105530000002B0200002A0A00003F0410003E8A098\r
+:105540000002A0AB00021586000348190002B2E079\r
+:10555000000246620002666A00036819000349E51A\r
+:105560000003FF00000246620002666A000369E56C\r
+:105570000003F4040002153F0000D1DF0002A0DEAA\r
+:10558000000215650000D1E00002CDDE0003F40446\r
+:1055900000021516000041E00003FF000003FF00B9\r
+:1055A0000002A0A80002158C0002A1A80003F04888\r
+:1055B000000348210003038A00038330000267735D\r
+:1055C0000003682100036A890003F4040002158CBB\r
+:1055D000000348190002B2E0000246620002666859\r
+:1055E00000036819000349E50003FF00000246625A\r
+:1055F00000026668000369E500034825000303A86C\r
+:1056000000038330000267730003682500036A8D7E\r
+:105610000003F4040002158C000340110003E8C0ED\r
+:105620000000F1F40002B880000267780003601106\r
+:105630000003C1DF00034998000385E20003C05561\r
+:1056400000024115000369980003E8300003C12EF1\r
+:1056500000036830000348080003FF00000384C80B\r
+:1056600000026004000368080003F8030003EC0074\r
+:105670000003FF000003FF0000006A3F0003E80092\r
+:1056800000008219000081DC0002B0010002B111AB\r
+:105690000002B21000036A440002B1100003E820C7\r
+:1056A00000036A44000340240002A0DE0003F0036C\r
+:1056B0000002BB530003F4000003F0410002BB5B97\r
+:1056C0000000D9FC0002400E0003F04B0003401024\r
+:1056D0000002BC040003DCC000038FEA0002A0DE6D\r
+:1056E0000003F0010003E8F00003D8F00002BC0959\r
+:1056F0000003C1B100022ED1000340240003FF00CB\r
+:105700000002BC020002400C0003F04B00034010FA\r
+:105710000002BC040003DCC00002BFC00002A0DE27\r
+:105720000003F0010002BF800003D8F000038CE406\r
+:105730000003C1B100022ED1000348080002B440AA\r
+:10574000000081F5000260040003680800034801BE\r
+:105750000002B0BF00024440000368010003E800FB\r
+:105760000002B1400003E8200003E83000036A446F\r
+:105770000002319B00022D2E0002369F0002BF184E\r
+:1057800000023647000236740002BF00000231A159\r
+:1057900000034A700003FF000003FF000002B29004\r
+:1057A00000036A700002BF1300023647000236741D\r
+:1057B000000340240003FF000003FF000002400E2E\r
+:1057C0000003F04B000340100002BC040003DCC0E7\r
+:1057D00000038FEA0002A0DE0003F0010003E8F0FE\r
+:1057E0000003D8F00002BC0900038B1000022EE178\r
+:1057F000000340240003FF000002BC020002400C32\r
+:105800000003F04B000340100002BC040003DCC0A6\r
+:105810000002BFC00002A0DE0003F0010002BF8052\r
+:105820000003D8F000038CE400038B1000022EE18B\r
+:1058300000034A700003FF000003FF000002B28073\r
+:1058400000036A700002BF18000236470002367477\r
+:105850000002BF00000231A100034A700003FF00F4\r
+:105860000003FF000002B29000036A700002BF1341\r
+:105870000002364700023674000340240003FF0094\r
+:105880000003FF000002400E0003F04B0003401035\r
+:105890000002BC040003DCC000038FEA0002A0DEAB\r
+:1058A0000003F0010003E8F00003D8F00002BC0997\r
+:1058B0000003C1B100022ED1000340240003FF0009\r
+:1058C0000002BC020002400C0003F04B0003401237\r
+:1058D0000002BC040003DCC00002BFC00002A0DE66\r
+:1058E0000003F0010002BF800003D8F000038CE445\r
+:1058F0000003C1B900022ED10002319B0002319693\r
+:10590000000021F50003FF00000348080003FF002A\r
+:105910000003C104000368080003EC000003E80072\r
+:105920000003C0000002B1BF0003C1200003686093\r
+:105930000002B0010003E8100003E8200003E83093\r
+:1059400000036A6000034A640002B480000240045D\r
+:1059500000036A6400000A3B0000120C00001A0BEE\r
+:105960000002B0020002A0DE0003F0410002B00419\r
+:1059700000038116000260010003822A0002B18444\r
+:10598000000262210002A43E0003F0010002B30401\r
+:105990000003C11F00036A6000034A640002B48070\r
+:1059A000000011FC000240040002B4030002600485\r
+:1059B0000002B31000036A640002305B0002BF08FB\r
+:1059C00000024FF00003F0010000F2190003EC00A8\r
+:1059D000000002190003FF000003FF000002A50EF3\r
+:1059E0000003F0010003EC000003E800000082194E\r
+:1059F000000340120003FF000003FF000002448E7A\r
+:105A00000002A04E0003F0010000F1F40002BF40CC\r
+:105A10000002A0DE0003F00300026AAF0003F400FE\r
+:105A20000003F04100026BBF000360120002308AE5\r
+:105A3000000079DC0003FF00000340280002A0FE04\r
+:105A40000003F0410003EC000002A0DE0003F005BB\r
+:105A50000002C00E0003F0410002C11E0003F4006A\r
+:105A60000003F0430002C22E0003F0410002C33ED7\r
+:105A7000000360280000F1DC0003EC000002B0012C\r
+:105A80000002B1020002B2060003E83000036A68B7\r
+:105A9000000012410002B0130002B102000382268E\r
+:105AA0000003E83000036A70000340050002B021E3\r
+:105AB0000002B1020002B2040002B4030002455425\r
+:105AC000000302250002B30100036A740002B00162\r
+:105AD0000002B1020002B20F0002B30100036A78B3\r
+:105AE00000034A7C0003FF000002B0000002B10086\r
+:105AF0000002B30400036A7C0003EC0000000214FF\r
+:105B000000000A4000006A3F0003FF00000240015D\r
+:105B10000002A00E0003F0010003EC000003489C0B\r
+:105B2000000348A100034A4A0002A0DE0003F0433C\r
+:105B3000000348B4000348B900034A4E0002BC10F9\r
+:105B40000002622E0002666E0002688C0002699CF0\r
+:105B50000002A0DE0003F0050003689C000368A1BA\r
+:105B600000036A4A0003F4000003F043000368B432\r
+:105B7000000368B900036A4E0003E8C00000E1DBDF\r
+:105B80000002B0100002B1000002B2100002B30027\r
+:105B9000000362740002B0800003D8010002B0006C\r
+:105BA0000003DC010002B0120002B1020002B212D6\r
+:105BB0000002B302000362740002B0100002B112CE\r
+:105BC0000002B2100002B3120003627000036244CC\r
+:105BD0000002B1020002B3020003624C00036248FB\r
+:105BE0000002333E000061DB0003C18C0003C19C56\r
+:105BF0000003C1AC0003C1BC000237800002359E27\r
+:105C0000000061DB0003FF000002B0000003DC00C5\r
+:105C10000002B04000038FC20002C00F0003D80092\r
+:105C2000000340180002A0DE0003F0410003401C06\r
+:105C30000003402D0003FF000003D41E0003D45FC7\r
+:105C40000002BF000003DCF00002BFC0000388C2F6\r
+:105C50000002CFF80003D8F00003C4000003C41111\r
+:105C60000003C4220003C4330002B50F00024465E0\r
+:105C70000003A5660002A0DE0003F0430002B50F9A\r
+:105C8000000244750003A5760003A6420003844A7F\r
+:105C90000003A7520003855A0003C4440003C466EE\r
+:105CA0000002C0010002C0040002C2230002C2269A\r
+:105CB0000003C4150003C4370003D41E000342755B\r
+:105CC000000342720002BF100002A1040003F0466C\r
+:105CD0000002A5090003F0040003C18C0003C19079\r
+:105CE0000003C1AC0003C1B00002A3090003F042ED\r
+:105CF0000003C1AC0003C1B000036272000342465E\r
+:105D00000002A1260003F0460002A5290003F004CA\r
+:105D10000003C18C0003C1920003C1AC0003C1B2F7\r
+:105D20000002A3290003F0420003C1AC0003C1B28A\r
+:105D3000000362460003424E0002A1150003F04634\r
+:105D40000002A5190003F0040003C18C0003C191F7\r
+:105D50000003C1AC0003C1B10002A3190003F0426B\r
+:105D60000003C1AC0003C1B10003624E0003424A0C\r
+:105D70000002A1370003F0460002A5390003F00439\r
+:105D80000003C18C0003C1930003C1AC0003C1B385\r
+:105D90000002A3390003F0420003C1AC0003C1B309\r
+:105DA0000003624A000362740003FB010002B110A9\r
+:105DB0000002CCCE0000E1DB0002A0C10001D6F859\r
+:105DC00000034270000342450003FF000002C802C6\r
+:105DD0000003A8800002CA460003AAA00003424CA8\r
+:105DE000000342490003FF000002C9020003A9901A\r
+:105DF0000002CB460003ABB0000237800003EC008A\r
+:105E00000003489C000348A10002A0DE0003F0420A\r
+:105E1000000348B4000348B90003C1180003C15A85\r
+:105E20000003899600038BB6000261190002655BCE\r
+:105E30000002A0DE0003F0040003689C000368A1D8\r
+:105E40000003F4000003F042000368B4000368B9E3\r
+:045E50000003EC005F\r
+:00000001FF\r
diff --git a/firmware/radeon/CAYMAN_me.bin.ihex b/firmware/radeon/CAYMAN_me.bin.ihex
new file mode 100644 (file)
index 0000000..6c642ad
--- /dev/null
@@ -0,0 +1,545 @@
+:100000007C408001CC80004D88000000D440007FFF\r
+:1000100080000000D840005DC410002C25100002B4\r
+:100020009500FFFE248C00027C410001C41C0031BD\r
+:10003000C420002FD8000057CDC1A0D9CE01A0DA2E\r
+:10004000D840005798C0000FC41400099540000222\r
+:10005000D941A2A4C41B002AD8000056CD80005468\r
+:10006000C03E0004CC01A1F4CC3D2004C43D0003FB\r
+:10007000CC000047D8400056D840005E8000000009\r
+:10008000C40C000A043C002394C00002CFC1A2A407\r
+:10009000C41B002BD8000056CD800055C03E000484\r
+:1000A000CC01A1F3CC3D2004C43D0003CC000049A9\r
+:1000B000D8400056D840005E80000000043C002379\r
+:1000C000CFC1A2A4CC00004BD8000055CC400063A7\r
+:1000D00080000000CC000046CC00004BCC412264E4\r
+:1000E000CC412265CC412266CC41A2DD7C4080011E\r
+:1000F000CC80004D88000000CC400046CC00004B76\r
+:100100008C000546CC412264CC412265CC4122665C\r
+:100110008C00054ACC41A2DD7C408001CC80004DA2\r
+:10012000880000007C40C001CC00006294C0FFB594\r
+:10013000CC000041800000007C40C001C0160004DB\r
+:1001400024D0FFFF7D15000ACC11000018D8003E16\r
+:1001500014DC001FC42100037C42400195C000054F\r
+:10016000CC00004D7E56800ACC290000C425000337\r
+:100170007E2600097C42C00195800005CC00004D20\r
+:100180007ED7000ACC310000C42D00037E2E000A69\r
+:10019000CC00004D2510FFFFCE11000080000000B4\r
+:1001A0007C40C001CC40004080000000CD41225D79\r
+:1001B000CC400045CC00004ACD01225CCC41A1FCE2\r
+:1001C0007C408001CC80004D88000000CD41225D44\r
+:1001D000CC400045CC00004ACD01225CCC41A1FCC2\r
+:1001E0007C408001CC80004D88000000CC4122572B\r
+:1001F000800000007C418001CC400045CC40004A9A\r
+:10020000CC41225CCC41A1FC7C408001CC80004DE3\r
+:1002100088000000CC000045CC00004ACC41225CA4\r
+:10022000CC41A1FC7C408001CC80004D88000000C6\r
+:10023000C00E0001CC000045CC00004ACC41225C3D\r
+:10024000CC41A1FCD44DA1FD7C408001CC80004D6F\r
+:1002500088000000CC41225D80000000CC000045F9\r
+:10026000CC00004A084C00017C4100017C41400167\r
+:100270002558FFFF195C03F015600015CD81A10220\r
+:10028000CDC12256CE01225C2924002094C0000456\r
+:10029000CE41A1FC08CC00018000009BCD01A1FC57\r
+:1002A000CC01A1027C408001CC80004D8800000080\r
+:1002B0007C4080017C40C001C02A00027C410001DA\r
+:1002C0007D29000A2494000124980006249C030040\r
+:1002D00015DC00087C4200017C424001C02E000475\r
+:1002E0009540000D05F022587F2F000ACC31000008\r
+:1002F000C4290003CCC12169CD01216ACE81216BC3\r
+:1003000031B40002CC01216C9740000CC434000DC4\r
+:10031000800000D931B4000297400008C02E0004CC\r
+:1003200005F022587F2F000ACC310000C4290003B9\r
+:10033000C434000D800000D931B40000974000049F\r
+:100340007E028001C434000D800000D931B4000465\r
+:100350009740FF2CCE01216DCE41216EC42A0002B0\r
+:10036000C434000D9B400003CC00004D8C000342C0\r
+:1003700031F40000C02E00049740000CCE81A2B7DB\r
+:10038000CC2DA2B6C42D0003C03000067EF340146D\r
+:10039000C03000207F6B80117FB3C015CF81A2C415\r
+:1003A000CFC1A2D18000000031F40001C02E0004B2\r
+:1003B0009740000CCE81A2BBCC2DA2BAC42D000365\r
+:1003C000C03000067EF34014C03000207F6B8011E7\r
+:1003D0007FB3C015CF81A2C5CFC1A2D280000000DB\r
+:1003E00031F40002C02E00049740000CCE81A2BF61\r
+:1003F000CC2DA2BEC42D0003C03000067EF34014F5\r
+:10040000C03000207F6B80117FB3C015CF81A2C6A2\r
+:10041000CFC1A2D380000000C02E0004CE81A2C3B1\r
+:10042000CC2DA2C2C42D0003C03000067EF34014C0\r
+:10043000C03000207F6B80117FB3C015CF81A2C771\r
+:10044000CFC1A2D480000000041800008000011574\r
+:10045000041800017C40C001C424003118D00030D1\r
+:1004600024D400FF950000099A4000038C00034249\r
+:10047000CD41A0DAC420003296000004D8400053D9\r
+:100480008C000365CD41A0DA99800002CC000042C7\r
+:10049000CD40006180000000D80000487C40C001D1\r
+:1004A000C424003124D400FF9A400003D800005433\r
+:1004B000D8000047C420003296000004D840005302\r
+:1004C000D8000055D8000049D8400064CD400061F4\r
+:1004D000800000007C40C00118D001E818D4003032\r
+:1004E00018D800340528013D7C4200017C424001BF\r
+:1004F00095000007868000008000015780000542BB\r
+:100500008000017B800005428000014D11540010E5\r
+:100510007E16000ACC80004DD46100009580FEB9A3\r
+:10052000C03A0004CC392140C43900037C4080012A\r
+:100530008800000011540010522400207E26001A6A\r
+:10054000CD400058D46200009580FEAEC420001C4F\r
+:100550009A00FFFF7C40800188000000DC3A000028\r
+:100560009940001B279C000195C0000D0BB80001AD\r
+:10057000CE012169CE41216ACC41216BCC01216C95\r
+:100580009B8000039580FE9F8000016F52640020D5\r
+:100590007E26001A462000045624002022640032E1\r
+:1005A000CE012169CE41216A0BB80002CC41216BFA\r
+:1005B000CC41216C9B80FFFD9580FE92C4300015DC\r
+:1005C0009700FFFF7C408001880000000BB800010D\r
+:1005D000CE012169CE41216ACC41216BCC01216C35\r
+:1005E0009B80FFFB9580FE878000016F1620000234\r
+:1005F000C02A0001CE0125C7D46925C89580FE8197\r
+:10060000C03A0004CC3925CBC43900037C408001BA\r
+:10061000880000007C40C0017C4100011914003DAD\r
+:1006200099400009C41C001295C0FFFFCCC12100F5\r
+:10063000CD012101CCC12102CD012103D901A2A408\r
+:10064000800000002518100095800004C41C0012D2\r
+:1006500031E400409640FFFECCC12175CD012176EA\r
+:10066000C42000139600FFFF162800019A800003A3\r
+:10067000CC00004E80000000CC00004ECCC12175A3\r
+:10068000800001977C40C0017C410001CC00004506\r
+:10069000CC00004A40D40003CD41225CCD01A1FC36\r
+:1006A000C01E00017C42000108CC000106240001AC\r
+:1006B00006280002CE1DA1FDCE5DA1FDCE9DA1FDAF\r
+:1006C00098C0FFF97C408001CC80004D880000007C\r
+:1006D0007C40C00124D0000114CC00017C414001C9\r
+:1006E0007C41800195000005CD41216DCD81216EB9\r
+:1006F000C41E0002800001C2C02200047E16000A4F\r
+:10070000CC210000C41D00037C4240017C428001DA\r
+:1007100098C00003CDE5000080000000CE412169B3\r
+:10072000CE81216ACDC1216BCC01216C80000000FB\r
+:100730007C40C0017C4100017C4140017C41800142\r
+:100740007C41C00118A41FE83268003C042000016D\r
+:10075000968000087C4200013A30000342200002EB\r
+:100760009B0000020420004004240001800001DD01\r
+:100770007E0240010A6400019A40FFFF24EC001051\r
+:10078000CC00004D9AC00009C02A0004C42C0017F8\r
+:100790007E92800ACC000041CC290000CEC0001718\r
+:1007A000C4310003800001EDCD01216DCD41216EEA\r
+:1007B000C43200027F1F000924F40007077801F10A\r
+:1007C0009740002787800000800001F9800001FE2B\r
+:1007D00080000203800002088000020D80000212E7\r
+:1007E000800002177F1B800F14A400089780001D53\r
+:1007F000266400FF800002287F1B800E14A40008DE\r
+:1008000097800018266400FF800002287F1B800C60\r
+:1008100014A400089B800013266400FF80000228B7\r
+:100820007F1B800D14A400089B80000E266400FF2F\r
+:10083000800002287F1B800F14A400089B80000901\r
+:10084000266400FF800002287F1B800E14A400088D\r
+:100850009B800004266400FF8000022814A4000886\r
+:10086000266400FF3268003C14EC00089A80FDE525\r
+:100870007C4340017C4380017C43C001CC00004D9F\r
+:1008800096C00006CF412169CF81216ACFC1216B7B\r
+:10089000CC01216C80000000CFF50000800000003A\r
+:1008A0003268003C9A80FFB4D440007F8000000092\r
+:1008B0007C40C0017C410001C01E000115140012E3\r
+:1008C000C0220002C026000495400004C027FFFBA0\r
+:1008D0007D250009C02600007DD280097E12C00956\r
+:1008E0007D25000A7C4140017C418001CCC1216909\r
+:1008F000CD01216A9A800007CD41216BCD81216C09\r
+:1009000096C0FDC0C43000159700FFFF80000000B6\r
+:10091000C414001455580020CD41216BCD81216CA9\r
+:1009200096C0FDB8800002417C4100017C4140013D\r
+:10093000CC400043CC400044C00E80007C424001CB\r
+:100940007C42800116AC001FC035F00096C0FDADA2\r
+:10095000CE4003E026780003127C00087FF7C00930\r
+:100960007FFBC00A16780018CFC003E1CF8003E2F6\r
+:1009700012B000027F3F0001CF0003E37C80C00182\r
+:10098000800004567C40C00118D001E805280265AB\r
+:1009900095000008868000008000026E8000027CC6\r
+:1009A00080000282800002888000028D8000029315\r
+:1009B000CCC1A2A480000000C01208007C4140010C\r
+:1009C0007C4200017D0CC00AC012000415580003CF\r
+:1009D000155C000D7DD1C009122000137E1E400A57\r
+:1009E0007E4E800ACE81A2A4CD81A1FE80000000AF\r
+:1009F00004102118C41400109540FFFFD4510000CA\r
+:100A0000CCC1A2A48000000004102106C41400116F\r
+:100A10009540FFFFD4510000CCC1A2A4800000008B\r
+:100A2000D8400016CCC1A2A4C41000169900FFFF44\r
+:100A30008000000004102100C41400129540FFFF44\r
+:100A4000D4510000CCC1A2A48000000024D8000131\r
+:100A50007C4100017C4140017C4200019580000600\r
+:100A600011980010C41C000AC43C002797C0FFFF67\r
+:100A7000800002A111980010C41C0009C43C002889\r
+:100A800097C0FFFF1568001D7D59400A11E4000A58\r
+:100A90009A8000037E26000ACDC0005CCD0121585B\r
+:100AA000CD412159CE01215ACCC1A2A48000000021\r
+:100AB0007C40C00114D0001D14D4001C9900000615\r
+:100AC0009540FD50C0260004CC252154C4290003C4\r
+:100AD00080000000CD400057800000002474000119\r
+:100AE00024780002C40C001F9B4000028C000342CB\r
+:100AF000C4140021041000109B8000028C00035CD1\r
+:100B0000CCC1A250CD01A050041804008C00030BEE\r
+:100B1000CC000059C43C0023C410001F8C00031BF0\r
+:100B2000C41C002525DC0001C838002695C000053E\r
+:100B3000C43C002347B80550CC000058CFFA000051\r
+:100B4000C424001D9A40FFFF04300001C42800198E\r
+:100B50003EA80004C42C001A7EAE800A9A80FFFCD6\r
+:100B6000CF00005150D8000814DC001829DC8000A8\r
+:100B7000CD812180CDC1218151200008152400188C\r
+:100B80001330001E7E72400A21540035CE012182AE\r
+:100B9000CE412183CD4121847C408001CC80004D19\r
+:100BA000880000002474000124780002C40C002096\r
+:100BB0009B4000028C000342C41400220410001069\r
+:100BC0009B8000028C00035CCCC1A260CD01A060C0\r
+:100BD000041809808C00030BCC00005AC43C00248C\r
+:100BE000C41000208C00031BC41C002525DC000160\r
+:100BF000C838002695C00005C43C002447B80554F9\r
+:100C0000CC000058CFFA0000C424001E9A40FFFF19\r
+:100C1000C42800193EA80004C42C001B7EAE800A24\r
+:100C20009A80FFFC04300002800002D80598C000C2\r
+:100C300010DC000814E00018CDD90000C41C001816\r
+:100C4000CDD90001C42400187E62400ACE590002AA\r
+:100C5000C41C0018C4200018C4240018CDD90003F7\r
+:100C6000CE190004CE590007900000001BF800F0D8\r
+:100C7000C0360800C030008097800002900000005D\r
+:100C8000D800005DC438002C27B800019780FFFE13\r
+:100C9000C02A0004C418002FCF41217CCF01217D40\r
+:100CA000CD81217ACD01217E042400080A6400014F\r
+:100CB0009A40FFFFCC29217FC42100031638001F72\r
+:100CC00004240008CC80004D9B80FFF9D800005E12\r
+:100CD000900000007C410001C424001A9A40FFFFEC\r
+:100CE000800000007C410001C424001B9A40FFFFEB\r
+:100CF000800000007C40C0018C0003427C408001E9\r
+:100D0000CC80004D88000000D840005DC43C002C21\r
+:100D100027FC000297C0FFFED941A2A4C43F002ACD\r
+:100D2000CFC00054C03E0004CC01A1F4CC3D20044F\r
+:100D3000C43D0003CC000047D840005E9000000096\r
+:100D4000C41000317C40C00195000005D9C1A2A4A7\r
+:100D5000D8400016C41000169900FFFFCC80004D4B\r
+:100D60008C00035C7C408001CC80004D880000003A\r
+:100D7000043C0022CFC1A2A4CC0000489000000097\r
+:100D80007C40C0018C0003657C408001CC80004D1C\r
+:100D900088000000D840005DC43C002C27FC000205\r
+:100DA00097C0FFFE043C0023CFC1A2A4C43F002B88\r
+:100DB000CFC00055C03E0004CC01A1F3CC3D2004BF\r
+:100DC000C43D0003CC000049D840005E9000000004\r
+:100DD000C01200017C51400AD45500008000000080\r
+:100DE000CC40005BC4380023C43C0024C035E00084\r
+:100DF000C03200047FB780097FF7C0092BB810000C\r
+:100E00002BFC1000CF812154CFC12155CC3121546E\r
+:100E1000C42D0003C41C001B99C0FFFFC424001A8A\r
+:100E20009A40FFFF800000007C40C0017C4100012F\r
+:100E30001928003096800006C424001D9A40FFFF48\r
+:100E4000C424001E9A40FFFFCC0003F7511000207D\r
+:100E50007CD0C01A551C003F7C4140017C41800180\r
+:100E6000D0C0010795C00003C01C8000CDC1201078\r
+:100E70009580FC648C000546DD830000055C200045\r
+:100E8000CC00004DD45D00008000054E7C40C001C8\r
+:100E9000505000207CD0C01A7C4140017C41800130\r
+:100EA000D0C001089580FC578C000546DD8300000A\r
+:100EB000055CA000D45D00008000054E7C40C001B0\r
+:100EC000505000207CD0C01A7C4140017C41800100\r
+:100ED000D0C001099580FC4B8C000546DD830000E5\r
+:100EE000055CE940D45D00008000054E7C40C001F7\r
+:100EF000505000207CD0C01A7C4140017C418001D0\r
+:100F0000D0C0010A9580FC3F8C000546DD830000BF\r
+:100F1000055CE880D45D00008000054E7C40C00187\r
+:100F2000505000207CD0C01A7C4140017C4180019F\r
+:100F3000D0C0010B9580FC338C000546DD8300009A\r
+:100F4000055CC000D45D00008000054E7C40C001FF\r
+:100F5000505000207CD0C01A7C4140017C4180016F\r
+:100F6000D0C0010C9580FC278C000546DD83000075\r
+:100F7000055CF000D45D00008000054E7C40C0019F\r
+:100F8000505000207CD0C01A7C4140017C4180013F\r
+:100F9000D0C0010D9580FC1B8C000546DD83000050\r
+:100FA000055CF3FCD45D00008000054ED4432000B6\r
+:100FB0007C408001CC80004D88000000D443A0001C\r
+:100FC0007C408001CC80004D88000000D443E94083\r
+:100FD0007C408001CC80004D88000000D443E88034\r
+:100FE0007C408001CC80004D88000000D443C000CC\r
+:100FF0007C408001CC80004D88000000D443F0008C\r
+:101000007C408001CC80004D88000000D443F3FC7C\r
+:101010007C408001CC80004D88000000CC43A000C3\r
+:101020007C40C0018C000546CC43A0008C00054AE2\r
+:101030007C408001CC80004D88000000CC43C00083\r
+:101040007C40C0018C000546CC43C0008C00054AA2\r
+:101050007C408001CC80004D880000007C40C001B5\r
+:101060007C4100017C41400194C000027C41800130\r
+:10107000CC03F3FCCC43F3FCCC43F3FC7C40800179\r
+:10108000CC80004D88000000C01E0010C40C001F62\r
+:1010900050D00008105400027D1580118000042EED\r
+:1010A000C01E0020C40C002050D0000808540400CA\r
+:1010B000115400027D518011CDC00058D45A000057\r
+:1010C0007C408001CC80004D880000007C40C00145\r
+:1010D00024D00003112800019500000A06A8043856\r
+:1010E0007C418001868000007C41C0018000044674\r
+:1010F0007C41C0018000044C7C41C001800004514F\r
+:101100007C4180017C41C00114D400100554A00032\r
+:10111000CD95000080000000C02200040598A000CA\r
+:101120007DA1800ACC190000C4190003800004428C\r
+:10113000C0220004CD8125C2CC2125C3C4190003DF\r
+:1011400080000442CD81216DCDC1216EC41A000200\r
+:10115000800004427C40C001C41303E0C41703E3D1\r
+:10116000C41B03E1C41F03E2CD812169CDC1216A03\r
+:10117000CCC1216BCC01216C042000047DA1800135\r
+:101180007D96400CCD8003E19640FB9E2528000310\r
+:10119000C02DF000111800087DAD80097DA9800ADE\r
+:1011A000CD8003E180000000248CFFFFD44D0000BF\r
+:1011B0007C408001CC80004D880000007C40C00154\r
+:1011C00018D4003018D001E818FC003424CC000FEB\r
+:1011D00004E804787C4180017C41C00194C0002176\r
+:1011E0008680000080000481800005428000048C1D\r
+:1011F000800005428000047E51DC00207D9E001AA4\r
+:10120000800004A9CD81216DCDC1216E0598000417\r
+:10121000C422000295400024CD81216DCDC1216EF4\r
+:10122000C4260002526400207E26001A800004A911\r
+:1012300015980002C0320004CD8125C2CC3125C3EF\r
+:10124000C421000395400018CC80004DCC3125C34B\r
+:10125000C4250003526400207E26001A800004A9E1\r
+:1012600039AC07063DB00700C43400179AC000032C\r
+:1012700097000002CC000041C03A00047DB9800A0A\r
+:10128000CC19000005980001C42100039540000519\r
+:10129000CC190000C4250003526400207E26001AE9\r
+:1012A000CF400017CC80004D052804AE7C41800162\r
+:1012B0007C41C0019500000786800000800004D3B7\r
+:1012C00080000542800004DE80000542800004C7E3\r
+:1012D00039AC07063DB00700C43400179AC00003BC\r
+:1012E00097000002CC000041CE1900009540000498\r
+:1012F0000598000156240020CE59000097C0000434\r
+:10130000C03A0004CC392140C4390003CFC00017D3\r
+:101310007C408001CC80004D88000000519C002062\r
+:101320007D9D801AD8000058CE1A00009540000418\r
+:101330000598000456240020CE5A00009BC0005D92\r
+:101340007C408001CC80004D880000009540000268\r
+:1013500021DC003256240020CD812169CDC1216AD3\r
+:10136000CE01216BCE41216C9BC0FD677C4080018A\r
+:10137000CC80004D8800000015980002C02A0001B2\r
+:10138000CD8125C7CE2925C89540000456240020CC\r
+:10139000CC80004DCE6925C897C0FB1AC03A000426\r
+:1013A000CC3925CBC43900037C408001CC80004D72\r
+:1013B00088000000C41400193D5800049980FFFE05\r
+:1013C000CC000051CC412180284C8000CCC121812F\r
+:1013D00014D0001FCC412182CC412183CC412184F7\r
+:1013E0009500FB08C41400199940FFFF800000001D\r
+:1013F000C0160004C4100031CC552140C4190003AC\r
+:10140000CC1003F780000000D800005DC40C002C55\r
+:1014100024CC000194C0FFFE7C40C001CCC1217CE3\r
+:10142000CC41217DC418002F7C4100017C4140014A\r
+:10143000CD81217ACD01217EC02A00042554FFFFF1\r
+:1014400039700003415C00029B000002041C004054\r
+:1014500009DC000199C0FFFFCC29217FC4250003CE\r
+:10146000166C001F415C0002CC80004D9AC0FFF951\r
+:1014700014FC001FD800005E9BC0FAE2C4100031CB\r
+:10148000CC1003F7800000007C40C0017C410001CB\r
+:101490001518001F51140020191C003199800008F4\r
+:1014A000CD0000587D4D401AD456000095C0FAD5A5\r
+:1014B000C420001C9A00FFFF80000000DC3A0000FE\r
+:1014C000C0260004CCC121697D25000ACD01216A16\r
+:1014D0000BB80002CC41216BCC41216C9B80FFFDFD\r
+:1014E000CC00007F99C0FD0880000000244C00FF64\r
+:1014F000CC4C030080000000C4200031C44F030026\r
+:10150000CCE1214580000000C00E0100CC0000416C\r
+:10151000CCC1304A80000545D8400034C43C00347A\r
+:1015200097C0FFFF90000000D8000034C43C003496\r
+:101530009BC0FFFF90000000D8000034C43C003482\r
+:101540009BC0FFFF7C408001CC80004D88000000E4\r
+:10155000000000000000000000000000000000008B\r
+:10156000000000000000000000000000000000007B\r
+:10157000000000000000000000000000000000006B\r
+:10158000000000000000000000000000000000005B\r
+:10159000000000000000000000000000000000004B\r
+:1015A000000000000000000000000000000000003B\r
+:1015B000000000000000000000000000000000002B\r
+:1015C000000000000000000000000000000000001B\r
+:1015D000000000000000000000000000000000000B\r
+:1015E00000000000000000000000000000000000FB\r
+:1015F00000000000000000000000000000000000EB\r
+:1016000000000000000000000000000000000000DA\r
+:1016100000000000000000000000000000000000CA\r
+:1016200000000000000000000000000000000000BA\r
+:1016300000000000000000000000000000000000AA\r
+:10164000000000000000000000000000000000009A\r
+:10165000000000000000000000000000000000008A\r
+:10166000000000000000000000000000000000007A\r
+:10167000000000000000000000000000000000006A\r
+:10168000000000000000000000000000000000005A\r
+:10169000000000000000000000000000000000004A\r
+:1016A000000000000000000000000000000000003A\r
+:1016B000000000000000000000000000000000002A\r
+:1016C000000000000000000000000000000000001A\r
+:1016D000000000000000000000000000000000000A\r
+:1016E00000000000000000000000000000000000FA\r
+:1016F00000000000000000000000000000000000EA\r
+:1017000000000000000000000000000000000000D9\r
+:1017100000000000000000000000000000000000C9\r
+:1017200000000000000000000000000000000000B9\r
+:1017300000000000000000000000000000000000A9\r
+:101740000000000000000000000000000000000099\r
+:101750000000000000000000000000000000000089\r
+:101760000000000000000000000000000000000079\r
+:101770000000000000000000000000000000000069\r
+:101780000000000000000000000000000000000059\r
+:101790000000000000000000000000000000000049\r
+:1017A0000000000000000000000000000000000039\r
+:1017B0000000000000000000000000000000000029\r
+:1017C0000000000000000000000000000000000019\r
+:1017D0000000000000000000000000000000000009\r
+:1017E00000000000000000000000000000000000F9\r
+:1017F00000000000000000000000000000000000E9\r
+:1018000000000000000000000000000000000000D8\r
+:1018100000000000000000000000000000000000C8\r
+:1018200000000000000000000000000000000000B8\r
+:1018300000000000000000000000000000000000A8\r
+:101840000000000000000000000000000000000098\r
+:101850000000000000000000000000000000000088\r
+:101860000000000000000000000000000000000078\r
+:101870000000000000000000000000000000000068\r
+:101880000000000000000000000000000000000058\r
+:101890000000000000000000000000000000000048\r
+:1018A0000000000000000000000000000000000038\r
+:1018B0000000000000000000000000000000000028\r
+:1018C0000000000000000000000000000000000018\r
+:1018D0000000000000000000000000000000000008\r
+:1018E00000000000000000000000000000000000F8\r
+:1018F00000000000000000000000000000000000E8\r
+:1019000000000000000000000000000000000000D7\r
+:1019100000000000000000000000000000000000C7\r
+:1019200000000000000000000000000000000000B7\r
+:1019300000000000000000000000000000000000A7\r
+:101940000000000000000000000000000000000097\r
+:101950000000000000000000000000000000000087\r
+:101960000000000000000000000000000000000077\r
+:101970000000000000000000000000000000000067\r
+:101980000000000000000000000000000000000057\r
+:101990000000000000000000000000000000000047\r
+:1019A0000000000000000000000000000000000037\r
+:1019B0000000000000000000000000000000000027\r
+:1019C0000000000000000000000000000000000017\r
+:1019D0000000000000000000000000000000000007\r
+:1019E00000000000000000000000000000000000F7\r
+:1019F00000000000000000000000000000000000E7\r
+:101A000000000000000000000000000000000000D6\r
+:101A100000000000000000000000000000000000C6\r
+:101A200000000000000000000000000000000000B6\r
+:101A300000000000000000000000000000000000A6\r
+:101A40000000000000000000000000000000000096\r
+:101A50000000000000000000000000000000000086\r
+:101A60000000000000000000000000000000000076\r
+:101A70000000000000000000000000000000000066\r
+:101A80000000000000000000000000000000000056\r
+:101A90000000000000000000000000000000000046\r
+:101AA0000000000000000000000000000000000036\r
+:101AB0000000000000000000000000000000000026\r
+:101AC0000000000000000000000000000000000016\r
+:101AD0000000000000000000000000000000000006\r
+:101AE00000000000000000000000000000000000F6\r
+:101AF00000000000000000000000000000000000E6\r
+:101B000000000000000000000000000000000000D5\r
+:101B100000000000000000000000000000000000C5\r
+:101B200000000000000000000000000000000000B5\r
+:101B300000000000000000000000000000000000A5\r
+:101B40000000000000000000000000000000000095\r
+:101B50000000000000000000000000000000000085\r
+:101B60000000000000000000000000000000000075\r
+:101B70000000000000000000000000000000000065\r
+:101B80000000000000000000000000000000000055\r
+:101B90000000000000000000000000000000000045\r
+:101BA0000000000000000000000000000000000035\r
+:101BB0000000000000000000000000000000000025\r
+:101BC0000000000000000000000000000000000015\r
+:101BD0000000000000000000000000000000000005\r
+:101BE00000000000000000000000000000000000F5\r
+:101BF00000000000000000000000000000000000E5\r
+:101C000000000000000000000000000000000000D4\r
+:101C100000000000000000000000000000000000C4\r
+:101C200000000000000000000000000000000000B4\r
+:101C300000000000000000000000000000000000A4\r
+:101C40000000000000000000000000000000000094\r
+:101C50000000000000000000000000000000000084\r
+:101C60000000000000000000000000000000000074\r
+:101C70000000000000000000000000000000000064\r
+:101C80000000000000000000000000000000000054\r
+:101C90000000000000000000000000000000000044\r
+:101CA0000000000000000000000000000000000034\r
+:101CB0000000000000000000000000000000000024\r
+:101CC0000000000000000000000000000000000014\r
+:101CD0000000000000000000000000000000000004\r
+:101CE00000000000000000000000000000000000F4\r
+:101CF00000000000000000000000000000000000E4\r
+:101D000000000000000000000000000000000000D3\r
+:101D100000000000000000000000000000000000C3\r
+:101D200000000000000000000000000000000000B3\r
+:101D300000000000000000000000000000000000A3\r
+:101D40000000000000000000000000000000000093\r
+:101D50000000000000000000000000000000000083\r
+:101D60000000000000000000000000000000000073\r
+:101D70000000000000000000000000000000000063\r
+:101D80000000000000000000000000000000000053\r
+:101D90000000000000000000000000000000000043\r
+:101DA0000000000000000000000000000000000033\r
+:101DB0000000000000000000000000000000000023\r
+:101DC0000000000000000000000000000000000013\r
+:101DD0000000000000000000000000000000000003\r
+:101DE00000000000000000000000000000000000F3\r
+:101DF00000000000000000000000000000000000E3\r
+:101E000000000000000000000000000000000000D2\r
+:101E100000000000000000000000000000000000C2\r
+:101E200000000000000000000000000000000000B2\r
+:101E300000000000000000000000000000000000A2\r
+:101E40000000000000000000000000000000000092\r
+:101E50000000000000000000000000000000000082\r
+:101E60000000000000000000000000000000000072\r
+:101E70000000000000000000000000000000000062\r
+:101E80000000000000000000000000000000000052\r
+:101E90000000000000000000000000000000000042\r
+:101EA0000000000000000000000000000000000032\r
+:101EB0000000000000000000000000000000000022\r
+:101EC0000000000000000000000000000000000012\r
+:101ED0000000000000000000000000000000000002\r
+:101EE00000000000000000000000000000000000F2\r
+:101EF00000000000000000000000000000000000E2\r
+:101F000000000000000000000000000000000000D1\r
+:101F100000000000000000000000000000000000C1\r
+:101F200000000000000000000000000000000000B1\r
+:101F300000000000000000000000000000000000A1\r
+:101F40000000000000000000000000000000000091\r
+:101F50000000000000000000000000000000000081\r
+:101F60000000000000000000000000000000000071\r
+:101F70000000000000000000000000000000000061\r
+:101F80000000000000000000000000000000000051\r
+:101F90000000000000000000000000000000000041\r
+:101FA0000000000000000000000000000000000031\r
+:101FB0000000000000000000000000000000000021\r
+:101FC0000000000000000000000000000000000011\r
+:101FD0000000000000000000000000000000000001\r
+:101FE00000000000000000000000000000000000F1\r
+:101FF00000000000000000000000000000000000E1\r
+:102000000001046A00100003001200050014002FF4\r
+:10201000001500350016003E001700490021004E53\r
+:102020000024006B002500730027007D0028006855\r
+:102030000029007E002A007B002B007E002D0085F9\r
+:10204000002E008C002F0095003000970032011404\r
+:10205000003400AC0035007E0037013500390185C1\r
+:10206000003A01A1003B01B4003C01CC003D022C30\r
+:10207000003E0126003F01120040046F004104EDC4\r
+:10208000004204FC004305020044024A004501CC22\r
+:10209000004602610047026100480261004A02AC4A\r
+:1020A000004C02B7004D02E9004E0335004F0339E2\r
+:1020B000005103600052033D005303500057037466\r
+:1020C0000060038A006103A300620378006303AF2A\r
+:1020D000006403BB006503C7006603D3006703DF2A\r
+:1020E000006803EB006903EF006A0422006B03F34E\r
+:1020F000006C03F7006D03FB006E03FF006F040329\r
+:10210000007003FB007104280072041700730407B9\r
+:102110000074040F00750433007A0522007C045516\r
+:10212000007D053B007E053E000F0542000F054285\r
+:10213000000F0542000F0542000F0542000F054247\r
+:10214000000F0542000F0542000F0542000F054237\r
+:10215000000F0542000F0542000F0542000F054227\r
+:10216000000F0542000F0542000F0542000F054217\r
+:10217000000F0542000F0542000F0542000F054207\r
+:10218000000F0542000F0542000F0542000F0542F7\r
+:10219000000F0542000F0542000F0542000F0542E7\r
+:1021A000000F0542000F0542000F0542000F0542D7\r
+:1021B000000F0542000F0542000F0542000F0542C7\r
+:1021C000000F0542000F0542000F0542000F0542B7\r
+:1021D000000F0542000F0542000F0542000F0542A7\r
+:1021E000000F0542000F0542000F0542000F054297\r
+:1021F000000F0542000F0542000F0542000F054287\r
+:00000001FF\r
diff --git a/firmware/radeon/CAYMAN_pfp.bin.ihex b/firmware/radeon/CAYMAN_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..e02965b
--- /dev/null
@@ -0,0 +1,545 @@
+:100000007C40800188000000CC800040D44000404B\r
+:100010007C40800188000000104C00012490000208\r
+:100020007C414001505800207D95C01A98C00003C3\r
+:10003000D1C000188000000099000003D1C0001951\r
+:1000400080000000D1C0001A80000000248C000253\r
+:10005000CC800040CC40004098C00003CC0000524F\r
+:10006000800003BECC000054CC000070800003BEB2\r
+:10007000CC40006580000000CC000057CC0000712F\r
+:10008000C424003E9A40FFE1C80C001A7CC5001150\r
+:10009000D1000043D8C00043CC800040CC000040D9\r
+:1000A000CC4000407C40800188000000C80C001952\r
+:1000B0007CC50011D1000042D90000427C40C00143\r
+:1000C000C41B0003C41F0003C4230003C427000390\r
+:1000D0009580FFCC95C0FFCBC4280010CC00005603\r
+:1000E0009A800004C4300005CF000040CC000040DE\r
+:1000F000C4280009202C007E22EC8E481AA8002774\r
+:10010000CEC00040CC000040CD800040CDC00040BB\r
+:10011000CE000040CE40004096800002D880005BB8\r
+:10012000CC800040CC000040CCC000407C4080012E\r
+:1001300088000000C80C00197CC50011D1000042E5\r
+:10014000D94000427C40C001C41B0003C41F00030F\r
+:10015000C4230003C4270003C42B00039580FFA918\r
+:1001600095C0FFA8CC000063D1000064C43000102B\r
+:10017000CC0000569B000004C4340005CF40004072\r
+:10018000CC000040C42C00092030007E2330AE4853\r
+:100190001AEC0027CF000040D8400040CD8000403E\r
+:1001A000CDC00040CE000040CE400040CE80004098\r
+:1001B00096C00002D880005BCC800040CC0000409C\r
+:1001C000CCC000407C40800188000000C4180008BA\r
+:1001D000259800017C4240017C42800195800345C6\r
+:1001E00052AC00207EE6C01A7C40C0017C41000178\r
+:1001F0001AB801E897800004D84003F7C43803F721\r
+:100200009B80FFFFC41C001399C0FFFF1C880010D7\r
+:100210002088007010D400027ED54011D1400043E8\r
+:10022000CD000043CC800040CE400040CE80004056\r
+:10023000CCC00040DC3A0000CD0000409780FF7148\r
+:100240007C40C0017C41000180000085248C0002BC\r
+:1002500098C0000AC410000F99000005C41C0004D7\r
+:10026000CC000052CDC00040CC000040C4180008B3\r
+:100270002598000280000075C41000119900FFFC51\r
+:10028000C41C0006CC000054CDC00040CC0000408F\r
+:100290008000009B248C0002C414001298C0000F40\r
+:1002A000C410001099000005C41C0005CC000053C8\r
+:1002B000CDC00040CC000040C4180008189401E8EC\r
+:1002C00094C0000205540006281000017D150004AA\r
+:1002D0007D918009800000759940FFF8C41C0005DD\r
+:1002E000CDC00040CC000040CC000055800000AEE6\r
+:1002F000CC00005FCC000060C424003E9A40FF4365\r
+:10030000C41C0006800000C3C41C0004CDC0004013\r
+:10031000CC000040CC800040D44000407C408001B4\r
+:1003200088000000C41C0005800000CEC41C00062C\r
+:10033000800000CEC41C0004CDC00040CC000040B2\r
+:10034000C80C0018CC800040CC4000401050000287\r
+:100350007D0D001155140020D1000043D84000430A\r
+:10036000CC0000407C40800188000000C41C0005D7\r
+:10037000CDC00040CC000040CC800040D4400040C4\r
+:100380007C40800188000000248C0002C41400120C\r
+:1003900098C00011C410001099000005C41C00058D\r
+:1003A000CC000053CDC00040CC000040C40C001B6A\r
+:1003B000CC800040CC400040CC400040CC400040CD\r
+:1003C0007CC4C001CCC00040D44000407C408001CF\r
+:1003D000880000009940FFF6C41C0005CC000055C1\r
+:1003E000CDC00040CC000040800000EB7C40C0014C\r
+:1003F000C41000259900000FC41400222018007EAC\r
+:10040000219809C899400003CD800040CC000040ED\r
+:10041000CC800040CCC00040D44000407C408001F3\r
+:10042000880000007C40C001C41000259500FFF347\r
+:10043000C41400232018007E219809E89940000385\r
+:10044000CD800040CC0000401CA8E00822A80E2867\r
+:10045000CE800040CCC00040D44000407C408001B1\r
+:10046000880000007C40C001C41000259900FFF7FF\r
+:10047000CC800040CCC00040D44000407C40800193\r
+:1004800088000000C41000242028007E22A82988AB\r
+:10049000CE800040CD000040CD0000408C000139EE\r
+:1004A000C40C0021C414002694C0000B04100003E7\r
+:1004B0008000012EC41000242028007E22A829A834\r
+:1004C000CE800040CD000040CD0000408C000139BE\r
+:1004D000C4140026CC000061C424003E9640028B68\r
+:1004E00085400000C42C000926EC00019AC00002DF\r
+:1004F00090000000C02D0001CEC0005B2034007EC3\r
+:1005000023742D08C02C0156CF400040CEC00040BF\r
+:10051000CC00004090000000248C0002C4100011A8\r
+:1005200094C000079900FEB9C41C0006CC0000541A\r
+:10053000CDC00040CC00004080000002C414000F79\r
+:10054000C41C00049940FEB1CC000052CDC0004054\r
+:10055000CC000040C424003E9A40FEAC7C40C00168\r
+:10056000505000207D0D401AD1400017CC00006291\r
+:1005700080000000C037FFFF20880070800001610C\r
+:100580007C434001C81C0017C4180016CF43A29E2C\r
+:100590007C4140017D58C0047CDCC01154D0002057\r
+:1005A000CC800040800001737C418001CC80004001\r
+:1005B000CD80004080000170C019FFFFCC8000405A\r
+:1005C000CD83A29E7C40C0017C4100017C41400162\r
+:1005D000CCC3A1FACD03A1F9CD43A29DCCC000406C\r
+:1005E000CD000040CD400040CC4000407C40800128\r
+:1005F000880000007C40C00124D00001CCC3A29F31\r
+:10060000D840001695000002D8800016CC8000402B\r
+:10061000CCC00040800000007C40C001CC80004085\r
+:10062000CCC3A2A2CCC00040800000007C40C0012E\r
+:1006300014D4001FCC8000407C4100019540000292\r
+:10064000CCC000581518001FCCC00040CD000040A1\r
+:1006500095800002CD000059CC00007F800003BED1\r
+:100660002008007E208807E8C42000141CA8001081\r
+:10067000CEA000447C410001505400207C41800108\r
+:1006800006240001CE400014159C00187D15001AA8\r
+:10069000CDE00049CDA0004BD1200041CDA00041CC\r
+:1006A00055140008CD40001B9A000004C424002B00\r
+:1006B0009A40000221DC0030CDC00040800003BE23\r
+:1006C000C4200014C60C000A1CA8001094C000032B\r
+:1006D000CEA000468000019DCC000048800001B7FC\r
+:1006E000C42000147C4180010A200001C614000DC2\r
+:1006F000C618000A7D59800ACE00001495800004B7\r
+:10070000CCA00046CD600046800003BECCA00044D3\r
+:10071000CD600044800003BECC400061800003BE79\r
+:10072000C40C03F6D84003F698C00009C418002092\r
+:10073000C41C0021C4100010C414000F11100001CB\r
+:100740007D15000A9980FF5199C0FF5CD80003F61F\r
+:100750007C40C001800000007C40C0017C41000161\r
+:100760007C4380017C43C0015110002053FC0020D9\r
+:100770007FBF801A7CD0C01A041C0020D3800042A6\r
+:10078000D8800042D0C00042CDC00042041C000806\r
+:10079000042000017C024001C4170003C41B0003B5\r
+:1007A000519800207D59401AC42B0003C42F000328\r
+:1007B000C4330003C437000309DC000152EC0020FD\r
+:1007C0007EAE801A537400207F37001A7F2B4012B0\r
+:1007D0007E76401156A8003F5730003F7EB2800918\r
+:1007E0007E2A000999C0FFF19680FFE453F40020AF\r
+:1007F0007F7B401A7D65401155580020CC00005A7F\r
+:10080000CD760000CDB60000C420001F9A00FFFF87\r
+:1008100080000000C420002C7C40C0017C4100010D\r
+:10082000CCE003FDCD2003FA511400207CD4C01A83\r
+:10083000D0C000421514001F191800F099400002A2\r
+:10084000043400002F5C00017D7600097D5E4009C4\r
+:1008500099800004CC000042CC00004D800003BE13\r
+:1008600015980001152C000826EC00019980003332\r
+:100870001530000C96000003CC000042800003BE3F\r
+:1008800004140020CD400042273000012828000138\r
+:1008900004380020043C0008C4170003C41B0003F4\r
+:1008A000C41F0003C42300037D5D400D7DA1C00D66\r
+:1008B0007D5D400A1610001F159C001F7D1D00095C\r
+:1008C0007D1740097E9280090BB800040BFC0001E3\r
+:1008D0009B4000129BC0FFF1C420002CC60F03FDFB\r
+:1008E000C61303FA9A800009CC00004D9B000183D7\r
+:1008F000511400207CD4C01A04140020D0C000423F\r
+:10090000CD40004280000223CC00004D96C0017B08\r
+:10091000CC00004E800003BECC00004D9AC0000207\r
+:10092000CC00004E9780FDB70BB80001C43F000318\r
+:100930009B80FFFD80000000CC00004E964000032D\r
+:10094000CC000042800003BEDA000042C40B00036A\r
+:10095000C40F0003C4130003C4170003C41B000327\r
+:10096000C41F0003C4270003C42B000315FC001F91\r
+:1009700016B0001F7FF3C00914F0001F7FF3C009F9\r
+:100980001570001F7FF3C0097D8880027DCCC002F6\r
+:1009900097C0000C7E5100027E9540027C90800C36\r
+:1009A0007CD4C00C7C8F40099AC000022CB400019A\r
+:1009B000CC00004D9B400151CC00004E800003BE96\r
+:1009C000C420002CC60F03FDC61303FA51140020E7\r
+:1009D0007CD4C01AD0C00042800002527C40C001CA\r
+:1009E00014D0001E99000005CC800040CCC000400F\r
+:1009F000D44000408000000018D4003018D001E836\r
+:100A000018FC003424CC000F04E802867C418001ED\r
+:100A10007C41C00194C000148680000080000290D8\r
+:100A2000800003C2800003C2800003C28000028DE8\r
+:100A3000800003C251DC00207D9E001A8000029FCE\r
+:100A400051DC00207D9D801AC5A200009540000C5D\r
+:100A500045980004C5A60000526400207E26001AB6\r
+:100A60008000029FC5A10000954000050598000187\r
+:100A7000C5A50000526400207E26001A052802A3A6\r
+:100A80007C4180017C41C001950000078680000008\r
+:100A9000800003C2800003C2800003C2800003C242\r
+:100AA000800002B3D800005ACE190000954000041F\r
+:100AB0000598000156200020CE19000097C0FD5176\r
+:100AC000C43921407C40800188000000519C0020F6\r
+:100AD0007D9D801AD800005ACE1A0000954000046F\r
+:100AE0000598000456200020CE1A00009BC0009EEE\r
+:100AF0007C408001880000007C40C0017C410001F6\r
+:100B00001914003BCC00005A95400010C414001E7C\r
+:100B10003D5800029980FFFECC00005D291C80003A\r
+:100B2000CCC12185CDC121861514001FCC41218760\r
+:100B3000CC412188CC4121899540FD32C414001E4E\r
+:100B40009940FFFF80000000CC800040CCC00040F6\r
+:100B5000CD000040D440004080000000C428002C9C\r
+:100B6000D86803F7CC800040CC400040C68F03F724\r
+:100B700098C0FFFF7C40800188000000C428002C42\r
+:100B8000C42C0011C430002F7EF2C00A9A800007E6\r
+:100B9000C430000F9B000005C4340004CC00005298\r
+:100BA000CF400040CC0000409AC00005C43400068D\r
+:100BB000CC000054CF400040CC0000407C40C0013D\r
+:100BC000D86803F7CC800040CCC00040D44000403F\r
+:100BD00014D0001F990000C9800002DBCC800040C7\r
+:100BE000CC400040CC400040CC4000407C40C001A4\r
+:100BF000CCC00015CCC00040D4400040D80003F663\r
+:100C0000800000007C40C00114DC001D18D8003CAE\r
+:100C1000CC80004099C00005CCC000409980FCF910\r
+:100C2000CC000061800003BECD80005ECC0000617E\r
+:100C3000CCC00040800003BE7C40C001505000206A\r
+:100C40008C00031D7CD0C01AC4200014C4D6000040\r
+:100C50007C43800199400006DF830000CFA0004F55\r
+:100C60008C000321D440007F800000008C00032111\r
+:100C700080000000D800001DC414001D9940FFFF33\r
+:100C800090000000D840001DC414001D9540FFFFD7\r
+:100C9000900000008C00031DC42000147C40C001A3\r
+:100CA000C036FF00C4100015C0303FFF7CF540097E\r
+:100CB0007D5180097D81801D7CF38009998000062B\r
+:100CC000DF830000CFA0004F8C000321D440007FC1\r
+:100CD000800000008C000321800000007C40C001E7\r
+:100CE00014D0001E99000005CC800040CCC000400C\r
+:100CF000D44000408000000018D001E818D4003033\r
+:100D000018D80034052803457C4200017C4240018C\r
+:100D10009500000786800000800003C2800003C2A7\r
+:100D2000800003C2800003C28000035311540010EE\r
+:100D30007E16000ACD40005AD46100009580FCB1B7\r
+:100D4000C43921407C40800188000000115400100B\r
+:100D5000522400207E26001ACD40005AD4620000A2\r
+:100D60009580FCA8C420001F9A00FFFF7C408001F2\r
+:100D7000880000007C40C00114DC000895C0001908\r
+:100D800024DC00107C4100015054002099C0000375\r
+:100D9000C51D0000800003687D15001AC51E0000F7\r
+:100DA0007C4200017C4240017C4180017DE5C0091C\r
+:100DB0007DE2800F41AC00029A80FC9206EC0003B9\r
+:100DC0000AEC00019AC0FFFF24DC001099C0000368\r
+:100DD000C51D00008000036BC51E00008000036B72\r
+:100DE000CC800040CCC00040D440004080000000D7\r
+:100DF000C41C0004CDC00040CC000040CC800040AA\r
+:100E0000D44000407C40800188000000C41C0005E4\r
+:100E1000CDC00040CC000040CC800040D440004019\r
+:100E20007C408001880000007C40C00124D0000686\r
+:100E300031100006C414000F99000008CC000052C5\r
+:100E4000C424003E9640003199400004C41C0004B4\r
+:100E5000CDC00040CC000040CC800040CCC0004061\r
+:100E6000D4400040800000007C40C0017C41000173\r
+:100E70001518001FCD00005A51140020998000035E\r
+:100E8000D44D0000800000007D4D401A191C003137\r
+:100E9000D4560000C420001F95C0FC5AC420001F77\r
+:100EA0009A00FFFF800000007C40C00114D0001FAA\r
+:100EB00024D400FF95000003CC5403008000000000\r
+:100EC000CC800040CCC00040CC40004080000000FE\r
+:100ED000C420002C7C40C001C4D30300CC8000405F\r
+:100EE000CCC00040CC00005ACD2121418000000040\r
+:100EF000D440007F80000000C424003E96400003E0\r
+:100F00007C40800188000000800003C200000000D7\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:1010000000000000000000000000000000000000E0\r
+:1010100000000000000000000000000000000000D0\r
+:1010200000000000000000000000000000000000C0\r
+:1010300000000000000000000000000000000000B0\r
+:1010400000000000000000000000000000000000A0\r
+:101050000000000000000000000000000000000090\r
+:101060000000000000000000000000000000000080\r
+:101070000000000000000000000000000000000070\r
+:101080000000000000000000000000000000000060\r
+:101090000000000000000000000000000000000050\r
+:1010A0000000000000000000000000000000000040\r
+:1010B0000000000000000000000000000000000030\r
+:1010C0000000000000000000000000000000000020\r
+:1010D0000000000000000000000000000000000010\r
+:1010E0000000000000000000000000000000000000\r
+:1010F00000000000000000000000000000000000F0\r
+:1011000000000000000000000000000000000000DF\r
+:1011100000000000000000000000000000000000CF\r
+:1011200000000000000000000000000000000000BF\r
+:1011300000000000000000000000000000000000AF\r
+:10114000000000000000000000000000000000009F\r
+:10115000000000000000000000000000000000008F\r
+:10116000000000000000000000000000000000007F\r
+:10117000000000000000000000000000000000006F\r
+:10118000000000000000000000000000000000005F\r
+:10119000000000000000000000000000000000004F\r
+:1011A000000000000000000000000000000000003F\r
+:1011B000000000000000000000000000000000002F\r
+:1011C000000000000000000000000000000000001F\r
+:1011D000000000000000000000000000000000000F\r
+:1011E00000000000000000000000000000000000FF\r
+:1011F00000000000000000000000000000000000EF\r
+:1012000000000000000000000000000000000000DE\r
+:1012100000000000000000000000000000000000CE\r
+:1012200000000000000000000000000000000000BE\r
+:1012300000000000000000000000000000000000AE\r
+:10124000000000000000000000000000000000009E\r
+:10125000000000000000000000000000000000008E\r
+:10126000000000000000000000000000000000007E\r
+:10127000000000000000000000000000000000006E\r
+:10128000000000000000000000000000000000005E\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:1014000000000000000000000000000000000000DC\r
+:1014100000000000000000000000000000000000CC\r
+:1014200000000000000000000000000000000000BC\r
+:1014300000000000000000000000000000000000AC\r
+:10144000000000000000000000000000000000009C\r
+:10145000000000000000000000000000000000008C\r
+:10146000000000000000000000000000000000007C\r
+:10147000000000000000000000000000000000006C\r
+:10148000000000000000000000000000000000005C\r
+:10149000000000000000000000000000000000004C\r
+:1014A000000000000000000000000000000000003C\r
+:1014B000000000000000000000000000000000002C\r
+:1014C000000000000000000000000000000000001C\r
+:1014D000000000000000000000000000000000000C\r
+:1014E00000000000000000000000000000000000FC\r
+:1014F00000000000000000000000000000000000EC\r
+:1015000000000000000000000000000000000000DB\r
+:1015100000000000000000000000000000000000CB\r
+:1015200000000000000000000000000000000000BB\r
+:1015300000000000000000000000000000000000AB\r
+:10154000000000000000000000000000000000009B\r
+:10155000000000000000000000000000000000008B\r
+:10156000000000000000000000000000000000007B\r
+:10157000000000000000000000000000000000006B\r
+:10158000000000000000000000000000000000005B\r
+:10159000000000000000000000000000000000004B\r
+:1015A000000000000000000000000000000000003B\r
+:1015B000000000000000000000000000000000002B\r
+:1015C000000000000000000000000000000000001B\r
+:1015D000000000000000000000000000000000000B\r
+:1015E00000000000000000000000000000000000FB\r
+:1015F00000000000000000000000000000000000EB\r
+:1016000000000000000000000000000000000000DA\r
+:1016100000000000000000000000000000000000CA\r
+:1016200000000000000000000000000000000000BA\r
+:1016300000000000000000000000000000000000AA\r
+:10164000000000000000000000000000000000009A\r
+:10165000000000000000000000000000000000008A\r
+:10166000000000000000000000000000000000007A\r
+:10167000000000000000000000000000000000006A\r
+:10168000000000000000000000000000000000005A\r
+:10169000000000000000000000000000000000004A\r
+:1016A000000000000000000000000000000000003A\r
+:1016B000000000000000000000000000000000002A\r
+:1016C000000000000000000000000000000000001A\r
+:1016D000000000000000000000000000000000000A\r
+:1016E00000000000000000000000000000000000FA\r
+:1016F00000000000000000000000000000000000EA\r
+:1017000000000000000000000000000000000000D9\r
+:1017100000000000000000000000000000000000C9\r
+:1017200000000000000000000000000000000000B9\r
+:1017300000000000000000000000000000000000A9\r
+:101740000000000000000000000000000000000099\r
+:101750000000000000000000000000000000000089\r
+:101760000000000000000000000000000000000079\r
+:101770000000000000000000000000000000000069\r
+:101780000000000000000000000000000000000059\r
+:101790000000000000000000000000000000000049\r
+:1017A0000000000000000000000000000000000039\r
+:1017B0000000000000000000000000000000000029\r
+:1017C0000000000000000000000000000000000019\r
+:1017D0000000000000000000000000000000000009\r
+:1017E00000000000000000000000000000000000F9\r
+:1017F00000000000000000000000000000000000E9\r
+:1018000000000000000000000000000000000000D8\r
+:1018100000000000000000000000000000000000C8\r
+:1018200000000000000000000000000000000000B8\r
+:1018300000000000000000000000000000000000A8\r
+:101840000000000000000000000000000000000098\r
+:101850000000000000000000000000000000000088\r
+:101860000000000000000000000000000000000078\r
+:101870000000000000000000000000000000000068\r
+:101880000000000000000000000000000000000058\r
+:101890000000000000000000000000000000000048\r
+:1018A0000000000000000000000000000000000038\r
+:1018B0000000000000000000000000000000000028\r
+:1018C0000000000000000000000000000000000018\r
+:1018D0000000000000000000000000000000000008\r
+:1018E00000000000000000000000000000000000F8\r
+:1018F00000000000000000000000000000000000E8\r
+:1019000000000000000000000000000000000000D7\r
+:1019100000000000000000000000000000000000C7\r
+:1019200000000000000000000000000000000000B7\r
+:1019300000000000000000000000000000000000A7\r
+:101940000000000000000000000000000000000097\r
+:101950000000000000000000000000000000000087\r
+:101960000000000000000000000000000000000077\r
+:101970000000000000000000000000000000000067\r
+:101980000000000000000000000000000000000057\r
+:101990000000000000000000000000000000000047\r
+:1019A0000000000000000000000000000000000037\r
+:1019B0000000000000000000000000000000000027\r
+:1019C0000000000000000000000000000000000017\r
+:1019D0000000000000000000000000000000000007\r
+:1019E00000000000000000000000000000000000F7\r
+:1019F00000000000000000000000000000000000E7\r
+:101A000000000000000000000000000000000000D6\r
+:101A100000000000000000000000000000000000C6\r
+:101A200000000000000000000000000000000000B6\r
+:101A300000000000000000000000000000000000A6\r
+:101A40000000000000000000000000000000000096\r
+:101A50000000000000000000000000000000000086\r
+:101A60000000000000000000000000000000000076\r
+:101A70000000000000000000000000000000000066\r
+:101A80000000000000000000000000000000000056\r
+:101A90000000000000000000000000000000000046\r
+:101AA0000000000000000000000000000000000036\r
+:101AB0000000000000000000000000000000000026\r
+:101AC0000000000000000000000000000000000016\r
+:101AD0000000000000000000000000000000000006\r
+:101AE00000000000000000000000000000000000F6\r
+:101AF00000000000000000000000000000000000E6\r
+:101B000000000000000000000000000000000000D5\r
+:101B100000000000000000000000000000000000C5\r
+:101B200000000000000000000000000000000000B5\r
+:101B300000000000000000000000000000000000A5\r
+:101B40000000000000000000000000000000000095\r
+:101B50000000000000000000000000000000000085\r
+:101B60000000000000000000000000000000000075\r
+:101B70000000000000000000000000000000000065\r
+:101B80000000000000000000000000000000000055\r
+:101B90000000000000000000000000000000000045\r
+:101BA0000000000000000000000000000000000035\r
+:101BB0000000000000000000000000000000000025\r
+:101BC0000000000000000000000000000000000015\r
+:101BD0000000000000000000000000000000000005\r
+:101BE00000000000000000000000000000000000F5\r
+:101BF00000000000000000000000000000000000E5\r
+:101C000000000000000000000000000000000000D4\r
+:101C100000000000000000000000000000000000C4\r
+:101C200000000000000000000000000000000000B4\r
+:101C300000000000000000000000000000000000A4\r
+:101C40000000000000000000000000000000000094\r
+:101C50000000000000000000000000000000000084\r
+:101C60000000000000000000000000000000000074\r
+:101C70000000000000000000000000000000000064\r
+:101C80000000000000000000000000000000000054\r
+:101C90000000000000000000000000000000000044\r
+:101CA0000000000000000000000000000000000034\r
+:101CB0000000000000000000000000000000000024\r
+:101CC0000000000000000000000000000000000014\r
+:101CD0000000000000000000000000000000000004\r
+:101CE00000000000000000000000000000000000F4\r
+:101CF00000000000000000000000000000000000E4\r
+:101D000000000000000000000000000000000000D3\r
+:101D100000000000000000000000000000000000C3\r
+:101D200000000000000000000000000000000000B3\r
+:101D300000000000000000000000000000000000A3\r
+:101D40000000000000000000000000000000000093\r
+:101D50000000000000000000000000000000000083\r
+:101D60000000000000000000000000000000000073\r
+:101D70000000000000000000000000000000000063\r
+:101D80000000000000000000000000000000000053\r
+:101D90000000000000000000000000000000000043\r
+:101DA0000000000000000000000000000000000033\r
+:101DB0000000000000000000000000000000000023\r
+:101DC0000000000000000000000000000000000013\r
+:101DD0000000000000000000000000000000000003\r
+:101DE00000000000000000000000000000000000F3\r
+:101DF00000000000000000000000000000000000E3\r
+:101E000000000000000000000000000000000000D2\r
+:101E100000000000000000000000000000000000C2\r
+:101E200000000000000000000000000000000000B2\r
+:101E300000000000000000000000000000000000A2\r
+:101E40000000000000000000000000000000000092\r
+:101E50000000000000000000000000000000000082\r
+:101E60000000000000000000000000000000000072\r
+:101E70000000000000000000000000000000000062\r
+:101E80000000000000000000000000000000000052\r
+:101E90000000000000000000000000000000000042\r
+:101EA0000000000000000000000000000000000032\r
+:101EB0000000000000000000000000000000000022\r
+:101EC0000000000000000000000000000000000012\r
+:101ED0000000000000000000000000000000000002\r
+:101EE00000000000000000000000000000000000F2\r
+:101EF00000000000000000000000000000000000E2\r
+:101F000000000000000000000000000000000000D1\r
+:101F100000000000000000000000000000000000C1\r
+:101F200000000000000000000000000000000000B1\r
+:101F300000000000000000000000000000000000A1\r
+:101F40000000000000000000000000000000000091\r
+:101F50000000000000000000000000000000000081\r
+:101F60000000000000000000000000000000000071\r
+:101F70000000000000000000000000000000000061\r
+:101F80000000000000000000000000000000000051\r
+:101F90000000000000000000000000000000000041\r
+:101FA0000000000000000000000000000000000031\r
+:101FB0000000000000000000000000000000000021\r
+:101FC0000000000000000000000000000000000011\r
+:101FD0000000000000000000000000000000000001\r
+:101FE00000000000000000000000000000000000F1\r
+:101FF00000000000000000000000000000000000E1\r
+:102000000003037C0004038300050198000600C25E\r
+:10201000000700CD000800DB000900C9000A00C06D\r
+:10202000000B00CB000C00FB000D0109000E01218C\r
+:10203000000F012D001003BC001100060012001358\r
+:102040000013001C0014001E001600220024002BA8\r
+:102050000025004D00260157001701B8001801C6E1\r
+:10206000001A01C80022030E002303250027016A7D\r
+:10207000001F01D6002002050028018B0029015D08\r
+:10208000002A017D002B016E002F0186003201B075\r
+:102090000034038A0035016000370337003C035DDC\r
+:1020A000003E03BC003F019A00400277004102BE9F\r
+:1020B000004202D7004302DF004402F7004A030156\r
+:1020C0000055037F00560386006000730061009393\r
+:1020D000006200BC006300A5006400A5006500A5C7\r
+:1020E000006600A5006700A5006900C5006A011927\r
+:1020F000006B00DE006C00DE006D00DE006E00DEB6\r
+:10210000006F00DE007000E2007300D0007400D0A9\r
+:1021100000750146007B039A007D03AA007E03B48C\r
+:1021200000000002000000020000000200000002A7\r
+:102130000000000200000002000000020000000297\r
+:102140000000000200000002000000020000000287\r
+:102150000000000200000002000000020000000277\r
+:102160000000000200000002000000020000000267\r
+:102170000000000200000002000000020000000257\r
+:102180000000000200000002000000020000000247\r
+:102190000000000200000002000000020000000237\r
+:1021A0000000000200000002000000020000000227\r
+:1021B0000000000200000002000000020000000217\r
+:1021C0000000000200000002000000020000000207\r
+:1021D00000000002000000020000000200000002F7\r
+:1021E00000000002000000020000000200000002E7\r
+:1021F00000000002000000020000000200000002D7\r
+:00000001FF\r
diff --git a/firmware/radeon/CAYMAN_rlc.bin.ihex b/firmware/radeon/CAYMAN_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..3436de4
--- /dev/null
@@ -0,0 +1,257 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B840001340000000072\r
+:100030008000004900000000CC00000ECC00000E43\r
+:10004000202801C3201C0000C80800857F8B800782\r
+:10005000C80800819480002F000000008000005537\r
+:1000600000000000C80C008394C0001700000000CE\r
+:10007000840000C3200C0001840000D72038000059\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001C9880000638\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000F011B8001F840000D775\r
+:1000D00020380001840000C3200C0000C03001C0A3\r
+:1000E000CB3900002038000095C0FFD5CF80000339\r
+:1000F0007DC1C006840000F0203800008000000FA1\r
+:10010000CF80000320380001CF800003CC000081A5\r
+:10011000C808001C9480001000000000CD80000E74\r
+:1001200000000000840000F011B8001F840000D51A\r
+:1001300020380002CC310000840000D720380001B4\r
+:10014000CD800081840000C3200C00008000000FDF\r
+:1001500000000000C83800569B80009D201C000055\r
+:10016000C83800579B80009A201C0001201C00000A\r
+:10017000C80800819480001300000000C828000017\r
+:100180009680001020080001CD80000EC80C0020D1\r
+:10019000CC8000001C1C00002A8801BB9480000455\r
+:1001A00000000000800000EA000000002A8801BC76\r
+:1001B0009880006F00000000800000BA000000007E\r
+:1001C000C82800029680000620080001CD80000E9D\r
+:1001D000CC800002800000BA00000000C8280001A6\r
+:1001E000968000080000000020080001CD80000E6D\r
+:1001F000C80C0021CC800001800000BA0000000083\r
+:10020000C82800039680000900000000CD80000E81\r
+:100210002A8C01E598C0FF9420080001CC800003DF\r
+:10022000800000BA00000000C82800049680000783\r
+:100230000000000020080001CD80000ECC800004EA\r
+:10024000800000BA00000000C82800059680000762\r
+:100250000000000020080001CD80000ECC800005C9\r
+:10026000800000BA00000000CE0000A9CE4000AA25\r
+:10027000C828002A9680000900000000CD80000EEA\r
+:100280008400019F00000000C82000A9C82400AA23\r
+:100290008000000F20180001C828002B968000095C\r
+:1002A00000000000CD80000E840001AF00000000BF\r
+:1002B000C82000A9C82400AA8000000F201800014F\r
+:1002C000C82800289680FF5E00000000CD80000E48\r
+:1002D000840001BB00000000C82000A9C82400AAB7\r
+:1002E0008000000F20180001840000BE0000000004\r
+:1002F0008000000F000000001EA800FFCCC0000B13\r
+:10030000CE80000C8800000000000000C030039088\r
+:10031000CB390000C00BFFFE7F8B800610CC001095\r
+:100320007F8F8007CFB1000088000000CB3900002C\r
+:10033000CFB10000CD80000ECB39000017B800040B\r
+:100340001FB8000F9780FFFD00000000880000002C\r
+:1003500000000000800000CCC03001C1C03020038C\r
+:10036000CFB1000088000000CB390000C80C00406D\r
+:10037000C012A0007D0CC0067D0CC00CCCC00029B2\r
+:10038000C83800839B800004000000008000000F3C\r
+:1003900000000000CC000083840000F011B8001FB2\r
+:1003A0008000000F00000000CC000029CD800083F9\r
+:1003B000840000F0203800008000001000000000E1\r
+:1003C000C03001C088000000CFB1000099C0000B10\r
+:1003D000C830004023300002CF00004084000108F4\r
+:1003E00020380003C83000401F3003FDCF0000401C\r
+:1003F00080000055CC000056C8300040233000403B\r
+:10040000CF0000408400011920380001C8300040AE\r
+:100410001F3003BFCF00004080000055CC000056C5\r
+:100420008400012400000000C03020088400012C5A\r
+:100430002038FFFFC0302008CC310000CB3900004D\r
+:10044000C03003988400012C20380100C03003988C\r
+:10045000CC310000CB090000C03021B6880000007C\r
+:10046000CC3100008400012400000000203800018D\r
+:10047000C03003988400012C13B80014CC0000573E\r
+:10048000C0300398CC31000088000000CB09000088\r
+:10049000CF9C0016CD80000EC9F000197F38800C6B\r
+:1004A0009480FFFE000000008800000000000000B3\r
+:1004B000CFB10000CB3900002008001F9880000059\r
+:1004C00008880001CC1C0016880000000000000015\r
+:1004D000C0080500200C0000CC8C0087C00A20203A\r
+:1004E00020880F0504CC0001CC8C0087C00A303076\r
+:1004F00020881E0F04CC0001CC8C0087C00A40402D\r
+:100500002088281E04CC0001CC8C0087C00A404003\r
+:100510002088322804CC0001CC8C0087C00A60609F\r
+:1005200020883C3204CC0001CC8C0087C00A70705B\r
+:100530002088503C04CC0001CC8C0087C00A80800D\r
+:1005400020885A5004CC0001CC8C0087C00A8080DF\r
+:1005500020885F5A04CC0001CC8C0087C00A8080C0\r
+:100560002088645F04CC0001CC8C0087C00A8080A6\r
+:100570002088696404CC0001CC8C0087C00A80808C\r
+:1005800020886E6904CC0001CC8C0087C00A808072\r
+:100590002088736E04CC0001CC8C0087C00AC0C0D8\r
+:1005A0002088787304CC0001CC8C0087C00AC0C0BE\r
+:1005B00020887D7804CC0001CC8C0087C00AFFFF26\r
+:1005C0002088807D04CC0001CC8C0087C00A00808C\r
+:1005D00020880020CC8000A6CC0000988800000075\r
+:1005E000CC000097C008200BC00E4000CCC9000012\r
+:1005F000840002FF00000000C80800977C94800C73\r
+:1006000098800009C00824D5CD400097CD4900004E\r
+:100610007C148007840002B500000000CCC0009F5D\r
+:10062000CCC000A1C008200BC00E4001CCC9000006\r
+:10063000840002FF00000000C80800987C94800C31\r
+:100640009880000DC00824D5CD400098CD49000009\r
+:100650007C148007840002B500000000CCC000A01C\r
+:10066000CCC000A2C00C200BC012C000CD0D0000F9\r
+:10067000C8D100008800000000000000C0200391E5\r
+:10068000C0240003CE610000C0080500840001CB37\r
+:10069000CC00009BCC00009CC8080046C80C00455C\r
+:1006A0007CC880014088000484000343CC0000A77C\r
+:1006B000CD4000A888000000CC210000C0080391B4\r
+:1006C000C00C0003CCC90000C0080000840001CBAE\r
+:1006D00000000000C00C0FFFC00824D6CCC90000E9\r
+:1006E000C008039188000000CC090000C0080391F5\r
+:1006F000C00C0003CCC90000840001D5000000003C\r
+:10070000C80800A704880001CC8000A7308C000432\r
+:1007100098C0000400000000840001E3D00000A79E\r
+:10072000C008039188000000CC090000C00C200B19\r
+:10073000C012C000CD0D0000C00C239ACC8D00006B\r
+:10074000C00C239CCC8D0000C00C239888000000B6\r
+:10075000CC8D0000C00803208400020900000000C6\r
+:10076000C808009B7D488010CC8000A4CD40009B31\r
+:10077000840002A200000000C808009C7D48801090\r
+:10078000CC8000A588000000CD40009C8400017949\r
+:1007900000000000C0080700840001CB000000003A\r
+:1007A000C00801008400020900000000CD4000994B\r
+:1007B000C00801108400020900000000CD40009A2A\r
+:1007C000C81000A1C82C00A27D2D0000C808009907\r
+:1007D000200C00872024000084000321000000007A\r
+:1007E000CD40009DC808009A200C008720240001FD\r
+:1007F0008400032100000000CD40009EC80C009D35\r
+:10080000C810009E7CD140119940000300000000F8\r
+:100810007D00C0078400024BCCC000A3880000000C\r
+:100820000000000020140000201C0000C00C200B61\r
+:10083000C012C000CD0D0000C0102398CC91000064\r
+:10084000C010239ACC910000C010239CCC910000D2\r
+:1008500020180000C0124000CD0D0000C0102399E8\r
+:100860008400022D000000007D694000C010239B21\r
+:100870008400022D000000007D694000C010239D0F\r
+:100880008400022D000000007D6940009980000472\r
+:100890002018000180000216C012400199C0000417\r
+:1008A000048800018000020C201C00018800000068\r
+:1008B00000000000C92100001E28FFFF16200010C4\r
+:1008C0007EA28000880000000000000015E8000102\r
+:1008D0007E26C01096C0000B7EA6C00F96C00003F7\r
+:1008E000000000007C2A40077DE680017EA2C00F48\r
+:1008F00096C0000D00000000800002497C2A00071D\r
+:100900007EA2C00F96C00003000000007C2A0007F2\r
+:100910007DE280017EA6C00F96C0000300000000AB\r
+:100920007C2A4007880000000000000028D000401A\r
+:1009300099000052C83800A1C83C00A238DC004031\r
+:1009400095C0001D7FBD800008CC00407CD9C0123E\r
+:1009500015DC0006C820009F7E3A0001C82400A0D4\r
+:100960007E7E400184000233C008200BC00E400090\r
+:10097000CCC90000C80C00977C214007840002BE4F\r
+:10098000000000007F9F8000CF8000A1C008200BE6\r
+:10099000C00E4001CCC90000C80C00987C2540075F\r
+:1009A000840002BE000000007FDFC0008000029EC5\r
+:1009B000CFC000A2201C000099C0000EC82000A4D7\r
+:1009C000C82400A57E25C007C820009BC82400A617\r
+:1009D0001E68FFFF7E2A80107DE9C007C820009CAA\r
+:1009E000166800107E2A40107DE5C00799C00023DC\r
+:1009F000201C00407DCCC0017CD9C01215DC000653\r
+:100A00003BA0000196000003000000000BA00001C5\r
+:100A10003BE4000196400003000000000BE40001ED\r
+:100A20008400023300000000C008200BC00E40000C\r
+:100A3000CCC90000C80C0097201000017C214007A1\r
+:100A4000840002D7000000007F9F8001CF8000A1BA\r
+:100A5000C008200BC00E4001CCC90000C80C009893\r
+:100A6000201000017C254007840002D70000000010\r
+:100A70007FDFC001CFC000A2C00C200BC012C0009D\r
+:100A800088000000CD0D0000C00C24D4C01024D676\r
+:100A9000C008200BC01AC000CD890000201C000136\r
+:100AA000CDCD0000C01A4000CD890000C8990000DB\r
+:100AB000C9150000C01A4001CD890000C899000086\r
+:100AC000C91D00007D5D4000C022C00088000000FC\r
+:100AD000CE090000200C0000C010000C1C94000186\r
+:100AE000091000017CD4C0009900FFFD14880001AA\r
+:100AF0008800000000000000C00824D5C88900005C\r
+:100B00007C098007201C0000202C0000C020000C65\r
+:100B1000954000107CAF40047CEE80041F740001FF\r
+:100B20002B7400007F6B40069740000620300001C8\r
+:100B30007F2F00037DB180070954000105DC00010F\r
+:100B40000A20000106EC00019A00FFF200000000FC\r
+:100B5000C00824D588000000CD890000C00824D535\r
+:100B6000C88900007C098007201C0000202C0000A0\r
+:100B7000C020000C954000147CAF40047CEE800443\r
+:100B80001F7400017F6B40067D2E80041EA80001AB\r
+:100B90002AA800007F6B4006974000070000000075\r
+:100BA000203000017F2F00037DB18008095400012F\r
+:100BB00005DC00010A20000106EC00019A00FFEEAE\r
+:100BC00000000000C00824D588000000CD89000086\r
+:100BD000C808008650880008200C008720140010E8\r
+:100BE000C8920000CD0C0000095400019940FFFD9F\r
+:100BF00004CC000188000000000000008400030B0A\r
+:100C000000000000C0082254C889000014880010A9\r
+:100C1000C00C2255C8CD000014CC00107C8D4007BC\r
+:100C20007D514007880000002554FFFFC00823883D\r
+:100C3000C8890000C00C2389C8CD00007C8C8006C8\r
+:100C4000C00C2366C8CD00007C8C8006C00C238AB3\r
+:100C5000C8CD0000C0102367C91100007CD0C006B9\r
+:100C6000C01100007CD0C0077C8C8006148C001062\r
+:100C70001CCCFFFF1C88FFFF7C8C800688000000D6\r
+:100C80002490FFFFC81C00A809DC000709DC000451\r
+:100C9000202000003E180010958000040000000095\r
+:100CA0008000034120140040C8D4000004CC00019F\r
+:100CB00006200001201800FF7D9580067D9180129E\r
+:100CC0007D9D80037C9980119580FFF32018FF00A3\r
+:100CD0007D958006159800087D9180127D9D80038A\r
+:100CE0007C99800F9580FFEC0000000015540010E7\r
+:100CF000964000030000000015540008201800FF73\r
+:100D00007D95400688000000000000002014001FB0\r
+:100D10007C94C0041CCC000198C0000500000000B9\r
+:100D2000095400019940FFFB00000000880000000A\r
+:100D300000000000000000000000000000000000B3\r
+:100D400000000000000000000000000000000000A3\r
+:100D50000000000000000000000000000000000093\r
+:100D60000000000000000000000000000000000083\r
+:100D70000000000000000000000000000000000073\r
+:100D80000000000000000000000000000000000063\r
+:100D90000000000000000000000000000000000053\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:00000001FF\r
diff --git a/firmware/radeon/CEDAR_me.bin.ihex b/firmware/radeon/CEDAR_me.bin.ihex
new file mode 100644 (file)
index 0000000..1e8f6f0
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000040CA1FDC0120001CC000045CC00004A97\r
+:1001C0007CD0C007CC41225CCC41A1FCD44D0000C6\r
+:1001D0007C408000A0000000CC80004D800000002A\r
+:1001E000CC41225DCC000045CC00004A084C000107\r
+:1001F0007C4100007C4140001D58FFFF195C03F06A\r
+:1002000015600015CD81A102CDC12256CE01225C20\r
+:1002100094C0000521240020CE41A1FC8000007D77\r
+:1002200008CC0001CD01A1FCCC01A1027C408000E2\r
+:10023000A0000000CC80004D7C4080007C40C000CD\r
+:10024000C02A00027C4100007D2900071C940001A7\r
+:100250001C9800061C9C030015DC00087C42000072\r
+:100260007C4240009540000FC02E000405F022584B\r
+:100270007F2F0007CC310000C8280004CCC12169C1\r
+:10028000CD01216ACE81216B29B40002CC01216C01\r
+:100290009740000E29B40000800000BDC834000E55\r
+:1002A00029B400029740000929B40000C02E0004C0\r
+:1002B00005F022587F2F0007CC310000C828000429\r
+:1002C000800000BDC834000E974000047E0280000C\r
+:1002D000800000BDC834000E29B400049740FF49D7\r
+:1002E00000000000CE01216DCE41216EC828000320\r
+:1002F000C834000E9B400004C83C000E8400034E2E\r
+:10030000CC00004D29F40000974000070430A2B64D\r
+:10031000840000DFCE81A2B7CF81A2C4800000009C\r
+:10032000CFC1A2D129F40001974000070430A2BA3E\r
+:10033000840000DFCE81A2BBCF81A2C58000000077\r
+:10034000CFC1A2D229F40002974000070430A2BE18\r
+:10035000840000DFCE81A2BFCF81A2C68000000052\r
+:10036000CFC1A2D30430A2C2840000DFCE81A2C3D9\r
+:10037000CF81A2C780000000CFC1A2D4C02E00044C\r
+:100380007F2F0007CC310000C82C0004C0300006CD\r
+:100390007EF34023C03000207F6B80208800000067\r
+:1003A0007FB3C024CC00004280000000CC40001F7E\r
+:1003B0007C40C0007C4100001914003D99400013AE\r
+:1003C0000414002E840004C5041800298400025A75\r
+:1003D000C81C00130414002A840004C50418002D4E\r
+:1003E000CD41A2A4C81C001395C00000C81C001376\r
+:1003F000CCC12100CD012101CCC12102CD012103BD\r
+:10040000800004C2CD81A2A41D18100095800005B3\r
+:10041000C81C001329E400409640FFFFC81C0013CD\r
+:10042000CCC12175CD012176C820001496000000B2\r
+:10043000C8200014162800019A800004CC00004F48\r
+:10044000800004C2CC00007F80000109CCC121756E\r
+:100450007C40C0007C410000CC000045CC00004A3C\r
+:1004600040D40003CD41225CCD01A1FCC01A0001A3\r
+:10047000041CA1FD7DD9C0077C42000008CC00010E\r
+:100480000624000106280002CE1D0000CE5D0000FB\r
+:1004900098C0FFFACE9D00007C408000A0000000C4\r
+:1004A000CC80004D7C40C0001CD0000114CC000169\r
+:1004B0007C414000950000067C418000CD41216DCB\r
+:1004C000CD81216E80000137C81C0003C0220004CA\r
+:1004D0007E160007CC210000C81C00047C424000AE\r
+:1004E00098C000047C42800080000000CDE5000040\r
+:1004F000CE412169CE81216ACDC1216B80000000EF\r
+:10050000CC01216C7C40C0007C4100007C4140005B\r
+:100510007C4180007C41C00018A41FE82A68003C90\r
+:100520009680000A7C0200007C4200003A30000302\r
+:10053000CC0000589B00000342200005042000402E\r
+:10054000800001537C0240007E0240009A4000007F\r
+:100550000A6400011CEC00109AC0000ACC00004D97\r
+:10056000C02A0004C82C00207E928007CC000041E5\r
+:10057000CC290000CEC0001E80000163C8300004FA\r
+:10058000CD01216DCD41216EC83000037F1F0006D3\r
+:100590001CF40007137800019740002A07B801688F\r
+:1005A0009F80000000000000800001787F1B800E0B\r
+:1005B0008000017C7F1B800F800001807F1B800CEE\r
+:1005C000800001847F1B800D800001887F1B8011CB\r
+:1005D0008000018C7F1B80108000019114A4000812\r
+:1005E0009B80001914A40008800001A11E6400FF74\r
+:1005F0009B80001514A40008800001A11E6400FF68\r
+:100600009B80001114A40008800001A11E6400FF5B\r
+:100610009B80000D14A40008800001A11E6400FF4F\r
+:100620009B80000914A40008800001A11E6400FF43\r
+:100630009B80000514A40008800001A11E6400FF37\r
+:1006400014A400081E6400FF2A68003C9A80FE6D16\r
+:1006500014EC00087C4340007C4380007C43C000D5\r
+:1006600096C00007CC00004DCF412169CF81216A9F\r
+:10067000CFC1216B80000000CC01216C8000000004\r
+:10068000CFF50000CC000059840004C52A68003C66\r
+:100690009A800004C828001780000000D440007F22\r
+:1006A0009680FFAB7E0240008400028CC00E0002E8\r
+:1006B000CC000041800001AFCCC1304A9400000062\r
+:1006C000C83C001C7C40C0007C410000C01E0001F2\r
+:1006D00015240012C022000296400005C026000426\r
+:1006E000C027FFFB7D250006C02600007DD28006C6\r
+:1006F0007E12C0067D2500077C4140007C418000C1\r
+:10070000CCC121699A80000CCD01216ACD41216BB9\r
+:1007100096C0FE3CCD81216C840004C5CC00007FD6\r
+:10072000C830001A97000000C830001A800000018D\r
+:100730007C408000840004C5CC00007FC8140015F4\r
+:10074000C8180016CD41216B96C0FE2ECD81216CBC\r
+:10075000800001C6CC00007FCC0003E5C82C00203F\r
+:10076000C00E20240410300020CC226B0414300171\r
+:10077000CC000041D0110000CCD50000CEC0001E3E\r
+:10078000C80C000998C00000C80C00097C4100009A\r
+:100790007C414000CC400043CC400044C00E80006F\r
+:1007A0007C4240007C42800016AC001F96C0FE15C3\r
+:1007B000C035F000CE4003E11E780003127C000833\r
+:1007C0007FF7C0067FFBC00716780018CFC003E292\r
+:1007D000CF8003E312B000027F3F0000CF0003E4AC\r
+:1007E000800004517C80C0007C40C00018D001E82B\r
+:1007F000112800019500001006A801FF9E8000004E\r
+:100800000000000080000217C012080080000225CE\r
+:10081000C81400118000022CC8140012800002339A\r
+:10082000CCC1A2A48000023C1CE8003F800002640E\r
+:100830007CC1800B1CD0003F29280006292C001603\r
+:100840007EAE8007C81C00139A80003D0414002E61\r
+:1008500080000000CCC1A2A4C01208007C4140006E\r
+:100860007D0CC007C012000815580003155C000C71\r
+:100870007C4200007DD1C006122000147E1E40077D\r
+:100880007E4E8007CE81A2A480000000CD81A1FE13\r
+:10089000C81400110410211895400000C81400115C\r
+:1008A000D451000080000000CCC1A2A4C8140012E2\r
+:1008B0000410210695400000C8140012D451000015\r
+:1008C00080000000CCC1A2A4CCC1A2A404100001ED\r
+:1008D000CD000019840004C5CC00007FC810001BA7\r
+:1008E00099000000C810001B800000017C408000BF\r
+:1008F0002AA000042AA400147E2600070414002E57\r
+:1009000096000008041800298400025AC81C00132D\r
+:100910000414002A840004C5040C002DCD41A2A4B7\r
+:1009200004102100C81C001395C00000C81C00134F\r
+:10093000D4510000800004C2CCC1A2A4840004C52C\r
+:10094000041800298400025AC81C00130414002A49\r
+:10095000840004C50418002D8400025AC81C00132A\r
+:10096000800000017C40800095C00000C81C00137E\r
+:10097000CD41A2A4CC012100CC012101CD812102D5\r
+:10098000CD812103CD81A2A488000000CC00004DC0\r
+:100990001D9800017C4100007C41400099800009C5\r
+:1009A0007C420000C83C003211980010C81C000BAB\r
+:1009B0003BFC000197C0FFFFC83C0032800002767C\r
+:1009C000C83C003311980010C81C000A3BFC000111\r
+:1009D00097C0FFFFC83C00331568001D7D594007D4\r
+:1009E0009A80000411E4000A7E260007CDC000664C\r
+:1009F000CD012158CD412159CE01215ACCC1A2A40B\r
+:100A00009A80024205100004042C000112F0001D1F\r
+:100A10007D71400712E000102220000CCD0121580A\r
+:100A2000CD412159CE01215A800004C2CCC1A2A4DB\r
+:100A3000043C0005CFC1A2A4C0360002880000001B\r
+:100A4000CF4120107C40C00014D0001D9900000848\r
+:100A500014D4001C9540FD6BC02600042264215470\r
+:100A6000CC25000080000000C8280004800004C2DB\r
+:100A7000CD400061840004C51C7400011C78000294\r
+:100A80009B400003C80C00298400034DC814002BB0\r
+:100A90009B8000030410001084000364CCC1A250AA\r
+:100AA000CD01A050840002FE04180400840004C597\r
+:100AB000CC000063C83C002D8400030CC810002942\r
+:100AC000C81C002F1DDC0001C824002795C00009A8\r
+:100AD000C8340031C8380030C83C002D53740020A1\r
+:100AE0007FB7802747B80550CC000062CFFA0000DE\r
+:100AF0009A400000C8240027C82800233AA8000212\r
+:100B00009A80FFFFC8280023C0300001C8280024B5\r
+:100B10009A800000C8280024CF00005B50D800084D\r
+:100B200014DC001821DC8000CD812180CDC1218121\r
+:100B30005120000815240018CE012182CE412183C6\r
+:100B4000CD4121847C408000A0000000CC80004D7D\r
+:100B5000840004C51C7400011C7800029B40000343\r
+:100B6000C80C002A8400034DC814002C9B8000038D\r
+:100B70000410001084000364CCC1A260CD01A06009\r
+:100B8000840002FE04180980840004C5CC000064BF\r
+:100B9000C83C002E8400030CC810002AC81C002F7B\r
+:100BA0001DDC0001C824002895C00009C8340031AC\r
+:100BB000C8380030C83C002E537400207FB780270F\r
+:100BC00047B80554CC000062CFFA00009A400000FC\r
+:100BD000C8240028C8280025C82800233AA80002F5\r
+:100BE0009A80FFFFC82800239A800000C8280025AB\r
+:100BF000800002C6C03000020598C00010DC00086A\r
+:100C000014E00018CDD90000C81C0022C82400221E\r
+:100C10001DDC0FFFCDD900017E624007CE590002D6\r
+:100C2000D8185103D818510488000000D81851076B\r
+:100C30001BF800F0C036080097800003C030008029\r
+:100C400088000000C02A0004CF41217CCF01217D13\r
+:100C5000CD01217E22A8217F042400089A400000B3\r
+:100C60000A640001CC290000C82000041638001FC7\r
+:100C70009B80FFFB042400088800000000000000A7\r
+:100C8000C80C002494C0002438D400019940FFFD12\r
+:100C9000C81000237D0D00019900FFFBC80C002443\r
+:100CA00080000331C80C002594C0001B38D400011B\r
+:100CB0009940FFFDC81000237D0D00019900FFFB46\r
+:100CC000C80C0025840004C5CC00007FC83C03FB91\r
+:100CD0009BC00000C83C03FBD04003FCC03E0004A6\r
+:100CE000D20121F823FC21F9840004C5CC3D000089\r
+:100CF000C83800041BB4003E1FB000047F02C00BC4\r
+:100D00001EE800047EB640079A40FFF6C03E00048D\r
+:100D1000D00003FC7C410000800000017C4080008A\r
+:100D20008400034D7C40C0007C408000A000000097\r
+:100D3000CC80004DC83C000E97C00003D30003E6F2\r
+:100D400088000000043C0026CFC1A2A4C83C03E6F2\r
+:100D50000BFC0001CFC003E69BC0FFFBCC00004DA5\r
+:100D6000043C0005CFC1A2A4CC01A1F4840004C5B9\r
+:100D7000CC00004788000000CC00007F84000364A2\r
+:100D80007C40C0007C408000A0000000CC80004D72\r
+:100D9000043C0022CFC1A2A4840004C5CC000048BA\r
+:100DA00088000000CC00007F8400036F7C40C000FE\r
+:100DB0007C408000A0000000CC80004D043C00235B\r
+:100DC000CFC1A2A4CC01A1F3840004C5CC0000498A\r
+:100DD00088000000CC00007F800000007C40C00044\r
+:100DE000800000007C40C000C01200017C51400720\r
+:100DF00080000000D4550000CC400065C838002DAC\r
+:100E0000C83C002EC035E000C03200047FB7800629\r
+:100E10007FF7C00623B8100023FC1000CF812154B7\r
+:100E2000CFC12155CC312155C82C0004C81C002548\r
+:100E3000C82400247DE5C00799C0FFFEC81C00251A\r
+:100E4000800000017C4080007C40C0007C410000AC\r
+:100E50001928003096800008C8280027C8240028D8\r
+:100E60009A400000C82400279A400000C8240028A7\r
+:100E7000CC0003E07C4140007C418000151C001F39\r
+:100E8000CCC000C7CD0000C895C00003C01C8000C6\r
+:100E9000CDC12010E1830000055C2000CC00004D96\r
+:100EA00080000000DC1F41007C40C0007C4100004D\r
+:100EB0007C4140007C418000CCC000C9CD0000CA0C\r
+:100EC000E1830000055CA00080000000DC1F410001\r
+:100ED0007C40C0007C4100007C4140007C4180009F\r
+:100EE000CCC000CBCD0000CCE1830000055CE94024\r
+:100EF00080000000DC1F41007C40C0007C410000FD\r
+:100F00007C4140007C418000CCC000CDCD0000CEB3\r
+:100F1000E1830000055CE88080000000DC1F4100E8\r
+:100F20007C40C0007C4100007C4140007C4180004E\r
+:100F3000CCC000CFCD0000D0E1830000055CC00034\r
+:100F400080000000DC1F41007C40C0007C410000AC\r
+:100F50007C4140007C418000CCC000D1CD0000D25B\r
+:100F6000E1830000055CF00080000000DC1F410010\r
+:100F70007C40C0007C4100007C4140007C418000FE\r
+:100F8000CCC000D3CD0000D4E1830000055CF3FCAD\r
+:100F900080000000DC1F4100D44320007C40800022\r
+:100FA000A0000000CC80004DD443A0007C40800015\r
+:100FB000A0000000CC80004DD443E9407C4080007C\r
+:100FC000A0000000CC80004DD443E8807C4080002D\r
+:100FD000A0000000CC80004DD443C0007C408000C5\r
+:100FE000A0000000CC80004DD443F0007C40800085\r
+:100FF000A0000000CC80004DD443F3FC7C40800076\r
+:10100000A0000000CC80004D041CA000CC43A00038\r
+:101010007C40C000D81FC1007C408000A0000000C0\r
+:10102000CC80004D041CC000CC43C0007C40C000FC\r
+:10103000D81FC1007C408000A0000000CC80004D83\r
+:101040007C40C000C813000294C00003C81700020F\r
+:10105000C81B0002041CF3FCCC03F3FCD81FC10026\r
+:10106000D81FC1007C408000A0000000CC80004D53\r
+:10107000C01E0010C80C002950D0000810540002F7\r
+:10108000800004287D158020C01E0020C80C002A86\r
+:1010900050D0000808540400115400027D518020F3\r
+:1010A000CDC00062D45A00007C408000A000000047\r
+:1010B000CC80004D7C40C0001CD0000311280001F2\r
+:1010C0009500000A06A804329E8000007C41800042\r
+:1010D000800004407C41C000800004467C41C00088\r
+:1010E0008000044C7C41C0007C4180007C41C000F9\r
+:1010F00014D400100554A00080000000CD9500001D\r
+:10110000C02200040598A0007DA18007CC19000032\r
+:101110008000043CC8180004C0220004CD8125D6FC\r
+:10112000222025D7CC2100008000043CC8180004F0\r
+:10113000CD81216DCDC1216E8000043CC818000313\r
+:101140007C40C000C81003E1C81403E4C81803E2DF\r
+:10115000C81C03E3CD812169CDC1216ACCC1216BBB\r
+:10116000CC01216C042000047DA180007D96400C00\r
+:101170009640FBA4CD8003E21D280003C02DF000A3\r
+:10118000111800087DAD80067DA980078000000051\r
+:10119000CD8003E27C40C00080000000CC4C03E026\r
+:1011A0001C8CFFFFD44D00007C408000A00000009C\r
+:1011B000CC80004DC8140023315800049580FFFFF7\r
+:1011C000C8140023CC00005BCC412180204C80005F\r
+:1011D000CCC1218114D0001FCC412182CC4121837C\r
+:1011E0009500FB88CC412184C81400239940FFFF5F\r
+:1011F000C8140023800000017C408000C016000459\r
+:1012000021542140CC550000C81800048000000083\r
+:10121000CC0003E07C40C00018D00038C01600802D\r
+:1012200095000003C02A00047CD4C007CCC1217CF7\r
+:10123000CC41217DCC41217E7C41800014FC001FEB\r
+:101240001D98FFFF39B0000322A0217F9B000003FF\r
+:10125000419C0005041C004099C0000009DC00010D\r
+:10126000CC210000C8240004166C001F419C00051E\r
+:101270009AC0FFFACC80004D9BC0FB6200000000CA\r
+:1012800080000000CC0003E07C40C0007C410000F6\r
+:101290001518001F511400209980000B191C0031F3\r
+:1012A000CD0000627D4D4027D456000095C0FB550F\r
+:1012B000C82000269A000000C820002680000001F7\r
+:1012C0007C408000E03A0000C0260004CCC12169C7\r
+:1012D0007D250007CD01216A0BB80002CC41216BAE\r
+:1012E0009B80FFFECC41216C99C0FD0CCC00007F9F\r
+:1012F000800000017C408000C00E0100CC00004155\r
+:10130000CCC1304AC83C007FCC00007F8000000088\r
+:10131000CC00007FCC00007F88000000CC00007F64\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001046800100003001200050015001A16\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007700300079003200EA0034008E6F\r
+:1014500000350062003900EC003A0114003B01291C\r
+:10146000003C0141003D01B1003F00E90041046D35\r
+:101470000042047F00430485004401D60045014139\r
+:10148000004601FA004701FA004801FA004A0291B9\r
+:10149000004B0376004C029D004D02D4004E032009\r
+:1014A000004F03290051036A005203480053035FB1\r
+:1014B000005403780057037A00600392006103AA86\r
+:1014C0000062037E006303B4006403BE006503C8CA\r
+:1014D000006603D2006703DC006803E6006903EAE4\r
+:1014E000006A041C006B03EE006C03F2006D03F64F\r
+:1014F000006E03FA006F03FE007003F60071042211\r
+:101500000072041000730402007404090075042DB5\r
+:10151000007A04A2007C0450007D0465000F04BE24\r
+:10152000000F04BE000F04BE000F04BE000F04BE77\r
+:10153000000F04BE000F04BE000F04BE000F04BE67\r
+:10154000000F04BE000F04BE000F04BE000F04BE57\r
+:10155000000F04BE000F04BE000F04BE000F04BE47\r
+:10156000000F04BE000F04BE000F04BE000F04BE37\r
+:10157000000F04BE000F04BE000F04BE000F04BE27\r
+:00000001FF\r
diff --git a/firmware/radeon/CEDAR_pfp.bin.ihex b/firmware/radeon/CEDAR_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..f488810
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC40002980000337CC40002AED\r
+:100040009900000500000000CC40002B8000033721\r
+:10005000CC40002CCC40002D80000337CC40002E3B\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:1000700080000337CC00005280000337CC000054CE\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000043F3\r
+:1000E000CD400043C81C001DD100004399C000054D\r
+:1000F000CC000055C820001FD80003C0CC00004031\r
+:10010000C8280016D80006C01AA800279680000349\r
+:10011000CC000040D080005CCC800040CC0000408F\r
+:10012000CC4000407C408000A0000000042800017A\r
+:10013000C810002CC80C002B511000207CD0C02708\r
+:100140007CC5002045180008C99E0000C82403FD96\r
+:100150007DE68011968000037E5EC0017C02C006B1\r
+:10016000CEC3A29E55140020CC00006CCD00006DC3\r
+:10017000CD40006DCD000043CD400043C81C001DA4\r
+:10018000D140004399C00005CC000055C820001F95\r
+:10019000D80003C0CC000040C8280016D80006C014\r
+:1001A0001AA8002796800003CC800040D080005C15\r
+:1001B000CC800040CC000040CC4000407C4080001F\r
+:1001C000A000000004280001C81800151D980001B7\r
+:1001D0007C424000958002C07C428000C81C002008\r
+:1001E000C037C0007C40C0007C4100007CB4800669\r
+:1001F000C03600031AB801E897800007D04003E03A\r
+:100200008400033ACC00007FC83803E09B800000E4\r
+:10021000C83803E099C00000C81C00207CB48007E7\r
+:1002200010D400027D654000CD400043CE800043E5\r
+:10023000CD000043CC800040CE400040CE80004046\r
+:10024000CCC00040E03A00009780FF6ECD00004037\r
+:100250007C40C000800000887C4100001C8C0002B3\r
+:10026000C810001C98C00009C820001F9900000495\r
+:10027000C81C00068400033DCC000052C8180015BD\r
+:10028000800000741D980002C810001E9900FFFC39\r
+:10029000C81C00088400033DCC000054C818001599\r
+:1002A000800000741D9800021C8C0002C810001D04\r
+:1002B00098C0000FC814004999000005C820001F0D\r
+:1002C000C81C00078400033DCC000053C81800156B\r
+:1002D00094C00003189401E80554000620100001A2\r
+:1002E0007D150003800000747D9180069940FFF821\r
+:1002F000C820001F8400033DC81C0007800000B315\r
+:10030000CC00006EC00E8080CC00006704D08080DE\r
+:10031000CC000068CD0003F1CD0003F2CD0003F363\r
+:10032000CD0003F4CD0003F6CD0003F7CD0003F8B4\r
+:1003300080000005CD0003F9CC800040D44000408F\r
+:100340007C408000A000000004280001C820001F9D\r
+:10035000800000D8D8000440C820001FD800034007\r
+:10036000CC000040CC800040D44000407C40800065\r
+:10037000A000000004280001C820001FD80003C00E\r
+:10038000800000E8CC000040C820001F800000E78B\r
+:10039000D8000440C820001FD8000340CC00004013\r
+:1003A000C80C0029C810002ACC800040CC40004076\r
+:1003B000511000207CD0C027105000027D0D00207D\r
+:1003C00055140020CD000043CD400043D0400043F1\r
+:1003D000CC0000407C408000A00000000428000108\r
+:1003E000C820001FD80003C0CC000040CC800040D3\r
+:1003F000D44000407C408000A000000004280001A0\r
+:100400001C8C0002C810001D98C00012C8140049BE\r
+:1004100099000005C820001FC81C00078400033D88\r
+:10042000CC000053C80C002FCC800040CC400040D2\r
+:10043000CC400040CC4000407CC4C000CCC0004058\r
+:10044000D44000407C408000A0000000042800014F\r
+:100450009940FFF5C820001F8400033DC81C000719\r
+:1004600080000109CC00006E7C40C000C81000472D\r
+:100470009900000BC814004499400004C8180009F2\r
+:10048000CD800040CC00004080000133CC80004093\r
+:100490007C40C000C81000479500FFF7C814004515\r
+:1004A00099400004C818000ACD800040CC000040EC\r
+:1004B00080000133D80008407C40C000C8100047CD\r
+:1004C0009900FFFC00000000CC800040CCC0004040\r
+:1004D000D44000407C408000A000000004280001BF\r
+:1004E000C8100046D8000740CD0000408400014AF3\r
+:1004F000CD000040C80C004394C0000AC814004856\r
+:100500008000014304100003C8100046D80007C053\r
+:10051000CD0000408400014ACD000040C8140048CE\r
+:100520009D400000CC00006AC82800161EA80001EB\r
+:100530009A800003C029000188000000C02C0156E9\r
+:10054000CE80005CD80008C0CEC00040880000000B\r
+:10055000CC0000401C8C0002C810001EC820001FE8\r
+:1005600094C00008C814001C9900000AC81C0008A8\r
+:100570008400033DCC00005480000165CC80004025\r
+:1005800099400004C81C00068400033DCC000052C2\r
+:10059000CC80004080000000D4400040CC400027C8\r
+:1005A000CC40002880000337CC00006BC032000331\r
+:1005B000C037FFFF800001707CB080077C434000A3\r
+:1005C000C8200028C81C0027C8180026CF43A29EB8\r
+:1005D0007C414000522000207DE1C0277D58C003AF\r
+:1005E0007CDCC02054D0002080000185CC800040FD\r
+:1005F0007C418000CC80004080000182CD800040A2\r
+:10060000C019FFFFCC800040CD83A29E7C40C0007B\r
+:100610007C4100007C414000CCC3A1FACD03A1F98C\r
+:10062000CD43A29DCCC00040CD000040CD40004055\r
+:10063000CC4000407C408000A00000000428000165\r
+:100640007C40C0001CD00001CCC3A29F95000003D9\r
+:10065000D0400026D0800026CC80004080000000E2\r
+:10066000CCC000407C40C000CC800040CCC3A2A2E3\r
+:1006700080000000CCC000407C40C00014D4001FAB\r
+:10068000CC800040954000037C410000CCC0005964\r
+:100690001518001FCCC0004095800003CD0000401D\r
+:1006A000CD00005A80000337CC00007FC820001F17\r
+:1006B0007C410000D8200244CE2000447C41400010\r
+:1006C0007C418000CDA00049CD200041CD6000419B\r
+:1006D000CDA0004115100008115400187D53C0072B\r
+:1006E000CFC0002F06200001CE0000588000033745\r
+:1006F000CC00007FC820001FCA0C001794C0000562\r
+:100700007C410000D82002C6800001AFCE20004608\r
+:10071000CC000048800001C500000000C820001F78\r
+:100720007C4180000A200001CA14001ACA18001770\r
+:100730007D59800795800005CE000058CCA000466A\r
+:1007400080000000CD600046CCA000448000000086\r
+:10075000CD60004480000337CC40006ACC8000406C\r
+:1007600080000000D44000407C40C0007C4100007C\r
+:100770007C4380007C43C000041C0002CF80004208\r
+:10078000CFC00042CDC00042041C0020CCC00042BB\r
+:10079000CD000042CDC00042041C0007042000012F\r
+:1007A0007C024000C8140003C818000351980020C0\r
+:1007B0007D594027C8280003C82C0003C830000317\r
+:1007C000C834000352EC00207EAE80275374002012\r
+:1007D0007F3700277F2B40217E76402056A8003FA0\r
+:1007E0005730003F7EB280067E2A000699C0FFF295\r
+:1007F00009DC00019680FFE153F400207F7B402755\r
+:100800007D65402055580020CC00005BCD7600006F\r
+:10081000CDB60000C82000419A000000C820004169\r
+:10082000800000017C4080007C40C0007C410000D2\r
+:10083000CCC003FECD0003FFCCC00042CD0000427F\r
+:100840001514001F191800F0275C00017D760006C2\r
+:10085000998000057D5E4006CC0000428000033791\r
+:10086000CC00004D15980001152C0008998000312E\r
+:100870001EEC0001960000041530000C80000337C8\r
+:10088000CC00004204140020CD4000421F30000183\r
+:100890002028000104380020043C0007C81400038D\r
+:1008A000C8180003C81C0003C82000037D5D400D6C\r
+:1008B0007DA1C00D7D5D40071610001F159C001F17\r
+:1008C0007D1D00067D1740067E9280069B4000122B\r
+:1008D0000BB800049BC0FFF20BFC0001C80C03FE28\r
+:1008E0009A800009C81003FF9B0000FDCC00004D5A\r
+:1008F00004140020CCC00042CD000042800002243D\r
+:10090000CD40004296C000F6CC00004D8000033779\r
+:10091000CC00004E9AC00003CC00004DCC00004E2D\r
+:100920009780FDB8E383000080000000DC0301FF36\r
+:1009300096400004CC00004E80000337CC000042FB\r
+:10094000D2000042C8080003C80C0003C81000030E\r
+:10095000C8140003C8180003C81C0003C8240003FF\r
+:10096000C828000315FC001F16B0001F7FF3C00647\r
+:1009700014F0001F7FF3C0061570001F7FF3C00640\r
+:100980007D88800197C0000D7DCCC0017E510001A3\r
+:100990007E9540017C90800C7CD4C00C9AC00003F2\r
+:1009A0007C8F400624B400019B4000CDCC00004D5C\r
+:1009B00080000337CC00004EC80C03FEC81003FFB4\r
+:1009C000CCC0004280000250CD0000427C40C000FC\r
+:1009D0007C4100001914003BCC00005B95400013E3\r
+:1009E000C8140040315800029580FFFFC814004031\r
+:1009F000CC000063211C8000CCC12185CDC12186A3\r
+:100A00001514001FCC412187CC4121889540FD7DE4\r
+:100A1000CC412189C81400409940FFFFC814004010\r
+:100A2000800000017C408000CC800040CCC00040B1\r
+:100A3000CD00004080000000D4400040D08003E0A2\r
+:100A4000CC8000408400033ACC400040C80C03E056\r
+:100A500098C00000C80C03E07C408000A0000000AB\r
+:100A60007E8280067C40C000840002A214D0001F59\r
+:100A70009900FD64D04003E08400033ACC00007F7D\r
+:100A800080000294C80C03E0CC800040CCC0004041\r
+:100A900088000000D4400040CC800040CC400040A2\r
+:100AA000CC400040CC4000407C40C000CCC0002185\r
+:100AB000CCC00040D4400040C037FFFFD00003FB53\r
+:100AC000D00003FC80000000CF4003FD7C40C0004C\r
+:100AD00014DC001D99C00007CC80004018DC003CED\r
+:100AE00099C0007FCCC0004080000337CC00006A72\r
+:100AF00018D8003CCD800066CC00006A8000033727\r
+:100B0000CCC000407C40C000505000208400033A1C\r
+:100B1000CC00005D7CD0C027C820001FC8D60000D4\r
+:100B2000994000087C438000E3830000CFA0004F81\r
+:100B30008400033ACC00005E80000000D440007FB7\r
+:100B400080000337CC00005E8400033ACC00005DD7\r
+:100B5000C820001F7C40C000C036FF00C810002124\r
+:100B6000C0303FFF7CF540067D5180067D81800AC4\r
+:100B7000998000087CF38006E3830000CFA0004F3B\r
+:100B80008400033ACC00005E80000000D440007F67\r
+:100B900080000337CC00005E8400033A7C40C00034\r
+:100BA00014DC000895C000191CDC00107C4100001A\r
+:100BB00099C0000450540020800002F2C91D0000BA\r
+:100BC0007D150027C91E00007C4200007C424000C9\r
+:100BD0007C4180007DE5C0067DE280119A80FD09A0\r
+:100BE00041AC00059AC000000AEC00011CDC0010BA\r
+:100BF00099C0000400000000800002F5C91D00003B\r
+:100C0000800002F5C91E0000CC800040CCC000402E\r
+:100C100080000000D4400040C820001FD8000340DE\r
+:100C2000CC000040CC800040D44000407C4080009C\r
+:100C3000A000000004280001C820001FD80003C045\r
+:100C4000CC000040CC800040D44000407C4080007C\r
+:100C5000A0000000042800017C40C0001CD0000659\r
+:100C60002910000699000007C814001C99400005CF\r
+:100C7000CC000052C81C00068400033DC820001FA1\r
+:100C8000CC800040CCC0004080000000D440004038\r
+:100C90007C40C0007C4100001518001FCD00005BA7\r
+:100CA000998000045114002080000000D44D000001\r
+:100CB0007D4D4027191C0031D456000095C0FCD151\r
+:100CC000C82000419A000000C820004180000001B7\r
+:100CD0007C40800080000000D440007FCC00007F7A\r
+:100CE00080000000CC00007FCC00007F8800000066\r
+:100CF000CC00007FCDC0004088000000CC00004048\r
+:100D000000000000000000000000000000000000E3\r
+:100D100000000000000000000000000000000000D3\r
+:100D200000000000000000000000000000000000C3\r
+:100D300000000000000000000000000000000000B3\r
+:100D400000000000000000000000000000000000A3\r
+:100D50000000000000000000000000000000000093\r
+:100D60000000000000000000000000000000000083\r
+:100D70000000000000000000000000000000000073\r
+:100D80000000000000000000000000000000000063\r
+:100D90000000000000000000000000000000000053\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:1010000000020003000303060004030E000501AB09\r
+:10101000000600D6000700E5000800F8000900DE21\r
+:10102000000A00D3000B00E2000C011A000D01249D\r
+:10103000000E0138000F0142001003350011000AB4\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025004C00260167001701C7001801D5C4\r
+:10106000002202C1002302D20027017C001F01DA06\r
+:101070000020020A0028019E0029016B002A01902D\r
+:10108000002B0180002F0199003201BD00340316AE\r
+:101090000035016F003901D7003C02E6003E033500\r
+:1010A000003F01AB004102730042028F00430299EE\r
+:1010B000004402A6004A02B300550309005603117A\r
+:1010C0000060007200610097006200C1006300AA26\r
+:1010D000006400AA006500AA006600AA006700AAD2\r
+:1010E000006800CE006900D9006A012E006B00FB89\r
+:1010F000006C00FB006D00FB006E00FB006F00FB4E\r
+:1011000000700100007300E8007400E800750155EC\r
+:10111000007B03240000000500000005000000051E\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/CEDAR_rlc.bin.ihex b/firmware/radeon/CEDAR_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..9cc48c4
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B8000004A0000000061\r
+:10003000CC00000ECC00000EC8100082202801C3A6\r
+:10004000201C0000C8100082C80800857F8B800734\r
+:10005000C808008194800030000000008000005437\r
+:1000600000000000C9CC008394C00017000000000D\r
+:1000700084000097200C0001840000AA20380000B2\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001A988000063A\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000BD11B8001F840000AAD5\r
+:1000D0002038000184000097200C0000C03001C0CF\r
+:1000E000CB3900002038000095C0FFD3CF8000033B\r
+:1000F0007DC1C006840000BD203800008000000DD6\r
+:10010000CF80000320380001CF800003C810008298\r
+:10011000CC000081C808001A9480000E0000000086\r
+:10012000CD80000E00000000840000A820380002EE\r
+:10013000CC310000840000AA20380001CD8000816D\r
+:1001400084000097200C00008000000D00000000DB\r
+:10015000C83800569B80006B201C0000C838005730\r
+:100160009B800068201C0001201C0000C808008142\r
+:100170009480001200000000C82800009680000F44\r
+:1001800020080001CD80000ECC8000001C1C000067\r
+:100190002A8801BB9480000400000000800000B8A1\r
+:1001A000000000002A8801BC988000440000000084\r
+:1001B0009500002300000000C82800029680000679\r
+:1001C00020080001CD80000ECC8000028000008F4E\r
+:1001D00000000000C8280001968000070000000011\r
+:1001E00020080001CD80000ECC8000018000008F2F\r
+:1001F00000000000C82800039680000900000000ED\r
+:10020000CD80000E2A8C01E598C0FF9720080001E0\r
+:10021000CC8000038000008F00000000C82800048C\r
+:100220009680FF850000000020080001CD80000EB0\r
+:10023000CC8000048000008F000000008400009348\r
+:10024000000000008000000D000000001EA800FF5C\r
+:10025000CE80000C8800000000000000C030039039\r
+:10026000CB390000C00BFFFE7F8B800610CC001046\r
+:100270007F8F8007CFB1000088000000CB390000DD\r
+:10028000CFB10000CD80000ECB39000017B80004BC\r
+:100290009780FFFE000000008800000000000000C2\r
+:1002A000800000A0C03001C1C0302003CFB10000E9\r
+:1002B00088000000CB390000C9F800839B8000044F\r
+:1002C000000000008000000D00000000CC1C008336\r
+:1002D000840000BD11B8001F8000000D0000000068\r
+:1002E000CD9C0083840000BD203800009500FF54A1\r
+:1002F00000000000C03001C088000000CFB1000045\r
+:1003000099C0000BC830004023300002CF000040ED\r
+:10031000840000D520380003C83000401F3003FDA2\r
+:10032000CF00004080000054CC000056C830004090\r
+:1003300023300040CF000040840000E62038000158\r
+:10034000C83000401F3003BFCF0000408000005481\r
+:10035000CC000056840000F100000000C0302008EE\r
+:10036000840000F92038FFFFC0302008CC310000A5\r
+:10037000CB390000C0300398840000F92038010018\r
+:10038000C0300398CC310000CB090000C03021B64A\r
+:1003900088000000CC310000840000F10000000063\r
+:1003A00020380001C0300398840000F913B800140D\r
+:1003B000CC000057C0300398CC310000880000000A\r
+:1003C000CB090000CF9C0016CD80000EC9F00018AC\r
+:1003D0007F38800C9480FFFE000000008800000041\r
+:1003E00000000000CFB10000CB3900002008001F42\r
+:1003F0009880000008880001CC1C0016C9F0001B82\r
+:100400009700FFFF000000008800000000000000CF\r
+:1004100000000000000000000000000000000000DC\r
+:1004200000000000000000000000000000000000CC\r
+:1004300000000000000000000000000000000000BC\r
+:1004400000000000000000000000000000000000AC\r
+:10045000000000000000000000000000000000009C\r
+:10046000000000000000000000000000000000008C\r
+:10047000000000000000000000000000000000007C\r
+:10048000000000000000000000000000000000006C\r
+:10049000000000000000000000000000000000005C\r
+:1004A000000000000000000000000000000000004C\r
+:1004B000000000000000000000000000000000003C\r
+:1004C000000000000000000000000000000000002C\r
+:1004D000000000000000000000000000000000001C\r
+:1004E000000000000000000000000000000000000C\r
+:1004F00000000000000000000000000000000000FC\r
+:1005000000000000000000000000000000000000EB\r
+:1005100000000000000000000000000000000000DB\r
+:1005200000000000000000000000000000000000CB\r
+:1005300000000000000000000000000000000000BB\r
+:1005400000000000000000000000000000000000AB\r
+:10055000000000000000000000000000000000009B\r
+:10056000000000000000000000000000000000008B\r
+:10057000000000000000000000000000000000007B\r
+:10058000000000000000000000000000000000006B\r
+:10059000000000000000000000000000000000005B\r
+:1005A000000000000000000000000000000000004B\r
+:1005B000000000000000000000000000000000003B\r
+:1005C000000000000000000000000000000000002B\r
+:1005D000000000000000000000000000000000001B\r
+:1005E000000000000000000000000000000000000B\r
+:1005F00000000000000000000000000000000000FB\r
+:1006000000000000000000000000000000000000EA\r
+:1006100000000000000000000000000000000000DA\r
+:1006200000000000000000000000000000000000CA\r
+:1006300000000000000000000000000000000000BA\r
+:1006400000000000000000000000000000000000AA\r
+:10065000000000000000000000000000000000009A\r
+:10066000000000000000000000000000000000008A\r
+:10067000000000000000000000000000000000007A\r
+:10068000000000000000000000000000000000006A\r
+:10069000000000000000000000000000000000005A\r
+:1006A000000000000000000000000000000000004A\r
+:1006B000000000000000000000000000000000003A\r
+:1006C000000000000000000000000000000000002A\r
+:1006D000000000000000000000000000000000001A\r
+:1006E000000000000000000000000000000000000A\r
+:1006F00000000000000000000000000000000000FA\r
+:1007000000000000000000000000000000000000E9\r
+:1007100000000000000000000000000000000000D9\r
+:1007200000000000000000000000000000000000C9\r
+:1007300000000000000000000000000000000000B9\r
+:1007400000000000000000000000000000000000A9\r
+:100750000000000000000000000000000000000099\r
+:100760000000000000000000000000000000000089\r
+:100770000000000000000000000000000000000079\r
+:100780000000000000000000000000000000000069\r
+:100790000000000000000000000000000000000059\r
+:1007A0000000000000000000000000000000000049\r
+:1007B0000000000000000000000000000000000039\r
+:1007C0000000000000000000000000000000000029\r
+:1007D0000000000000000000000000000000000019\r
+:1007E0000000000000000000000000000000000009\r
+:1007F00000000000000000000000000000000000F9\r
+:1008000000000000000000000000000000000000E8\r
+:1008100000000000000000000000000000000000D8\r
+:1008200000000000000000000000000000000000C8\r
+:1008300000000000000000000000000000000000B8\r
+:1008400000000000000000000000000000000000A8\r
+:100850000000000000000000000000000000000098\r
+:100860000000000000000000000000000000000088\r
+:100870000000000000000000000000000000000078\r
+:100880000000000000000000000000000000000068\r
+:100890000000000000000000000000000000000058\r
+:1008A0000000000000000000000000000000000048\r
+:1008B0000000000000000000000000000000000038\r
+:1008C0000000000000000000000000000000000028\r
+:1008D0000000000000000000000000000000000018\r
+:1008E0000000000000000000000000000000000008\r
+:1008F00000000000000000000000000000000000F8\r
+:1009000000000000000000000000000000000000E7\r
+:1009100000000000000000000000000000000000D7\r
+:1009200000000000000000000000000000000000C7\r
+:1009300000000000000000000000000000000000B7\r
+:1009400000000000000000000000000000000000A7\r
+:100950000000000000000000000000000000000097\r
+:100960000000000000000000000000000000000087\r
+:100970000000000000000000000000000000000077\r
+:100980000000000000000000000000000000000067\r
+:100990000000000000000000000000000000000057\r
+:1009A0000000000000000000000000000000000047\r
+:1009B0000000000000000000000000000000000037\r
+:1009C0000000000000000000000000000000000027\r
+:1009D0000000000000000000000000000000000017\r
+:1009E0000000000000000000000000000000000007\r
+:1009F00000000000000000000000000000000000F7\r
+:100A000000000000000000000000000000000000E6\r
+:100A100000000000000000000000000000000000D6\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/CYPRESS_me.bin.ihex b/firmware/radeon/CYPRESS_me.bin.ihex
new file mode 100644 (file)
index 0000000..937b5af
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000040CA1FDC0120001CC000045CC00004A97\r
+:1001C0007CD0C007CC41225CCC41A1FCD44D0000C6\r
+:1001D0007C408000A0000000CC80004D800000002A\r
+:1001E000CC41225DCC000045CC00004A084C000107\r
+:1001F0007C4100007C4140001D58FFFF195C03F06A\r
+:1002000015600015CD81A102CDC12256CE01225C20\r
+:1002100094C0000521240020CE41A1FC8000007D77\r
+:1002200008CC0001CD01A1FCCC01A1027C408000E2\r
+:10023000A0000000CC80004D7C4080007C40C000CD\r
+:10024000C02A00027C4100007D2900071C940001A7\r
+:100250001C9800061C9C030015DC00087C42000072\r
+:100260007C4240009540000FC02E000405F022584B\r
+:100270007F2F0007CC310000C8280004CCC12169C1\r
+:10028000CD01216ACE81216B29B40002CC01216C01\r
+:100290009740000E29B40000800000BDC834000E55\r
+:1002A00029B400029740000929B40000C02E0004C0\r
+:1002B00005F022587F2F0007CC310000C828000429\r
+:1002C000800000BDC834000E974000047E0280000C\r
+:1002D000800000BDC834000E29B400049740FF49D7\r
+:1002E00000000000CE01216DCE41216EC828000320\r
+:1002F000C834000E9B400004C83C000E8400034E2E\r
+:10030000CC00004D29F40000974000070430A2B64D\r
+:10031000840000DFCE81A2B7CF81A2C4800000009C\r
+:10032000CFC1A2D129F40001974000070430A2BA3E\r
+:10033000840000DFCE81A2BBCF81A2C58000000077\r
+:10034000CFC1A2D229F40002974000070430A2BE18\r
+:10035000840000DFCE81A2BFCF81A2C68000000052\r
+:10036000CFC1A2D30430A2C2840000DFCE81A2C3D9\r
+:10037000CF81A2C780000000CFC1A2D4C02E00044C\r
+:100380007F2F0007CC310000C82C0004C0300006CD\r
+:100390007EF34023C03000207F6B80208800000067\r
+:1003A0007FB3C024CC00004280000000CC40001F7E\r
+:1003B0007C40C0007C4100001914003D99400013AE\r
+:1003C0000414002E840004DA041800298400025A60\r
+:1003D000C81C00130414002A840004DA0418002D39\r
+:1003E000CD41A2A4C81C001395C00000C81C001376\r
+:1003F000CCC12100CD012101CCC12102CD012103BD\r
+:10040000800004D7CD81A2A41D181000958000059E\r
+:10041000C81C001329E400409640FFFFC81C0013CD\r
+:10042000CCC12175CD012176C820001496000000B2\r
+:10043000C8200014162800019A800004CC00004F48\r
+:10044000800004D7CC00007F80000109CCC1217559\r
+:100450007C40C0007C410000CC000045CC00004A3C\r
+:1004600040D40003CD41225CCD01A1FCC01A0001A3\r
+:10047000041CA1FD7DD9C0077C42000008CC00010E\r
+:100480000624000106280002CE1D0000CE5D0000FB\r
+:1004900098C0FFFACE9D00007C408000A0000000C4\r
+:1004A000CC80004D7C40C0001CD0000114CC000169\r
+:1004B0007C414000950000067C418000CD41216DCB\r
+:1004C000CD81216E80000137C81C0003C0220004CA\r
+:1004D0007E160007CC210000C81C00047C424000AE\r
+:1004E00098C000047C42800080000000CDE5000040\r
+:1004F000CE412169CE81216ACDC1216B80000000EF\r
+:10050000CC01216C7C40C0007C4100007C4140005B\r
+:100510007C4180007C41C00018A41FE82A68003C90\r
+:100520009680000A7C0200007C4200003A30000302\r
+:10053000CC0000589B00000342200005042000402E\r
+:10054000800001537C0240007E0240009A4000007F\r
+:100550000A6400011CEC00109AC0000ACC00004D97\r
+:10056000C02A0004C82C00207E928007CC000041E5\r
+:10057000CC290000CEC0001E80000163C8300004FA\r
+:10058000CD01216DCD41216EC83000037F1F0006D3\r
+:100590001CF40007137800019740002A07B801688F\r
+:1005A0009F80000000000000800001787F1B800E0B\r
+:1005B0008000017C7F1B800F800001807F1B800CEE\r
+:1005C000800001847F1B800D800001887F1B8011CB\r
+:1005D0008000018C7F1B80108000019114A4000812\r
+:1005E0009B80001914A40008800001A11E6400FF74\r
+:1005F0009B80001514A40008800001A11E6400FF68\r
+:100600009B80001114A40008800001A11E6400FF5B\r
+:100610009B80000D14A40008800001A11E6400FF4F\r
+:100620009B80000914A40008800001A11E6400FF43\r
+:100630009B80000514A40008800001A11E6400FF37\r
+:1006400014A400081E6400FF2A68003C9A80FE6D16\r
+:1006500014EC00087C4340007C4380007C43C000D5\r
+:1006600096C00007CC00004DCF412169CF81216A9F\r
+:10067000CFC1216B80000000CC01216C8000000004\r
+:10068000CFF50000CC000059840004DA2A68003C51\r
+:100690009A800004C828001780000000D440007F22\r
+:1006A0009680FFAB7E0240008400028CC00E0002E8\r
+:1006B000CC000041800001AFCCC1304A9400000062\r
+:1006C000C83C001C7C40C0007C410000C01E0001F2\r
+:1006D00015240012C022000296400005C026000426\r
+:1006E000C027FFFB7D250006C02600007DD28006C6\r
+:1006F0007E12C0067D2500077C4140007C418000C1\r
+:10070000CCC121699A80000CCD01216ACD41216BB9\r
+:1007100096C0FE3CCD81216C840004DACC00007FC1\r
+:10072000C830001A97000000C830001A800000018D\r
+:100730007C408000840004DACC00007FC8140015DF\r
+:10074000C8180016CD41216B96C0FE2ECD81216CBC\r
+:10075000800001C6CC00007FCC0003E5C82C00203F\r
+:10076000C00E20240410300020CC226B0414300171\r
+:10077000CC000041D0110000CCD50000CEC0001E3E\r
+:10078000C80C000998C00000C80C00097C4100009A\r
+:100790007C414000CC400043CC400044C00E80006F\r
+:1007A0007C4240007C42800016AC001F96C0FE15C3\r
+:1007B000C035F000CE4003E11E780003127C000833\r
+:1007C0007FF7C0067FFBC00716780018CFC003E292\r
+:1007D000CF8003E312B000027F3F0000CF0003E4AC\r
+:1007E000800004637C80C0007C40C00018D001E819\r
+:1007F000112800019500001006A801FF9E8000004E\r
+:100800000000000080000217C012080080000225CE\r
+:10081000C81400118000022CC8140012800002339A\r
+:10082000CCC1A2A48000023C1CE8003F800002640E\r
+:100830007CC1800B1CD0003F29280006292C001603\r
+:100840007EAE8007C81C00139A80003D0414002E61\r
+:1008500080000000CCC1A2A4C01208007C4140006E\r
+:100860007D0CC007C012000815580003155C000C71\r
+:100870007C4200007DD1C006122000147E1E40077D\r
+:100880007E4E8007CE81A2A480000000CD81A1FE13\r
+:10089000C81400110410211895400000C81400115C\r
+:1008A000D451000080000000CCC1A2A4C8140012E2\r
+:1008B0000410210695400000C8140012D451000015\r
+:1008C00080000000CCC1A2A4CCC1A2A404100001ED\r
+:1008D000CD000019840004DACC00007FC810001B92\r
+:1008E00099000000C810001B800000017C408000BF\r
+:1008F0002AA000042AA400147E2600070414002E57\r
+:1009000096000008041800298400025AC81C00132D\r
+:100910000414002A840004DA040C002DCD41A2A4A2\r
+:1009200004102100C81C001395C00000C81C00134F\r
+:10093000D4510000800004D7CCC1A2A4840004DA02\r
+:10094000041800298400025AC81C00130414002A49\r
+:10095000840004DA0418002D8400025AC81C001315\r
+:10096000800000017C40800095C00000C81C00137E\r
+:10097000CD41A2A4CC012100CC012101CD812102D5\r
+:10098000CD812103CD81A2A488000000CC00004DC0\r
+:100990001D9800017C4100007C41400099800009C5\r
+:1009A0007C420000C83C003211980010C81C000BAB\r
+:1009B0003BFC000197C0FFFFC83C0032800002767C\r
+:1009C000C83C003311980010C81C000A3BFC000111\r
+:1009D00097C0FFFFC83C00331568001D7D594007D4\r
+:1009E0009A80000411E4000A7E260007CDC000664C\r
+:1009F000CD012158CD412159CE01215ACCC1A2A40B\r
+:100A00009A80025705100004042C000112F0001D0A\r
+:100A10007D71400712E000102220000CCD0121580A\r
+:100A2000CD412159CE01215A800004D7CCC1A2A4C6\r
+:100A3000043C0005CFC1A2A4C0360002880000001B\r
+:100A4000CF4120107C40C00014D0001D9900000848\r
+:100A500014D4001C9540FD6BC02600042264215470\r
+:100A6000CC25000080000000C8280004800004D7C6\r
+:100A7000CD400061840004DA7C4140001D74000117\r
+:100A80001C7800029B400003C80C00298400034D21\r
+:100A9000155400109B8000030410001084000371A3\r
+:100AA000CCC1A250CD01A050840002FE0418040065\r
+:100AB000840004DACC000063C83C002D8400030CE1\r
+:100AC000C8100029C81C002F1DDC0001C824002705\r
+:100AD00095C0000CC8340031C8380030C83C002D27\r
+:100AE00017FC001013FC00107FD7C00753740020C0\r
+:100AF0007FB7802747B80550CC000062CFFA0000CE\r
+:100B00009A400000C8240027C0300001C8280024F3\r
+:100B10009A800000C8280024CF00005B50D800084D\r
+:100B200014DC001821DC8000CD812180CDC1218121\r
+:100B30005120000815240018CE012182CE412183C6\r
+:100B4000CD4121847C408000A0000000CC80004D7D\r
+:100B5000840004DA7C4140001D7400011C7800020E\r
+:100B60009B400003C80C002A8400034D155400105C\r
+:100B70009B8000030410001084000371CCC1A260AC\r
+:100B8000CD01A060840002FE04180980840004DA0C\r
+:100B9000CC000064C83C002E8400030CC810002A5E\r
+:100BA000C81C002F1DDC0001C824002895C0000CC3\r
+:100BB000C8340031C8380030C83C002E17FC001083\r
+:100BC00013FC00107FD7C007537400207FB7802725\r
+:100BD00047B80554CC000062CFFA00009A400000EC\r
+:100BE000C8240028C82800259A800000C8280025AD\r
+:100BF000800002C6C03000020598C00010DC00086A\r
+:100C000014E00018CDD90000C81C0022C82400221E\r
+:100C10001DDC0FFFCDD900017E624007CE590002D6\r
+:100C2000D8185103D818510488000000D81851076B\r
+:100C30001BF800F0C036080097800003C030008029\r
+:100C400088000000C02A0004CF41217CCF01217D13\r
+:100C5000CD01217E22A8217F042400089A400000B3\r
+:100C60000A640001CC290000C82000041638001FC7\r
+:100C70009B80FFFB042400088800000000000000A7\r
+:100C8000C80C002494C0002438D400019940FFFD12\r
+:100C9000C81000237D0D00019900FFFBC80C002443\r
+:100CA00080000331C80C002594C0001B38D400011B\r
+:100CB0009940FFFDC81000237D0D00019900FFFB46\r
+:100CC000C80C0025840004DACC00007FC83C03FB7C\r
+:100CD0009BC00000C83C03FBD04003FCC03E0004A6\r
+:100CE000D20121F823FC21F9840004DACC3D000074\r
+:100CF000C83800041BB4003E1FB000047F02C00BC4\r
+:100D00001EE800047EB640079A40FFF6C03E00048D\r
+:100D1000D00003FC7C410000800000017C4080008A\r
+:100D20008400034D7C40C0007C408000A000000097\r
+:100D3000CC80004DC83C000E97C00003D30003E6F2\r
+:100D400088000000043C0026CFC1A2A4C83C03E6F2\r
+:100D50000BFC0001CFC003E69BC0FFFBCC00004DA5\r
+:100D6000C83C03E597C0000CC83C001397C00000C6\r
+:100D7000C83C0013043C2100CC3D0000CC3D0000E9\r
+:100D8000CC3D0000CC3D0000043C0029CFC1A2A412\r
+:100D9000CC80004D043C0005CFC1A2A4CC01A1F43D\r
+:100DA000840004DACC00004788000000CC00007FFB\r
+:100DB000840003717C40C0007C408000A0000000E3\r
+:100DC000CC80004D043C0022CFC1A2A4840004DAF0\r
+:100DD000CC00004888000000CC00007F8400037C29\r
+:100DE0007C40C0007C408000A0000000CC80004D12\r
+:100DF000C83C03E597C0000CC83C001397C0000036\r
+:100E0000C83C0013043C2100CC3D0000CC3D000058\r
+:100E1000CC3D0000CC3D0000043C0029CFC1A2A481\r
+:100E2000CC80004D043C0023CFC1A2A4CC01A1F38F\r
+:100E3000840004DACC00004988000000CC00007F68\r
+:100E4000800000007C40C000800000007C40C000AA\r
+:100E5000C01200017C51400780000000D455000002\r
+:100E6000840004DACC400065C81C0025C824002496\r
+:100E70007DE5C00799C0FFFEC81C00258000000169\r
+:100E80007C4080007C40C0007C4100007C414000F0\r
+:100E90007C418000151C001FCCC000C7CD0000C8DD\r
+:100EA00095C00003C01C8000CDC12010E18300006C\r
+:100EB000055C2000CC00004D80000000DC1F4100DC\r
+:100EC0007C40C0007C4100007C4140007C418000AF\r
+:100ED000CCC000C9CD0000CAE1830000055CA000C1\r
+:100EE00080000000DC1F41007C40C0007C4100000D\r
+:100EF0007C4140007C418000CCC000CBCD0000CCC8\r
+:100F0000E1830000055CE94080000000DC1F410037\r
+:100F10007C40C0007C4100007C4140007C4180005E\r
+:100F2000CCC000CDCD0000CEE1830000055CE880A0\r
+:100F300080000000DC1F41007C40C0007C410000BC\r
+:100F40007C4140007C418000CCC000CFCD0000D06F\r
+:100F5000E1830000055CC00080000000DC1F410050\r
+:100F60007C40C0007C4100007C4140007C4180000E\r
+:100F7000CCC000D1CD0000D2E1830000055CF000C0\r
+:100F800080000000DC1F41007C40C0007C4100006C\r
+:100F90007C4140007C418000CCC000D3CD0000D417\r
+:100FA000E1830000055CF3FC80000000DC1F4100D1\r
+:100FB000D44320007C408000A0000000CC80004D85\r
+:100FC000D443A0007C408000A0000000CC80004DF5\r
+:100FD000D443E9407C408000A0000000CC80004D5C\r
+:100FE000D443E8807C408000A0000000CC80004D0D\r
+:100FF000D443C0007C408000A0000000CC80004DA5\r
+:10100000D443F0007C408000A0000000CC80004D64\r
+:10101000D443F3FC7C408000A0000000CC80004D55\r
+:10102000041CA000CC43A0007C40C000D81FC1001D\r
+:101030007C408000A0000000CC80004D041CC0005B\r
+:10104000CC43C0007C40C000D81FC1007C40800061\r
+:10105000A0000000CC80004D7C40C000C8130002FE\r
+:1010600094C00003C8170002C81B0002041CF3FC54\r
+:10107000CC03F3FCD81FC100D81FC1007C40800006\r
+:10108000A0000000CC80004DC8280026C82C0028F5\r
+:101090002AB000FF2AF400FF7F7380079B80FFFBCC\r
+:1010A000C01E0010C80C002950D0000810540002C7\r
+:1010B0008000043A7D158020C8280026C82C00270F\r
+:1010C0002AB000FF2AF400FF7F7380079B80FFFB9C\r
+:1010D000C01E0020C80C002A50D00008085404008C\r
+:1010E000115400027D518020CDC00062D45A00000E\r
+:1010F0007C408000A0000000CC80004D7C40C000FF\r
+:101100001CD00003112800019500000A06A8044421\r
+:101110009E8000007C418000800004527C41C00021\r
+:10112000800004587C41C0008000045E7C41C00007\r
+:101130007C4180007C41C00014D400100554A00004\r
+:1011400080000000CD950000C02200040598A0009A\r
+:101150007DA18007CC1900008000044EC81800044F\r
+:10116000C0220004CD8125D6222025D7CC21000025\r
+:101170008000044EC8180004CD81216DCDC1216EC0\r
+:101180008000044EC81800037C40C000C81003E172\r
+:10119000C81403E4C81803E2C81C03E3CD81216925\r
+:1011A000CDC1216ACCC1216BCC01216C042000048B\r
+:1011B0007DA180007D96400C9640FB92CD8003E29D\r
+:1011C0001D280003C02DF000111800087DAD800619\r
+:1011D0007DA9800780000000CD8003E27C40C00034\r
+:1011E00080000000CC4C03E01C8CFFFFD44D0000BD\r
+:1011F0007C408000A0000000CC80004DC81400237B\r
+:10120000315800049580FFFFC8140023CC00005B18\r
+:10121000CC412180204C8000CCC1218114D0001F02\r
+:10122000CC412182CC4121839500FB76CC412184A5\r
+:10123000C81400239940FFFFC81400238000000158\r
+:101240007C408000C016000421542140CC55000091\r
+:10125000C818000480000000CC0003E0C02A00048D\r
+:101260007C40C000CCC1217CCC41217DCC41217E81\r
+:101270007C41800014FC001F1D98FFFF39B0000363\r
+:1012800022A0217F9B000003419C0005041C00401C\r
+:1012900099C0000009DC0001CC210000C824000432\r
+:1012A000166C001F419C00059AC0FFFACC80004DCF\r
+:1012B0009BC0FB540000000080000000CC0003E055\r
+:1012C0007C40C0007C4100001518001F5114002014\r
+:1012D00099800012191C0031C8280027C82C00284A\r
+:1012E0002AB000FF2AF400FF7F7380079B80FFFC79\r
+:1012F000C8280027CD0000627D4D4027D45600004D\r
+:1013000095C0FB40C82000269A000000C820002697\r
+:10131000800000017C408000E03A0000C02600040C\r
+:10132000CCC121697D250007CD01216A0BB80002DF\r
+:10133000CC41216B9B80FFFECC41216C99C0FCF716\r
+:10134000CC00007F800000017C408000C00E0100C6\r
+:10135000CC000041CCC1304AC83C007FCC00007FAB\r
+:1013600080000000CC00007FCC00007F88000000DF\r
+:10137000CC00007F00000000000000000000000022\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001047A00100003001200050015001A04\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007700300079003200EA0034008E6F\r
+:1014500000350062003900EC003A0114003B01291C\r
+:10146000003C0141003D01B1003F00E90041047F23\r
+:101470000042049100430497004401D60045014115\r
+:10148000004601FA004701FA004801FA004A0291B9\r
+:10149000004B0390004C029D004D02D4004E0320EF\r
+:1014A000004F032900510377005203480053036C97\r
+:1014B0000054039200570394006003A1006103B03D\r
+:1014C00000620398006303BA006403C4006503CE9E\r
+:1014D000006603D8006703E2006803EC006903F0CC\r
+:1014E000006A0422006B03F4006C03F8006D03FC37\r
+:1014F000006E0400006F0404007003FC0071042EF1\r
+:1015000000720416007304080074040F0075043F91\r
+:10151000007A04B0007C0462007D0477000F04D3DD\r
+:10152000000F04D3000F04D3000F04D3000F04D323\r
+:10153000000F04D3000F04D3000F04D3000F04D313\r
+:10154000000F04D3000F04D3000F04D3000F04D303\r
+:10155000000F04D3000F04D3000F04D3000F04D3F3\r
+:10156000000F04D3000F04D3000F04D3000F04D3E3\r
+:10157000000F04D3000F04D3000F04D3000F04D3D3\r
+:00000001FF\r
diff --git a/firmware/radeon/CYPRESS_pfp.bin.ihex b/firmware/radeon/CYPRESS_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..220aa38
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC400029800003ADCC40002A77\r
+:100040009900000500000000CC40002B800003ADAB\r
+:10005000CC40002CCC40002D800003ADCC40002EC5\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:10007000800003ADCC000052800003ADCC000054E2\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000043F3\r
+:1000E000CD400043C81C001DD100004399C000054D\r
+:1000F000CC000055C820001FD80003C0CC00004031\r
+:10010000C8280016D80006C01AA800279680000349\r
+:10011000CC000040D080005CCC800040CC0000408F\r
+:10012000CC4000407C408000A0000000042800017A\r
+:10013000C810002CC80C002B511000207CD0C02708\r
+:100140007CC5002045180008C99E0000C82403FD96\r
+:100150007DE68011968000037E5EC0017C02C006B1\r
+:10016000CEC3A29E55140020CC00006CCD00006DC3\r
+:10017000CD40006DCD000043CD400043C81C001DA4\r
+:10018000D140004399C00005CC000055C820001F95\r
+:10019000D80003C0CC000040C8280016D80006C014\r
+:1001A0001AA8002796800003CC800040D080005C15\r
+:1001B000CC800040CC000040CC400040C83521A39A\r
+:1001C0001B7807F02BB400089740FFFDC83803FCEC\r
+:1001D0009B800000C83803FC840003B0D04003FBC0\r
+:1001E000C83803FC9B80FFFB043C001BCC00005B79\r
+:1001F000840003B0CFC121F8C83921F91BB40078BD\r
+:100200009B40FFFCCC00005BD00003FB7C408000E7\r
+:10021000A000000004280001C81800151D98000166\r
+:100220007C424000958003227C428000C81C002054\r
+:10023000C037C0007C40C0007C4100007CB4800618\r
+:10024000C036000399C00000C81C00207CB48007A1\r
+:1002500010D400027D654000CD400043CE800043B5\r
+:10026000CD000043CC800040CE400040CE80004016\r
+:10027000CCC00040E03A00009780FF62CD00004013\r
+:100280007C40C000800000947C4100001C8C000277\r
+:10029000C810001C98C00009C820001F9900000465\r
+:1002A000C81C0006840003B3CC000052C818001517\r
+:1002B000800000881D980002C810001E9900FFFCF5\r
+:1002C000C81C0008840003B3CC000054C8180015F3\r
+:1002D000800000881D9800021C8C0002C810001DC0\r
+:1002E00098C0000FC814004999000005C820001FDD\r
+:1002F000C81C0007840003B3CC000053C8180015C5\r
+:1003000094C00003189401E8055400062010000171\r
+:100310007D150003800000887D9180069940FFF8DC\r
+:10032000C820001F840003B3C81C0007800000BF62\r
+:10033000CC00006EC00E8080CC00006704D08080AE\r
+:10034000CC000068CD0003F1CD0003F2CD0003F333\r
+:10035000CD0003F4CD0003F6CD0003F7CD0003F884\r
+:1003600080000005CD0003F9CC800040D44000405F\r
+:100370007C408000A000000004280001C820001F6D\r
+:10038000800000E4D8000440C820001FD8000340CB\r
+:10039000CC000040CC800040D44000407C40800035\r
+:1003A000A000000004280001C820001FD80003C0DE\r
+:1003B000800000F4CC000040C820001F800000F343\r
+:1003C000D8000440C820001FD8000340CC000040E3\r
+:1003D000C80C0029C810002ACC800040CC40004046\r
+:1003E000511000207CD0C027105000027D0D00204D\r
+:1003F00055140020CD000043CD400043D0400043C1\r
+:10040000CC0000407C408000A000000004280001D7\r
+:10041000C820001FD80003C0CC000040CC800040A2\r
+:10042000D44000407C408000A0000000042800016F\r
+:100430001C8C0002C810001D98C00012C81400498E\r
+:1004400099000005C820001FC81C0007840003B3E2\r
+:10045000CC000053C80C002FCC800040CC400040A2\r
+:10046000CC400040CC4000407CC4C000CCC0004028\r
+:10047000D44000407C408000A0000000042800011F\r
+:100480009940FFF5C820001F840003B3C81C000773\r
+:1004900080000115CC00006E7C40C000C8100047F1\r
+:1004A0001CDC03FF1894FFF09900000F7D5D4000F5\r
+:1004B000C818004499800004C8180009CD80004085\r
+:1004C000CC0000408000015DC81803F07C40C000F3\r
+:1004D000C81000471CDC03FF1894FFF09500FFF5DF\r
+:1004E0007D5D4000C818004599800004C818000AC6\r
+:1004F000CD800040CC000040C81803F51D9C0003CF\r
+:1005000015980002C9A403F611DC00037E5E800486\r
+:100510001EA800FF05540007155400037D6AC01093\r
+:1005200096C00008042C00FF7EDEC0037EC2C00B14\r
+:100530007E6E40067D5D40037E564007CE5803F632\r
+:10054000D8000840CCC00040D44000407C4080002F\r
+:10055000A0000000042800017C40C000C810004733\r
+:100560001CDC03FF1894FFF09900FFE47D5D400060\r
+:10057000C81803F01D9C000315980002C9A403F1DC\r
+:1005800011DC00037E5E80041EA800FF05540007F6\r
+:10059000155400037D6AC01096C00008042C00FFAB\r
+:1005A0007EDEC0037EC2C00B7E6E40067D5D4003D2\r
+:1005B0007E564007CE5803F1CC800040CCC00040AE\r
+:1005C000D44000407C408000A000000004280001CE\r
+:1005D000C8100046C81803F0059800011D98000FC8\r
+:1005E000CD8003F01D9C000319980062C9A403F19B\r
+:1005F00011DC0003042C00FF7EDEC0037EC2C00BB2\r
+:100600007E6E4006CE5803F104180000041C000062\r
+:10061000840001C1C9E403F1840001C1C9E403F10C\r
+:10062000840001C1C9E403F1840001C1C9E403F1FC\r
+:100630007D210007D8000740CD000040840001B6AE\r
+:10064000CD000040C80C004394C00022C8140048EC\r
+:100650008000019704100003C8100046C81803F575\r
+:10066000059800011D98000FCD8003F51D9C000327\r
+:1006700019980062C9A403F611DC0003042C00FFE2\r
+:100680007EDEC0037EC2C00B7E6E4006CE5803F6EF\r
+:1006900004180000041C0000840001C1C9E403F632\r
+:1006A000840001C1C9E403F6840001C1C9E403F672\r
+:1006B000840001C1C9E403F67D210007D80007C00A\r
+:1006C000CD000040840001B6CD000040C8140048B1\r
+:1006D0009D400000CC00006AC82800161EA800013A\r
+:1006E0009A800003C029000188000000C02C015638\r
+:1006F000CE80005CD80008C0CEC00040880000005A\r
+:10070000CC0000401E6800FF7E9BC01097C0000315\r
+:100710001A6C1FE87E8180007EDBC01097C000034A\r
+:100720001A701FF07EC180007F1BC01097C00003AD\r
+:100730001A741FF87F0180007F5BC01097C0000310\r
+:1007400005DC00017F41800011A000058800000049\r
+:10075000122000101C8C0002C810001EC820001FB0\r
+:1007600094C00008C814001C9900000AC81C0008A6\r
+:10077000840003B3CC000054800001E5CC8000402D\r
+:1007800099400004C81C0006840003B3CC0000524A\r
+:10079000CC80004080000000D4400040CC400027C6\r
+:1007A000CC400028800003ADCC00006BC0320003B9\r
+:1007B000C037FFFF800001F07CB080077C43400021\r
+:1007C000C8200028C81C0027C8180026CF43A29EB6\r
+:1007D0007C414000522000207DE1C0277D58C003AD\r
+:1007E0007CDCC02054D0002080000205CC8000407A\r
+:1007F0007C418000CC80004080000202CD8000401F\r
+:10080000C019FFFFCC800040CD83A29E7C40C00079\r
+:100810007C4100007C414000CCC3A1FACD03A1F98A\r
+:10082000CD43A29DCCC00040CD000040CD40004053\r
+:10083000CC4000407C408000A00000000428000163\r
+:100840007C40C0001CD00001CCC3A29F95000003D7\r
+:10085000D0400026D0800026CC80004080000000E0\r
+:10086000CCC000407C40C000CC800040CCC3A2A2E1\r
+:1008700080000000CCC000407C40C00014D4001FA9\r
+:10088000CC800040954000037C410000CCC0005962\r
+:100890001518001FCCC0004095800003CD0000401B\r
+:1008A000CD00005A800003ADCC00007FC820001F9F\r
+:1008B0007C410000D8200244CE2000447C4140000E\r
+:1008C0007C418000CDA00049CD200041CD60004199\r
+:1008D000CDA0004115100008115400187D53C00729\r
+:1008E000CFC0002F06200001CE000058800003ADCD\r
+:1008F000CC00007FC820001FCA0C001794C0000560\r
+:100900007C410000D82002C68000022FCE20004685\r
+:10091000CC0000488000024500000000C820001FF5\r
+:100920007C4180000A200001CA14001ACA1800176E\r
+:100930007D59800795800005CE000058CCA0004668\r
+:1009400080000000CD600046CCA000448000000084\r
+:10095000CD600044800003ADCC40006ACC800040F4\r
+:1009600080000000D44000407C40C0007C4100007A\r
+:10097000CCC003FECD0003FFCCC00042CD0000423E\r
+:100980001514001F191800F0275C00017D76000681\r
+:10099000998000057D5E4006CC000042800003ADDA\r
+:1009A000CC00004D15980001152C00089980004DD1\r
+:1009B0001EEC0001960000041530000C800003AD11\r
+:1009C000CC00004204140020CD4000421F30000142\r
+:1009D00020280001840002ACC81400039B40002BB7\r
+:1009E0000438001C840002ACC81400039B4000279C\r
+:1009F00004380018840002ACC81400039B40002394\r
+:100A000004380014840002ACC81400039B40001F8B\r
+:100A100004380010840002ACC81400039B40001B83\r
+:100A20000438000C840002ACC81400039B4000177B\r
+:100A300004380008840002ACC81400039B40001373\r
+:100A400004380004840002ACC81400039B40001565\r
+:100A5000C80C03FE9A800009C81003FF9B00011612\r
+:100A6000CC00004D04140020CCC00042CD00004258\r
+:100A700080000274CD40004296C0010FCC00004DB2\r
+:100A8000800003ADCC00004E9AC00003CC00004DA6\r
+:100A9000CC00004EE383000080000000DC0301FF77\r
+:100AA0009AC00105CC00004D800003ADCC00004E83\r
+:100AB000C8180003C81C0003C82000037D5D400D5A\r
+:100AC0007DA1C00D7D5D40071610001F159C001F05\r
+:100AD0007D1D00067D174006880000007E9280067E\r
+:100AE00096400004CC00004E800003ADCC000042D4\r
+:100AF000D2000042C8080003C80C0003C81000035D\r
+:100B0000C8140003C8180003C81C0003C82400034D\r
+:100B1000C828000315FC001F16B0001F7FF3C00695\r
+:100B200014F0001F7FF3C0061570001F7FF3C0068E\r
+:100B30007D88800197C0000D7DCCC0017E510001F1\r
+:100B40007E9540017C90800C7CD4C00C9AC0000340\r
+:100B50007C8F400624B400019B4000D7CC00004DA0\r
+:100B6000800003ADCC00004EC80C03FEC81003FF8C\r
+:100B7000CCC00042800002BCCD0000427C40C000DE\r
+:100B80007C4100001914003BCC00005B9540001331\r
+:100B9000C8140040315800029580FFFFC81400407F\r
+:100BA000CC000063211C8000CCC12185CDC12186F1\r
+:100BB0001514001FCC412187CC4121889540FD119F\r
+:100BC000CC412189C81400409940FFFFC81400405F\r
+:100BD000800000017C408000CC800040CCC0004000\r
+:100BE000CD00004080000000D4400040D08003E0F1\r
+:100BF000CC800040840003B0CC400040C80C03E02F\r
+:100C000098C00000C80C03E07C408000A0000000F9\r
+:100C10007E8280067C40C0008400030E14D0001F3A\r
+:100C20009900FCF8D04003E0840003B0CC00007FC2\r
+:100C300080000300C80C03E0CC800040CCC0004022\r
+:100C400088000000D4400040CC800040CC400040F0\r
+:100C5000CC400040CC4000407C40C000CCC00021D3\r
+:100C6000CCC00040D4400040CC0003F0CC0003F1E5\r
+:100C7000CC0003F2CC0003F3CC0003F4CC0003F56A\r
+:100C8000CC0003F6CC0003F7CC0003F8CC0003F94A\r
+:100C9000C037FFFFD00003FBD00003FC8000000042\r
+:100CA000CF4003FD7C40C00014DC001D99C000074C\r
+:100CB000CC80004018DC003C99C0007FCCC00040D4\r
+:100CC000800003ADCC00006A18D8003CCD800066DF\r
+:100CD000CC00006A800003ADCCC000407C40C00066\r
+:100CE00050500020840003B0CC00005D7CD0C027B1\r
+:100CF000C820001FC8D60000994000087C4380002F\r
+:100D0000E3830000CFA0004F840003B0CC00005E5E\r
+:100D100080000000D440007F800003ADCC00005E66\r
+:100D2000840003B0CC00005DC820001F7C40C000E0\r
+:100D3000C036FF00C8100021C0303FFF7CF54006E0\r
+:100D40007D5180067D81800A998000087CF38006B1\r
+:100D5000E3830000CFA0004F840003B0CC00005E0E\r
+:100D600080000000D440007F800003ADCC00005E16\r
+:100D7000840003B07C40C00014DC000895C000195A\r
+:100D80001CDC00107C41000099C00004505400207D\r
+:100D900080000368C91D00007D150027C91E0000E2\r
+:100DA0007C4200007C4240007C4180007DE5C00622\r
+:100DB0007DE280119A80FC9341AC00059AC000004E\r
+:100DC0000AEC00011CDC001099C0000400000000C7\r
+:100DD0008000036BC91D00008000036BC91E00006A\r
+:100DE000CC800040CCC0004080000000D4400040D7\r
+:100DF000C820001FD8000340CC000040CC80004039\r
+:100E0000D44000407C408000A00000000428000185\r
+:100E1000C820001FD80003C0CC000040CC80004098\r
+:100E2000D44000407C408000A00000000428000165\r
+:100E30007C40C0001CD00006291000069900000765\r
+:100E4000C814001C99400005CC000052C81C0006C4\r
+:100E5000840003B3C820001FCC800040CCC00040F9\r
+:100E600080000000D44000407C40C0007C41000075\r
+:100E70001518001FCD00005B99800004511400205C\r
+:100E800080000000D44D00007D4D4027191C00312A\r
+:100E9000D456000095C0FC5BC82000419A000000B9\r
+:100EA000C8200041800000017C40800080000000DC\r
+:100EB000D440007FCC00007F80000000CC00007F89\r
+:100EC000CC00007F88000000CC00007FCDC0004037\r
+:100ED00088000000CC00004000000000000000007E\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003037C000403840005022B9C\r
+:10101000000600E2000700F100080104000900EAF0\r
+:10102000000A00DF000B00EE000C0126000D01336A\r
+:10103000000E0174000F0196001003AB0011000AAE\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025004C002601E7001702470018025542\r
+:101060000022033700230348002701FC0020025A16\r
+:101070000028021E002901EB002A0210002B0200AA\r
+:10108000002F02190032023D0034038C003501EFBD\r
+:1010900000390257003C035C003E03AB003F022BCB\r
+:1010A000004102DF004202FB00430305004403123B\r
+:1010B000004A03290055037F00560387006000861D\r
+:1010C000006100A3006200CD006300B6006400B6BA\r
+:1010D000006500B6006600B6006700B6006800DA7A\r
+:1010E000006900E5006A0156006B0107006C01070A\r
+:1010F000006D0107006E0107006F01070070010C11\r
+:10110000007300F4007400F4007501D5007B039AAD\r
+:1011100000000005000000050000000500000005BB\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/CYPRESS_rlc.bin.ihex b/firmware/radeon/CYPRESS_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..9cc48c4
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B8000004A0000000061\r
+:10003000CC00000ECC00000EC8100082202801C3A6\r
+:10004000201C0000C8100082C80800857F8B800734\r
+:10005000C808008194800030000000008000005437\r
+:1000600000000000C9CC008394C00017000000000D\r
+:1000700084000097200C0001840000AA20380000B2\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001A988000063A\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000BD11B8001F840000AAD5\r
+:1000D0002038000184000097200C0000C03001C0CF\r
+:1000E000CB3900002038000095C0FFD3CF8000033B\r
+:1000F0007DC1C006840000BD203800008000000DD6\r
+:10010000CF80000320380001CF800003C810008298\r
+:10011000CC000081C808001A9480000E0000000086\r
+:10012000CD80000E00000000840000A820380002EE\r
+:10013000CC310000840000AA20380001CD8000816D\r
+:1001400084000097200C00008000000D00000000DB\r
+:10015000C83800569B80006B201C0000C838005730\r
+:100160009B800068201C0001201C0000C808008142\r
+:100170009480001200000000C82800009680000F44\r
+:1001800020080001CD80000ECC8000001C1C000067\r
+:100190002A8801BB9480000400000000800000B8A1\r
+:1001A000000000002A8801BC988000440000000084\r
+:1001B0009500002300000000C82800029680000679\r
+:1001C00020080001CD80000ECC8000028000008F4E\r
+:1001D00000000000C8280001968000070000000011\r
+:1001E00020080001CD80000ECC8000018000008F2F\r
+:1001F00000000000C82800039680000900000000ED\r
+:10020000CD80000E2A8C01E598C0FF9720080001E0\r
+:10021000CC8000038000008F00000000C82800048C\r
+:100220009680FF850000000020080001CD80000EB0\r
+:10023000CC8000048000008F000000008400009348\r
+:10024000000000008000000D000000001EA800FF5C\r
+:10025000CE80000C8800000000000000C030039039\r
+:10026000CB390000C00BFFFE7F8B800610CC001046\r
+:100270007F8F8007CFB1000088000000CB390000DD\r
+:10028000CFB10000CD80000ECB39000017B80004BC\r
+:100290009780FFFE000000008800000000000000C2\r
+:1002A000800000A0C03001C1C0302003CFB10000E9\r
+:1002B00088000000CB390000C9F800839B8000044F\r
+:1002C000000000008000000D00000000CC1C008336\r
+:1002D000840000BD11B8001F8000000D0000000068\r
+:1002E000CD9C0083840000BD203800009500FF54A1\r
+:1002F00000000000C03001C088000000CFB1000045\r
+:1003000099C0000BC830004023300002CF000040ED\r
+:10031000840000D520380003C83000401F3003FDA2\r
+:10032000CF00004080000054CC000056C830004090\r
+:1003300023300040CF000040840000E62038000158\r
+:10034000C83000401F3003BFCF0000408000005481\r
+:10035000CC000056840000F100000000C0302008EE\r
+:10036000840000F92038FFFFC0302008CC310000A5\r
+:10037000CB390000C0300398840000F92038010018\r
+:10038000C0300398CC310000CB090000C03021B64A\r
+:1003900088000000CC310000840000F10000000063\r
+:1003A00020380001C0300398840000F913B800140D\r
+:1003B000CC000057C0300398CC310000880000000A\r
+:1003C000CB090000CF9C0016CD80000EC9F00018AC\r
+:1003D0007F38800C9480FFFE000000008800000041\r
+:1003E00000000000CFB10000CB3900002008001F42\r
+:1003F0009880000008880001CC1C0016C9F0001B82\r
+:100400009700FFFF000000008800000000000000CF\r
+:1004100000000000000000000000000000000000DC\r
+:1004200000000000000000000000000000000000CC\r
+:1004300000000000000000000000000000000000BC\r
+:1004400000000000000000000000000000000000AC\r
+:10045000000000000000000000000000000000009C\r
+:10046000000000000000000000000000000000008C\r
+:10047000000000000000000000000000000000007C\r
+:10048000000000000000000000000000000000006C\r
+:10049000000000000000000000000000000000005C\r
+:1004A000000000000000000000000000000000004C\r
+:1004B000000000000000000000000000000000003C\r
+:1004C000000000000000000000000000000000002C\r
+:1004D000000000000000000000000000000000001C\r
+:1004E000000000000000000000000000000000000C\r
+:1004F00000000000000000000000000000000000FC\r
+:1005000000000000000000000000000000000000EB\r
+:1005100000000000000000000000000000000000DB\r
+:1005200000000000000000000000000000000000CB\r
+:1005300000000000000000000000000000000000BB\r
+:1005400000000000000000000000000000000000AB\r
+:10055000000000000000000000000000000000009B\r
+:10056000000000000000000000000000000000008B\r
+:10057000000000000000000000000000000000007B\r
+:10058000000000000000000000000000000000006B\r
+:10059000000000000000000000000000000000005B\r
+:1005A000000000000000000000000000000000004B\r
+:1005B000000000000000000000000000000000003B\r
+:1005C000000000000000000000000000000000002B\r
+:1005D000000000000000000000000000000000001B\r
+:1005E000000000000000000000000000000000000B\r
+:1005F00000000000000000000000000000000000FB\r
+:1006000000000000000000000000000000000000EA\r
+:1006100000000000000000000000000000000000DA\r
+:1006200000000000000000000000000000000000CA\r
+:1006300000000000000000000000000000000000BA\r
+:1006400000000000000000000000000000000000AA\r
+:10065000000000000000000000000000000000009A\r
+:10066000000000000000000000000000000000008A\r
+:10067000000000000000000000000000000000007A\r
+:10068000000000000000000000000000000000006A\r
+:10069000000000000000000000000000000000005A\r
+:1006A000000000000000000000000000000000004A\r
+:1006B000000000000000000000000000000000003A\r
+:1006C000000000000000000000000000000000002A\r
+:1006D000000000000000000000000000000000001A\r
+:1006E000000000000000000000000000000000000A\r
+:1006F00000000000000000000000000000000000FA\r
+:1007000000000000000000000000000000000000E9\r
+:1007100000000000000000000000000000000000D9\r
+:1007200000000000000000000000000000000000C9\r
+:1007300000000000000000000000000000000000B9\r
+:1007400000000000000000000000000000000000A9\r
+:100750000000000000000000000000000000000099\r
+:100760000000000000000000000000000000000089\r
+:100770000000000000000000000000000000000079\r
+:100780000000000000000000000000000000000069\r
+:100790000000000000000000000000000000000059\r
+:1007A0000000000000000000000000000000000049\r
+:1007B0000000000000000000000000000000000039\r
+:1007C0000000000000000000000000000000000029\r
+:1007D0000000000000000000000000000000000019\r
+:1007E0000000000000000000000000000000000009\r
+:1007F00000000000000000000000000000000000F9\r
+:1008000000000000000000000000000000000000E8\r
+:1008100000000000000000000000000000000000D8\r
+:1008200000000000000000000000000000000000C8\r
+:1008300000000000000000000000000000000000B8\r
+:1008400000000000000000000000000000000000A8\r
+:100850000000000000000000000000000000000098\r
+:100860000000000000000000000000000000000088\r
+:100870000000000000000000000000000000000078\r
+:100880000000000000000000000000000000000068\r
+:100890000000000000000000000000000000000058\r
+:1008A0000000000000000000000000000000000048\r
+:1008B0000000000000000000000000000000000038\r
+:1008C0000000000000000000000000000000000028\r
+:1008D0000000000000000000000000000000000018\r
+:1008E0000000000000000000000000000000000008\r
+:1008F00000000000000000000000000000000000F8\r
+:1009000000000000000000000000000000000000E7\r
+:1009100000000000000000000000000000000000D7\r
+:1009200000000000000000000000000000000000C7\r
+:1009300000000000000000000000000000000000B7\r
+:1009400000000000000000000000000000000000A7\r
+:100950000000000000000000000000000000000097\r
+:100960000000000000000000000000000000000087\r
+:100970000000000000000000000000000000000077\r
+:100980000000000000000000000000000000000067\r
+:100990000000000000000000000000000000000057\r
+:1009A0000000000000000000000000000000000047\r
+:1009B0000000000000000000000000000000000037\r
+:1009C0000000000000000000000000000000000027\r
+:1009D0000000000000000000000000000000000017\r
+:1009E0000000000000000000000000000000000007\r
+:1009F00000000000000000000000000000000000F7\r
+:100A000000000000000000000000000000000000E6\r
+:100A100000000000000000000000000000000000D6\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/JUNIPER_me.bin.ihex b/firmware/radeon/JUNIPER_me.bin.ihex
new file mode 100644 (file)
index 0000000..937b5af
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000040CA1FDC0120001CC000045CC00004A97\r
+:1001C0007CD0C007CC41225CCC41A1FCD44D0000C6\r
+:1001D0007C408000A0000000CC80004D800000002A\r
+:1001E000CC41225DCC000045CC00004A084C000107\r
+:1001F0007C4100007C4140001D58FFFF195C03F06A\r
+:1002000015600015CD81A102CDC12256CE01225C20\r
+:1002100094C0000521240020CE41A1FC8000007D77\r
+:1002200008CC0001CD01A1FCCC01A1027C408000E2\r
+:10023000A0000000CC80004D7C4080007C40C000CD\r
+:10024000C02A00027C4100007D2900071C940001A7\r
+:100250001C9800061C9C030015DC00087C42000072\r
+:100260007C4240009540000FC02E000405F022584B\r
+:100270007F2F0007CC310000C8280004CCC12169C1\r
+:10028000CD01216ACE81216B29B40002CC01216C01\r
+:100290009740000E29B40000800000BDC834000E55\r
+:1002A00029B400029740000929B40000C02E0004C0\r
+:1002B00005F022587F2F0007CC310000C828000429\r
+:1002C000800000BDC834000E974000047E0280000C\r
+:1002D000800000BDC834000E29B400049740FF49D7\r
+:1002E00000000000CE01216DCE41216EC828000320\r
+:1002F000C834000E9B400004C83C000E8400034E2E\r
+:10030000CC00004D29F40000974000070430A2B64D\r
+:10031000840000DFCE81A2B7CF81A2C4800000009C\r
+:10032000CFC1A2D129F40001974000070430A2BA3E\r
+:10033000840000DFCE81A2BBCF81A2C58000000077\r
+:10034000CFC1A2D229F40002974000070430A2BE18\r
+:10035000840000DFCE81A2BFCF81A2C68000000052\r
+:10036000CFC1A2D30430A2C2840000DFCE81A2C3D9\r
+:10037000CF81A2C780000000CFC1A2D4C02E00044C\r
+:100380007F2F0007CC310000C82C0004C0300006CD\r
+:100390007EF34023C03000207F6B80208800000067\r
+:1003A0007FB3C024CC00004280000000CC40001F7E\r
+:1003B0007C40C0007C4100001914003D99400013AE\r
+:1003C0000414002E840004DA041800298400025A60\r
+:1003D000C81C00130414002A840004DA0418002D39\r
+:1003E000CD41A2A4C81C001395C00000C81C001376\r
+:1003F000CCC12100CD012101CCC12102CD012103BD\r
+:10040000800004D7CD81A2A41D181000958000059E\r
+:10041000C81C001329E400409640FFFFC81C0013CD\r
+:10042000CCC12175CD012176C820001496000000B2\r
+:10043000C8200014162800019A800004CC00004F48\r
+:10044000800004D7CC00007F80000109CCC1217559\r
+:100450007C40C0007C410000CC000045CC00004A3C\r
+:1004600040D40003CD41225CCD01A1FCC01A0001A3\r
+:10047000041CA1FD7DD9C0077C42000008CC00010E\r
+:100480000624000106280002CE1D0000CE5D0000FB\r
+:1004900098C0FFFACE9D00007C408000A0000000C4\r
+:1004A000CC80004D7C40C0001CD0000114CC000169\r
+:1004B0007C414000950000067C418000CD41216DCB\r
+:1004C000CD81216E80000137C81C0003C0220004CA\r
+:1004D0007E160007CC210000C81C00047C424000AE\r
+:1004E00098C000047C42800080000000CDE5000040\r
+:1004F000CE412169CE81216ACDC1216B80000000EF\r
+:10050000CC01216C7C40C0007C4100007C4140005B\r
+:100510007C4180007C41C00018A41FE82A68003C90\r
+:100520009680000A7C0200007C4200003A30000302\r
+:10053000CC0000589B00000342200005042000402E\r
+:10054000800001537C0240007E0240009A4000007F\r
+:100550000A6400011CEC00109AC0000ACC00004D97\r
+:10056000C02A0004C82C00207E928007CC000041E5\r
+:10057000CC290000CEC0001E80000163C8300004FA\r
+:10058000CD01216DCD41216EC83000037F1F0006D3\r
+:100590001CF40007137800019740002A07B801688F\r
+:1005A0009F80000000000000800001787F1B800E0B\r
+:1005B0008000017C7F1B800F800001807F1B800CEE\r
+:1005C000800001847F1B800D800001887F1B8011CB\r
+:1005D0008000018C7F1B80108000019114A4000812\r
+:1005E0009B80001914A40008800001A11E6400FF74\r
+:1005F0009B80001514A40008800001A11E6400FF68\r
+:100600009B80001114A40008800001A11E6400FF5B\r
+:100610009B80000D14A40008800001A11E6400FF4F\r
+:100620009B80000914A40008800001A11E6400FF43\r
+:100630009B80000514A40008800001A11E6400FF37\r
+:1006400014A400081E6400FF2A68003C9A80FE6D16\r
+:1006500014EC00087C4340007C4380007C43C000D5\r
+:1006600096C00007CC00004DCF412169CF81216A9F\r
+:10067000CFC1216B80000000CC01216C8000000004\r
+:10068000CFF50000CC000059840004DA2A68003C51\r
+:100690009A800004C828001780000000D440007F22\r
+:1006A0009680FFAB7E0240008400028CC00E0002E8\r
+:1006B000CC000041800001AFCCC1304A9400000062\r
+:1006C000C83C001C7C40C0007C410000C01E0001F2\r
+:1006D00015240012C022000296400005C026000426\r
+:1006E000C027FFFB7D250006C02600007DD28006C6\r
+:1006F0007E12C0067D2500077C4140007C418000C1\r
+:10070000CCC121699A80000CCD01216ACD41216BB9\r
+:1007100096C0FE3CCD81216C840004DACC00007FC1\r
+:10072000C830001A97000000C830001A800000018D\r
+:100730007C408000840004DACC00007FC8140015DF\r
+:10074000C8180016CD41216B96C0FE2ECD81216CBC\r
+:10075000800001C6CC00007FCC0003E5C82C00203F\r
+:10076000C00E20240410300020CC226B0414300171\r
+:10077000CC000041D0110000CCD50000CEC0001E3E\r
+:10078000C80C000998C00000C80C00097C4100009A\r
+:100790007C414000CC400043CC400044C00E80006F\r
+:1007A0007C4240007C42800016AC001F96C0FE15C3\r
+:1007B000C035F000CE4003E11E780003127C000833\r
+:1007C0007FF7C0067FFBC00716780018CFC003E292\r
+:1007D000CF8003E312B000027F3F0000CF0003E4AC\r
+:1007E000800004637C80C0007C40C00018D001E819\r
+:1007F000112800019500001006A801FF9E8000004E\r
+:100800000000000080000217C012080080000225CE\r
+:10081000C81400118000022CC8140012800002339A\r
+:10082000CCC1A2A48000023C1CE8003F800002640E\r
+:100830007CC1800B1CD0003F29280006292C001603\r
+:100840007EAE8007C81C00139A80003D0414002E61\r
+:1008500080000000CCC1A2A4C01208007C4140006E\r
+:100860007D0CC007C012000815580003155C000C71\r
+:100870007C4200007DD1C006122000147E1E40077D\r
+:100880007E4E8007CE81A2A480000000CD81A1FE13\r
+:10089000C81400110410211895400000C81400115C\r
+:1008A000D451000080000000CCC1A2A4C8140012E2\r
+:1008B0000410210695400000C8140012D451000015\r
+:1008C00080000000CCC1A2A4CCC1A2A404100001ED\r
+:1008D000CD000019840004DACC00007FC810001B92\r
+:1008E00099000000C810001B800000017C408000BF\r
+:1008F0002AA000042AA400147E2600070414002E57\r
+:1009000096000008041800298400025AC81C00132D\r
+:100910000414002A840004DA040C002DCD41A2A4A2\r
+:1009200004102100C81C001395C00000C81C00134F\r
+:10093000D4510000800004D7CCC1A2A4840004DA02\r
+:10094000041800298400025AC81C00130414002A49\r
+:10095000840004DA0418002D8400025AC81C001315\r
+:10096000800000017C40800095C00000C81C00137E\r
+:10097000CD41A2A4CC012100CC012101CD812102D5\r
+:10098000CD812103CD81A2A488000000CC00004DC0\r
+:100990001D9800017C4100007C41400099800009C5\r
+:1009A0007C420000C83C003211980010C81C000BAB\r
+:1009B0003BFC000197C0FFFFC83C0032800002767C\r
+:1009C000C83C003311980010C81C000A3BFC000111\r
+:1009D00097C0FFFFC83C00331568001D7D594007D4\r
+:1009E0009A80000411E4000A7E260007CDC000664C\r
+:1009F000CD012158CD412159CE01215ACCC1A2A40B\r
+:100A00009A80025705100004042C000112F0001D0A\r
+:100A10007D71400712E000102220000CCD0121580A\r
+:100A2000CD412159CE01215A800004D7CCC1A2A4C6\r
+:100A3000043C0005CFC1A2A4C0360002880000001B\r
+:100A4000CF4120107C40C00014D0001D9900000848\r
+:100A500014D4001C9540FD6BC02600042264215470\r
+:100A6000CC25000080000000C8280004800004D7C6\r
+:100A7000CD400061840004DA7C4140001D74000117\r
+:100A80001C7800029B400003C80C00298400034D21\r
+:100A9000155400109B8000030410001084000371A3\r
+:100AA000CCC1A250CD01A050840002FE0418040065\r
+:100AB000840004DACC000063C83C002D8400030CE1\r
+:100AC000C8100029C81C002F1DDC0001C824002705\r
+:100AD00095C0000CC8340031C8380030C83C002D27\r
+:100AE00017FC001013FC00107FD7C00753740020C0\r
+:100AF0007FB7802747B80550CC000062CFFA0000CE\r
+:100B00009A400000C8240027C0300001C8280024F3\r
+:100B10009A800000C8280024CF00005B50D800084D\r
+:100B200014DC001821DC8000CD812180CDC1218121\r
+:100B30005120000815240018CE012182CE412183C6\r
+:100B4000CD4121847C408000A0000000CC80004D7D\r
+:100B5000840004DA7C4140001D7400011C7800020E\r
+:100B60009B400003C80C002A8400034D155400105C\r
+:100B70009B8000030410001084000371CCC1A260AC\r
+:100B8000CD01A060840002FE04180980840004DA0C\r
+:100B9000CC000064C83C002E8400030CC810002A5E\r
+:100BA000C81C002F1DDC0001C824002895C0000CC3\r
+:100BB000C8340031C8380030C83C002E17FC001083\r
+:100BC00013FC00107FD7C007537400207FB7802725\r
+:100BD00047B80554CC000062CFFA00009A400000EC\r
+:100BE000C8240028C82800259A800000C8280025AD\r
+:100BF000800002C6C03000020598C00010DC00086A\r
+:100C000014E00018CDD90000C81C0022C82400221E\r
+:100C10001DDC0FFFCDD900017E624007CE590002D6\r
+:100C2000D8185103D818510488000000D81851076B\r
+:100C30001BF800F0C036080097800003C030008029\r
+:100C400088000000C02A0004CF41217CCF01217D13\r
+:100C5000CD01217E22A8217F042400089A400000B3\r
+:100C60000A640001CC290000C82000041638001FC7\r
+:100C70009B80FFFB042400088800000000000000A7\r
+:100C8000C80C002494C0002438D400019940FFFD12\r
+:100C9000C81000237D0D00019900FFFBC80C002443\r
+:100CA00080000331C80C002594C0001B38D400011B\r
+:100CB0009940FFFDC81000237D0D00019900FFFB46\r
+:100CC000C80C0025840004DACC00007FC83C03FB7C\r
+:100CD0009BC00000C83C03FBD04003FCC03E0004A6\r
+:100CE000D20121F823FC21F9840004DACC3D000074\r
+:100CF000C83800041BB4003E1FB000047F02C00BC4\r
+:100D00001EE800047EB640079A40FFF6C03E00048D\r
+:100D1000D00003FC7C410000800000017C4080008A\r
+:100D20008400034D7C40C0007C408000A000000097\r
+:100D3000CC80004DC83C000E97C00003D30003E6F2\r
+:100D400088000000043C0026CFC1A2A4C83C03E6F2\r
+:100D50000BFC0001CFC003E69BC0FFFBCC00004DA5\r
+:100D6000C83C03E597C0000CC83C001397C00000C6\r
+:100D7000C83C0013043C2100CC3D0000CC3D0000E9\r
+:100D8000CC3D0000CC3D0000043C0029CFC1A2A412\r
+:100D9000CC80004D043C0005CFC1A2A4CC01A1F43D\r
+:100DA000840004DACC00004788000000CC00007FFB\r
+:100DB000840003717C40C0007C408000A0000000E3\r
+:100DC000CC80004D043C0022CFC1A2A4840004DAF0\r
+:100DD000CC00004888000000CC00007F8400037C29\r
+:100DE0007C40C0007C408000A0000000CC80004D12\r
+:100DF000C83C03E597C0000CC83C001397C0000036\r
+:100E0000C83C0013043C2100CC3D0000CC3D000058\r
+:100E1000CC3D0000CC3D0000043C0029CFC1A2A481\r
+:100E2000CC80004D043C0023CFC1A2A4CC01A1F38F\r
+:100E3000840004DACC00004988000000CC00007F68\r
+:100E4000800000007C40C000800000007C40C000AA\r
+:100E5000C01200017C51400780000000D455000002\r
+:100E6000840004DACC400065C81C0025C824002496\r
+:100E70007DE5C00799C0FFFEC81C00258000000169\r
+:100E80007C4080007C40C0007C4100007C414000F0\r
+:100E90007C418000151C001FCCC000C7CD0000C8DD\r
+:100EA00095C00003C01C8000CDC12010E18300006C\r
+:100EB000055C2000CC00004D80000000DC1F4100DC\r
+:100EC0007C40C0007C4100007C4140007C418000AF\r
+:100ED000CCC000C9CD0000CAE1830000055CA000C1\r
+:100EE00080000000DC1F41007C40C0007C4100000D\r
+:100EF0007C4140007C418000CCC000CBCD0000CCC8\r
+:100F0000E1830000055CE94080000000DC1F410037\r
+:100F10007C40C0007C4100007C4140007C4180005E\r
+:100F2000CCC000CDCD0000CEE1830000055CE880A0\r
+:100F300080000000DC1F41007C40C0007C410000BC\r
+:100F40007C4140007C418000CCC000CFCD0000D06F\r
+:100F5000E1830000055CC00080000000DC1F410050\r
+:100F60007C40C0007C4100007C4140007C4180000E\r
+:100F7000CCC000D1CD0000D2E1830000055CF000C0\r
+:100F800080000000DC1F41007C40C0007C4100006C\r
+:100F90007C4140007C418000CCC000D3CD0000D417\r
+:100FA000E1830000055CF3FC80000000DC1F4100D1\r
+:100FB000D44320007C408000A0000000CC80004D85\r
+:100FC000D443A0007C408000A0000000CC80004DF5\r
+:100FD000D443E9407C408000A0000000CC80004D5C\r
+:100FE000D443E8807C408000A0000000CC80004D0D\r
+:100FF000D443C0007C408000A0000000CC80004DA5\r
+:10100000D443F0007C408000A0000000CC80004D64\r
+:10101000D443F3FC7C408000A0000000CC80004D55\r
+:10102000041CA000CC43A0007C40C000D81FC1001D\r
+:101030007C408000A0000000CC80004D041CC0005B\r
+:10104000CC43C0007C40C000D81FC1007C40800061\r
+:10105000A0000000CC80004D7C40C000C8130002FE\r
+:1010600094C00003C8170002C81B0002041CF3FC54\r
+:10107000CC03F3FCD81FC100D81FC1007C40800006\r
+:10108000A0000000CC80004DC8280026C82C0028F5\r
+:101090002AB000FF2AF400FF7F7380079B80FFFBCC\r
+:1010A000C01E0010C80C002950D0000810540002C7\r
+:1010B0008000043A7D158020C8280026C82C00270F\r
+:1010C0002AB000FF2AF400FF7F7380079B80FFFB9C\r
+:1010D000C01E0020C80C002A50D00008085404008C\r
+:1010E000115400027D518020CDC00062D45A00000E\r
+:1010F0007C408000A0000000CC80004D7C40C000FF\r
+:101100001CD00003112800019500000A06A8044421\r
+:101110009E8000007C418000800004527C41C00021\r
+:10112000800004587C41C0008000045E7C41C00007\r
+:101130007C4180007C41C00014D400100554A00004\r
+:1011400080000000CD950000C02200040598A0009A\r
+:101150007DA18007CC1900008000044EC81800044F\r
+:10116000C0220004CD8125D6222025D7CC21000025\r
+:101170008000044EC8180004CD81216DCDC1216EC0\r
+:101180008000044EC81800037C40C000C81003E172\r
+:10119000C81403E4C81803E2C81C03E3CD81216925\r
+:1011A000CDC1216ACCC1216BCC01216C042000048B\r
+:1011B0007DA180007D96400C9640FB92CD8003E29D\r
+:1011C0001D280003C02DF000111800087DAD800619\r
+:1011D0007DA9800780000000CD8003E27C40C00034\r
+:1011E00080000000CC4C03E01C8CFFFFD44D0000BD\r
+:1011F0007C408000A0000000CC80004DC81400237B\r
+:10120000315800049580FFFFC8140023CC00005B18\r
+:10121000CC412180204C8000CCC1218114D0001F02\r
+:10122000CC412182CC4121839500FB76CC412184A5\r
+:10123000C81400239940FFFFC81400238000000158\r
+:101240007C408000C016000421542140CC55000091\r
+:10125000C818000480000000CC0003E0C02A00048D\r
+:101260007C40C000CCC1217CCC41217DCC41217E81\r
+:101270007C41800014FC001F1D98FFFF39B0000363\r
+:1012800022A0217F9B000003419C0005041C00401C\r
+:1012900099C0000009DC0001CC210000C824000432\r
+:1012A000166C001F419C00059AC0FFFACC80004DCF\r
+:1012B0009BC0FB540000000080000000CC0003E055\r
+:1012C0007C40C0007C4100001518001F5114002014\r
+:1012D00099800012191C0031C8280027C82C00284A\r
+:1012E0002AB000FF2AF400FF7F7380079B80FFFC79\r
+:1012F000C8280027CD0000627D4D4027D45600004D\r
+:1013000095C0FB40C82000269A000000C820002697\r
+:10131000800000017C408000E03A0000C02600040C\r
+:10132000CCC121697D250007CD01216A0BB80002DF\r
+:10133000CC41216B9B80FFFECC41216C99C0FCF716\r
+:10134000CC00007F800000017C408000C00E0100C6\r
+:10135000CC000041CCC1304AC83C007FCC00007FAB\r
+:1013600080000000CC00007FCC00007F88000000DF\r
+:10137000CC00007F00000000000000000000000022\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001047A00100003001200050015001A04\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007700300079003200EA0034008E6F\r
+:1014500000350062003900EC003A0114003B01291C\r
+:10146000003C0141003D01B1003F00E90041047F23\r
+:101470000042049100430497004401D60045014115\r
+:10148000004601FA004701FA004801FA004A0291B9\r
+:10149000004B0390004C029D004D02D4004E0320EF\r
+:1014A000004F032900510377005203480053036C97\r
+:1014B0000054039200570394006003A1006103B03D\r
+:1014C00000620398006303BA006403C4006503CE9E\r
+:1014D000006603D8006703E2006803EC006903F0CC\r
+:1014E000006A0422006B03F4006C03F8006D03FC37\r
+:1014F000006E0400006F0404007003FC0071042EF1\r
+:1015000000720416007304080074040F0075043F91\r
+:10151000007A04B0007C0462007D0477000F04D3DD\r
+:10152000000F04D3000F04D3000F04D3000F04D323\r
+:10153000000F04D3000F04D3000F04D3000F04D313\r
+:10154000000F04D3000F04D3000F04D3000F04D303\r
+:10155000000F04D3000F04D3000F04D3000F04D3F3\r
+:10156000000F04D3000F04D3000F04D3000F04D3E3\r
+:10157000000F04D3000F04D3000F04D3000F04D3D3\r
+:00000001FF\r
diff --git a/firmware/radeon/JUNIPER_pfp.bin.ihex b/firmware/radeon/JUNIPER_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..220aa38
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC400029800003ADCC40002A77\r
+:100040009900000500000000CC40002B800003ADAB\r
+:10005000CC40002CCC40002D800003ADCC40002EC5\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:10007000800003ADCC000052800003ADCC000054E2\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000043F3\r
+:1000E000CD400043C81C001DD100004399C000054D\r
+:1000F000CC000055C820001FD80003C0CC00004031\r
+:10010000C8280016D80006C01AA800279680000349\r
+:10011000CC000040D080005CCC800040CC0000408F\r
+:10012000CC4000407C408000A0000000042800017A\r
+:10013000C810002CC80C002B511000207CD0C02708\r
+:100140007CC5002045180008C99E0000C82403FD96\r
+:100150007DE68011968000037E5EC0017C02C006B1\r
+:10016000CEC3A29E55140020CC00006CCD00006DC3\r
+:10017000CD40006DCD000043CD400043C81C001DA4\r
+:10018000D140004399C00005CC000055C820001F95\r
+:10019000D80003C0CC000040C8280016D80006C014\r
+:1001A0001AA8002796800003CC800040D080005C15\r
+:1001B000CC800040CC000040CC400040C83521A39A\r
+:1001C0001B7807F02BB400089740FFFDC83803FCEC\r
+:1001D0009B800000C83803FC840003B0D04003FBC0\r
+:1001E000C83803FC9B80FFFB043C001BCC00005B79\r
+:1001F000840003B0CFC121F8C83921F91BB40078BD\r
+:100200009B40FFFCCC00005BD00003FB7C408000E7\r
+:10021000A000000004280001C81800151D98000166\r
+:100220007C424000958003227C428000C81C002054\r
+:10023000C037C0007C40C0007C4100007CB4800618\r
+:10024000C036000399C00000C81C00207CB48007A1\r
+:1002500010D400027D654000CD400043CE800043B5\r
+:10026000CD000043CC800040CE400040CE80004016\r
+:10027000CCC00040E03A00009780FF62CD00004013\r
+:100280007C40C000800000947C4100001C8C000277\r
+:10029000C810001C98C00009C820001F9900000465\r
+:1002A000C81C0006840003B3CC000052C818001517\r
+:1002B000800000881D980002C810001E9900FFFCF5\r
+:1002C000C81C0008840003B3CC000054C8180015F3\r
+:1002D000800000881D9800021C8C0002C810001DC0\r
+:1002E00098C0000FC814004999000005C820001FDD\r
+:1002F000C81C0007840003B3CC000053C8180015C5\r
+:1003000094C00003189401E8055400062010000171\r
+:100310007D150003800000887D9180069940FFF8DC\r
+:10032000C820001F840003B3C81C0007800000BF62\r
+:10033000CC00006EC00E8080CC00006704D08080AE\r
+:10034000CC000068CD0003F1CD0003F2CD0003F333\r
+:10035000CD0003F4CD0003F6CD0003F7CD0003F884\r
+:1003600080000005CD0003F9CC800040D44000405F\r
+:100370007C408000A000000004280001C820001F6D\r
+:10038000800000E4D8000440C820001FD8000340CB\r
+:10039000CC000040CC800040D44000407C40800035\r
+:1003A000A000000004280001C820001FD80003C0DE\r
+:1003B000800000F4CC000040C820001F800000F343\r
+:1003C000D8000440C820001FD8000340CC000040E3\r
+:1003D000C80C0029C810002ACC800040CC40004046\r
+:1003E000511000207CD0C027105000027D0D00204D\r
+:1003F00055140020CD000043CD400043D0400043C1\r
+:10040000CC0000407C408000A000000004280001D7\r
+:10041000C820001FD80003C0CC000040CC800040A2\r
+:10042000D44000407C408000A0000000042800016F\r
+:100430001C8C0002C810001D98C00012C81400498E\r
+:1004400099000005C820001FC81C0007840003B3E2\r
+:10045000CC000053C80C002FCC800040CC400040A2\r
+:10046000CC400040CC4000407CC4C000CCC0004028\r
+:10047000D44000407C408000A0000000042800011F\r
+:100480009940FFF5C820001F840003B3C81C000773\r
+:1004900080000115CC00006E7C40C000C8100047F1\r
+:1004A0001CDC03FF1894FFF09900000F7D5D4000F5\r
+:1004B000C818004499800004C8180009CD80004085\r
+:1004C000CC0000408000015DC81803F07C40C000F3\r
+:1004D000C81000471CDC03FF1894FFF09500FFF5DF\r
+:1004E0007D5D4000C818004599800004C818000AC6\r
+:1004F000CD800040CC000040C81803F51D9C0003CF\r
+:1005000015980002C9A403F611DC00037E5E800486\r
+:100510001EA800FF05540007155400037D6AC01093\r
+:1005200096C00008042C00FF7EDEC0037EC2C00B14\r
+:100530007E6E40067D5D40037E564007CE5803F632\r
+:10054000D8000840CCC00040D44000407C4080002F\r
+:10055000A0000000042800017C40C000C810004733\r
+:100560001CDC03FF1894FFF09900FFE47D5D400060\r
+:10057000C81803F01D9C000315980002C9A403F1DC\r
+:1005800011DC00037E5E80041EA800FF05540007F6\r
+:10059000155400037D6AC01096C00008042C00FFAB\r
+:1005A0007EDEC0037EC2C00B7E6E40067D5D4003D2\r
+:1005B0007E564007CE5803F1CC800040CCC00040AE\r
+:1005C000D44000407C408000A000000004280001CE\r
+:1005D000C8100046C81803F0059800011D98000FC8\r
+:1005E000CD8003F01D9C000319980062C9A403F19B\r
+:1005F00011DC0003042C00FF7EDEC0037EC2C00BB2\r
+:100600007E6E4006CE5803F104180000041C000062\r
+:10061000840001C1C9E403F1840001C1C9E403F10C\r
+:10062000840001C1C9E403F1840001C1C9E403F1FC\r
+:100630007D210007D8000740CD000040840001B6AE\r
+:10064000CD000040C80C004394C00022C8140048EC\r
+:100650008000019704100003C8100046C81803F575\r
+:10066000059800011D98000FCD8003F51D9C000327\r
+:1006700019980062C9A403F611DC0003042C00FFE2\r
+:100680007EDEC0037EC2C00B7E6E4006CE5803F6EF\r
+:1006900004180000041C0000840001C1C9E403F632\r
+:1006A000840001C1C9E403F6840001C1C9E403F672\r
+:1006B000840001C1C9E403F67D210007D80007C00A\r
+:1006C000CD000040840001B6CD000040C8140048B1\r
+:1006D0009D400000CC00006AC82800161EA800013A\r
+:1006E0009A800003C029000188000000C02C015638\r
+:1006F000CE80005CD80008C0CEC00040880000005A\r
+:10070000CC0000401E6800FF7E9BC01097C0000315\r
+:100710001A6C1FE87E8180007EDBC01097C000034A\r
+:100720001A701FF07EC180007F1BC01097C00003AD\r
+:100730001A741FF87F0180007F5BC01097C0000310\r
+:1007400005DC00017F41800011A000058800000049\r
+:10075000122000101C8C0002C810001EC820001FB0\r
+:1007600094C00008C814001C9900000AC81C0008A6\r
+:10077000840003B3CC000054800001E5CC8000402D\r
+:1007800099400004C81C0006840003B3CC0000524A\r
+:10079000CC80004080000000D4400040CC400027C6\r
+:1007A000CC400028800003ADCC00006BC0320003B9\r
+:1007B000C037FFFF800001F07CB080077C43400021\r
+:1007C000C8200028C81C0027C8180026CF43A29EB6\r
+:1007D0007C414000522000207DE1C0277D58C003AD\r
+:1007E0007CDCC02054D0002080000205CC8000407A\r
+:1007F0007C418000CC80004080000202CD8000401F\r
+:10080000C019FFFFCC800040CD83A29E7C40C00079\r
+:100810007C4100007C414000CCC3A1FACD03A1F98A\r
+:10082000CD43A29DCCC00040CD000040CD40004053\r
+:10083000CC4000407C408000A00000000428000163\r
+:100840007C40C0001CD00001CCC3A29F95000003D7\r
+:10085000D0400026D0800026CC80004080000000E0\r
+:10086000CCC000407C40C000CC800040CCC3A2A2E1\r
+:1008700080000000CCC000407C40C00014D4001FA9\r
+:10088000CC800040954000037C410000CCC0005962\r
+:100890001518001FCCC0004095800003CD0000401B\r
+:1008A000CD00005A800003ADCC00007FC820001F9F\r
+:1008B0007C410000D8200244CE2000447C4140000E\r
+:1008C0007C418000CDA00049CD200041CD60004199\r
+:1008D000CDA0004115100008115400187D53C00729\r
+:1008E000CFC0002F06200001CE000058800003ADCD\r
+:1008F000CC00007FC820001FCA0C001794C0000560\r
+:100900007C410000D82002C68000022FCE20004685\r
+:10091000CC0000488000024500000000C820001FF5\r
+:100920007C4180000A200001CA14001ACA1800176E\r
+:100930007D59800795800005CE000058CCA0004668\r
+:1009400080000000CD600046CCA000448000000084\r
+:10095000CD600044800003ADCC40006ACC800040F4\r
+:1009600080000000D44000407C40C0007C4100007A\r
+:10097000CCC003FECD0003FFCCC00042CD0000423E\r
+:100980001514001F191800F0275C00017D76000681\r
+:10099000998000057D5E4006CC000042800003ADDA\r
+:1009A000CC00004D15980001152C00089980004DD1\r
+:1009B0001EEC0001960000041530000C800003AD11\r
+:1009C000CC00004204140020CD4000421F30000142\r
+:1009D00020280001840002ACC81400039B40002BB7\r
+:1009E0000438001C840002ACC81400039B4000279C\r
+:1009F00004380018840002ACC81400039B40002394\r
+:100A000004380014840002ACC81400039B40001F8B\r
+:100A100004380010840002ACC81400039B40001B83\r
+:100A20000438000C840002ACC81400039B4000177B\r
+:100A300004380008840002ACC81400039B40001373\r
+:100A400004380004840002ACC81400039B40001565\r
+:100A5000C80C03FE9A800009C81003FF9B00011612\r
+:100A6000CC00004D04140020CCC00042CD00004258\r
+:100A700080000274CD40004296C0010FCC00004DB2\r
+:100A8000800003ADCC00004E9AC00003CC00004DA6\r
+:100A9000CC00004EE383000080000000DC0301FF77\r
+:100AA0009AC00105CC00004D800003ADCC00004E83\r
+:100AB000C8180003C81C0003C82000037D5D400D5A\r
+:100AC0007DA1C00D7D5D40071610001F159C001F05\r
+:100AD0007D1D00067D174006880000007E9280067E\r
+:100AE00096400004CC00004E800003ADCC000042D4\r
+:100AF000D2000042C8080003C80C0003C81000035D\r
+:100B0000C8140003C8180003C81C0003C82400034D\r
+:100B1000C828000315FC001F16B0001F7FF3C00695\r
+:100B200014F0001F7FF3C0061570001F7FF3C0068E\r
+:100B30007D88800197C0000D7DCCC0017E510001F1\r
+:100B40007E9540017C90800C7CD4C00C9AC0000340\r
+:100B50007C8F400624B400019B4000D7CC00004DA0\r
+:100B6000800003ADCC00004EC80C03FEC81003FF8C\r
+:100B7000CCC00042800002BCCD0000427C40C000DE\r
+:100B80007C4100001914003BCC00005B9540001331\r
+:100B9000C8140040315800029580FFFFC81400407F\r
+:100BA000CC000063211C8000CCC12185CDC12186F1\r
+:100BB0001514001FCC412187CC4121889540FD119F\r
+:100BC000CC412189C81400409940FFFFC81400405F\r
+:100BD000800000017C408000CC800040CCC0004000\r
+:100BE000CD00004080000000D4400040D08003E0F1\r
+:100BF000CC800040840003B0CC400040C80C03E02F\r
+:100C000098C00000C80C03E07C408000A0000000F9\r
+:100C10007E8280067C40C0008400030E14D0001F3A\r
+:100C20009900FCF8D04003E0840003B0CC00007FC2\r
+:100C300080000300C80C03E0CC800040CCC0004022\r
+:100C400088000000D4400040CC800040CC400040F0\r
+:100C5000CC400040CC4000407C40C000CCC00021D3\r
+:100C6000CCC00040D4400040CC0003F0CC0003F1E5\r
+:100C7000CC0003F2CC0003F3CC0003F4CC0003F56A\r
+:100C8000CC0003F6CC0003F7CC0003F8CC0003F94A\r
+:100C9000C037FFFFD00003FBD00003FC8000000042\r
+:100CA000CF4003FD7C40C00014DC001D99C000074C\r
+:100CB000CC80004018DC003C99C0007FCCC00040D4\r
+:100CC000800003ADCC00006A18D8003CCD800066DF\r
+:100CD000CC00006A800003ADCCC000407C40C00066\r
+:100CE00050500020840003B0CC00005D7CD0C027B1\r
+:100CF000C820001FC8D60000994000087C4380002F\r
+:100D0000E3830000CFA0004F840003B0CC00005E5E\r
+:100D100080000000D440007F800003ADCC00005E66\r
+:100D2000840003B0CC00005DC820001F7C40C000E0\r
+:100D3000C036FF00C8100021C0303FFF7CF54006E0\r
+:100D40007D5180067D81800A998000087CF38006B1\r
+:100D5000E3830000CFA0004F840003B0CC00005E0E\r
+:100D600080000000D440007F800003ADCC00005E16\r
+:100D7000840003B07C40C00014DC000895C000195A\r
+:100D80001CDC00107C41000099C00004505400207D\r
+:100D900080000368C91D00007D150027C91E0000E2\r
+:100DA0007C4200007C4240007C4180007DE5C00622\r
+:100DB0007DE280119A80FC9341AC00059AC000004E\r
+:100DC0000AEC00011CDC001099C0000400000000C7\r
+:100DD0008000036BC91D00008000036BC91E00006A\r
+:100DE000CC800040CCC0004080000000D4400040D7\r
+:100DF000C820001FD8000340CC000040CC80004039\r
+:100E0000D44000407C408000A00000000428000185\r
+:100E1000C820001FD80003C0CC000040CC80004098\r
+:100E2000D44000407C408000A00000000428000165\r
+:100E30007C40C0001CD00006291000069900000765\r
+:100E4000C814001C99400005CC000052C81C0006C4\r
+:100E5000840003B3C820001FCC800040CCC00040F9\r
+:100E600080000000D44000407C40C0007C41000075\r
+:100E70001518001FCD00005B99800004511400205C\r
+:100E800080000000D44D00007D4D4027191C00312A\r
+:100E9000D456000095C0FC5BC82000419A000000B9\r
+:100EA000C8200041800000017C40800080000000DC\r
+:100EB000D440007FCC00007F80000000CC00007F89\r
+:100EC000CC00007F88000000CC00007FCDC0004037\r
+:100ED00088000000CC00004000000000000000007E\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003037C000403840005022B9C\r
+:10101000000600E2000700F100080104000900EAF0\r
+:10102000000A00DF000B00EE000C0126000D01336A\r
+:10103000000E0174000F0196001003AB0011000AAE\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025004C002601E7001702470018025542\r
+:101060000022033700230348002701FC0020025A16\r
+:101070000028021E002901EB002A0210002B0200AA\r
+:10108000002F02190032023D0034038C003501EFBD\r
+:1010900000390257003C035C003E03AB003F022BCB\r
+:1010A000004102DF004202FB00430305004403123B\r
+:1010B000004A03290055037F00560387006000861D\r
+:1010C000006100A3006200CD006300B6006400B6BA\r
+:1010D000006500B6006600B6006700B6006800DA7A\r
+:1010E000006900E5006A0156006B0107006C01070A\r
+:1010F000006D0107006E0107006F01070070010C11\r
+:10110000007300F4007400F4007501D5007B039AAD\r
+:1011100000000005000000050000000500000005BB\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/JUNIPER_rlc.bin.ihex b/firmware/radeon/JUNIPER_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..9cc48c4
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B8000004A0000000061\r
+:10003000CC00000ECC00000EC8100082202801C3A6\r
+:10004000201C0000C8100082C80800857F8B800734\r
+:10005000C808008194800030000000008000005437\r
+:1000600000000000C9CC008394C00017000000000D\r
+:1000700084000097200C0001840000AA20380000B2\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001A988000063A\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000BD11B8001F840000AAD5\r
+:1000D0002038000184000097200C0000C03001C0CF\r
+:1000E000CB3900002038000095C0FFD3CF8000033B\r
+:1000F0007DC1C006840000BD203800008000000DD6\r
+:10010000CF80000320380001CF800003C810008298\r
+:10011000CC000081C808001A9480000E0000000086\r
+:10012000CD80000E00000000840000A820380002EE\r
+:10013000CC310000840000AA20380001CD8000816D\r
+:1001400084000097200C00008000000D00000000DB\r
+:10015000C83800569B80006B201C0000C838005730\r
+:100160009B800068201C0001201C0000C808008142\r
+:100170009480001200000000C82800009680000F44\r
+:1001800020080001CD80000ECC8000001C1C000067\r
+:100190002A8801BB9480000400000000800000B8A1\r
+:1001A000000000002A8801BC988000440000000084\r
+:1001B0009500002300000000C82800029680000679\r
+:1001C00020080001CD80000ECC8000028000008F4E\r
+:1001D00000000000C8280001968000070000000011\r
+:1001E00020080001CD80000ECC8000018000008F2F\r
+:1001F00000000000C82800039680000900000000ED\r
+:10020000CD80000E2A8C01E598C0FF9720080001E0\r
+:10021000CC8000038000008F00000000C82800048C\r
+:100220009680FF850000000020080001CD80000EB0\r
+:10023000CC8000048000008F000000008400009348\r
+:10024000000000008000000D000000001EA800FF5C\r
+:10025000CE80000C8800000000000000C030039039\r
+:10026000CB390000C00BFFFE7F8B800610CC001046\r
+:100270007F8F8007CFB1000088000000CB390000DD\r
+:10028000CFB10000CD80000ECB39000017B80004BC\r
+:100290009780FFFE000000008800000000000000C2\r
+:1002A000800000A0C03001C1C0302003CFB10000E9\r
+:1002B00088000000CB390000C9F800839B8000044F\r
+:1002C000000000008000000D00000000CC1C008336\r
+:1002D000840000BD11B8001F8000000D0000000068\r
+:1002E000CD9C0083840000BD203800009500FF54A1\r
+:1002F00000000000C03001C088000000CFB1000045\r
+:1003000099C0000BC830004023300002CF000040ED\r
+:10031000840000D520380003C83000401F3003FDA2\r
+:10032000CF00004080000054CC000056C830004090\r
+:1003300023300040CF000040840000E62038000158\r
+:10034000C83000401F3003BFCF0000408000005481\r
+:10035000CC000056840000F100000000C0302008EE\r
+:10036000840000F92038FFFFC0302008CC310000A5\r
+:10037000CB390000C0300398840000F92038010018\r
+:10038000C0300398CC310000CB090000C03021B64A\r
+:1003900088000000CC310000840000F10000000063\r
+:1003A00020380001C0300398840000F913B800140D\r
+:1003B000CC000057C0300398CC310000880000000A\r
+:1003C000CB090000CF9C0016CD80000EC9F00018AC\r
+:1003D0007F38800C9480FFFE000000008800000041\r
+:1003E00000000000CFB10000CB3900002008001F42\r
+:1003F0009880000008880001CC1C0016C9F0001B82\r
+:100400009700FFFF000000008800000000000000CF\r
+:1004100000000000000000000000000000000000DC\r
+:1004200000000000000000000000000000000000CC\r
+:1004300000000000000000000000000000000000BC\r
+:1004400000000000000000000000000000000000AC\r
+:10045000000000000000000000000000000000009C\r
+:10046000000000000000000000000000000000008C\r
+:10047000000000000000000000000000000000007C\r
+:10048000000000000000000000000000000000006C\r
+:10049000000000000000000000000000000000005C\r
+:1004A000000000000000000000000000000000004C\r
+:1004B000000000000000000000000000000000003C\r
+:1004C000000000000000000000000000000000002C\r
+:1004D000000000000000000000000000000000001C\r
+:1004E000000000000000000000000000000000000C\r
+:1004F00000000000000000000000000000000000FC\r
+:1005000000000000000000000000000000000000EB\r
+:1005100000000000000000000000000000000000DB\r
+:1005200000000000000000000000000000000000CB\r
+:1005300000000000000000000000000000000000BB\r
+:1005400000000000000000000000000000000000AB\r
+:10055000000000000000000000000000000000009B\r
+:10056000000000000000000000000000000000008B\r
+:10057000000000000000000000000000000000007B\r
+:10058000000000000000000000000000000000006B\r
+:10059000000000000000000000000000000000005B\r
+:1005A000000000000000000000000000000000004B\r
+:1005B000000000000000000000000000000000003B\r
+:1005C000000000000000000000000000000000002B\r
+:1005D000000000000000000000000000000000001B\r
+:1005E000000000000000000000000000000000000B\r
+:1005F00000000000000000000000000000000000FB\r
+:1006000000000000000000000000000000000000EA\r
+:1006100000000000000000000000000000000000DA\r
+:1006200000000000000000000000000000000000CA\r
+:1006300000000000000000000000000000000000BA\r
+:1006400000000000000000000000000000000000AA\r
+:10065000000000000000000000000000000000009A\r
+:10066000000000000000000000000000000000008A\r
+:10067000000000000000000000000000000000007A\r
+:10068000000000000000000000000000000000006A\r
+:10069000000000000000000000000000000000005A\r
+:1006A000000000000000000000000000000000004A\r
+:1006B000000000000000000000000000000000003A\r
+:1006C000000000000000000000000000000000002A\r
+:1006D000000000000000000000000000000000001A\r
+:1006E000000000000000000000000000000000000A\r
+:1006F00000000000000000000000000000000000FA\r
+:1007000000000000000000000000000000000000E9\r
+:1007100000000000000000000000000000000000D9\r
+:1007200000000000000000000000000000000000C9\r
+:1007300000000000000000000000000000000000B9\r
+:1007400000000000000000000000000000000000A9\r
+:100750000000000000000000000000000000000099\r
+:100760000000000000000000000000000000000089\r
+:100770000000000000000000000000000000000079\r
+:100780000000000000000000000000000000000069\r
+:100790000000000000000000000000000000000059\r
+:1007A0000000000000000000000000000000000049\r
+:1007B0000000000000000000000000000000000039\r
+:1007C0000000000000000000000000000000000029\r
+:1007D0000000000000000000000000000000000019\r
+:1007E0000000000000000000000000000000000009\r
+:1007F00000000000000000000000000000000000F9\r
+:1008000000000000000000000000000000000000E8\r
+:1008100000000000000000000000000000000000D8\r
+:1008200000000000000000000000000000000000C8\r
+:1008300000000000000000000000000000000000B8\r
+:1008400000000000000000000000000000000000A8\r
+:100850000000000000000000000000000000000098\r
+:100860000000000000000000000000000000000088\r
+:100870000000000000000000000000000000000078\r
+:100880000000000000000000000000000000000068\r
+:100890000000000000000000000000000000000058\r
+:1008A0000000000000000000000000000000000048\r
+:1008B0000000000000000000000000000000000038\r
+:1008C0000000000000000000000000000000000028\r
+:1008D0000000000000000000000000000000000018\r
+:1008E0000000000000000000000000000000000008\r
+:1008F00000000000000000000000000000000000F8\r
+:1009000000000000000000000000000000000000E7\r
+:1009100000000000000000000000000000000000D7\r
+:1009200000000000000000000000000000000000C7\r
+:1009300000000000000000000000000000000000B7\r
+:1009400000000000000000000000000000000000A7\r
+:100950000000000000000000000000000000000097\r
+:100960000000000000000000000000000000000087\r
+:100970000000000000000000000000000000000077\r
+:100980000000000000000000000000000000000067\r
+:100990000000000000000000000000000000000057\r
+:1009A0000000000000000000000000000000000047\r
+:1009B0000000000000000000000000000000000037\r
+:1009C0000000000000000000000000000000000027\r
+:1009D0000000000000000000000000000000000017\r
+:1009E0000000000000000000000000000000000007\r
+:1009F00000000000000000000000000000000000F7\r
+:100A000000000000000000000000000000000000E6\r
+:100A100000000000000000000000000000000000D6\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/PALM_me.bin b/firmware/radeon/PALM_me.bin
new file mode 100644 (file)
index 0000000..a03030f
Binary files /dev/null and b/firmware/radeon/PALM_me.bin differ
diff --git a/firmware/radeon/PALM_me.bin.ihex b/firmware/radeon/PALM_me.bin.ihex
new file mode 100644 (file)
index 0000000..dc9a1c2
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000C00E0001CC000045CC00004ACC41225CBE\r
+:1001C000CC41A1FCD44DA1FD7C408000A0000000EA\r
+:1001D000CC80004D80000000CC41225DCC00004569\r
+:1001E000CC00004A084C00017C4100007C414000EA\r
+:1001F0001D58FFFF195C03F015600015CD81A102A9\r
+:10020000CDC12256CE01225C94C0000521240020DD\r
+:10021000CE41A1FC8000007B08CC0001CD01A1FCF7\r
+:10022000CC01A1027C408000A0000000CC80004DE9\r
+:100230007C4080007C40C000C02A00027C4100005D\r
+:100240007D2900071C9400011C9800061C9C0300DB\r
+:1002500015DC00087C4200007C4240009540000F05\r
+:10026000C02E000405F022587F2F0007CC3100007B\r
+:10027000C8280004CCC12169CD01216ACE81216B3F\r
+:1002800029B40002CC01216C9740000E29B4000073\r
+:10029000800000BBC834000E29B40002974000095A\r
+:1002A00029B40000C02E000405F022587F2F00075B\r
+:1002B000CC310000C8280004800000BBC834000E08\r
+:1002C000974000047E028000800000BBC834000E0E\r
+:1002D00029B400049740FF4B00000000CE01216DBF\r
+:1002E000CE41216EC8280003C834000E9B40000494\r
+:1002F000C83C000E8400034DCC00004D29F40000E2\r
+:10030000974000070430A2B6840000DDCE81A2B77A\r
+:10031000CF81A2C480000000CFC1A2D129F4000186\r
+:10032000974000070430A2BA840000DDCE81A2BB52\r
+:10033000CF81A2C580000000CFC1A2D229F4000263\r
+:10034000974000070430A2BE840000DDCE81A2BF2A\r
+:10035000CF81A2C680000000CFC1A2D30430A2C2C8\r
+:10036000840000DDCE81A2C3CF81A2C7800000003F\r
+:10037000CFC1A2D4C02E00047F2F0007CC310000D3\r
+:10038000C82C0004C03000067EF34023C03000209B\r
+:100390007F6B8020880000007FB3C024CC00004227\r
+:1003A00080000000CC40001F7C40C0007C41000069\r
+:1003B0001914003D994000130414002E840004C356\r
+:1003C0000418002984000256C81C00130414002AD3\r
+:1003D000840004C30418002DCD41A2A4C81C00133E\r
+:1003E00095C00000C81C0013CCC12100CD01210123\r
+:1003F000CCC12102CD012103800004C0CD81A2A483\r
+:100400001D18100095800005C81C001329E4004049\r
+:100410009640FFFFC81C0013CCC12175CD01217689\r
+:10042000C820001496000000C820001416280001FF\r
+:100430009A800004CC00004F800004C0CC00007FF4\r
+:1004400080000107CCC121757C40C0007C410000C8\r
+:10045000CC000045CC00004A40D40003CD41225CD2\r
+:10046000CD01A1FCC01E00017C42000008CC0001AF\r
+:100470000624000106280002CE1DA1FDCE5DA1FDCF\r
+:1004800098C0FFFACE9DA1FD7C408000A000000036\r
+:10049000CC80004D7C40C0001CD0000114CC000179\r
+:1004A0007C414000950000067C418000CD41216DDB\r
+:1004B000CD81216E80000133C81C0003C0220004DE\r
+:1004C0007E160007CC210000C81C00047C424000BE\r
+:1004D00098C000047C42800080000000CDE5000050\r
+:1004E000CE412169CE81216ACDC1216B80000000FF\r
+:1004F000CC01216C7C40C0007C4100007C4140006C\r
+:100500007C4180007C41C00018A41FE82A68003CA0\r
+:100510009680000A7C0200007C4200003A30000312\r
+:10052000CC0000589B00000342200005042000403E\r
+:100530008000014F7C0240007E0240009A40000093\r
+:100540000A6400011CEC00109AC0000ACC00004DA7\r
+:10055000C02A0004C82C00207E928007CC000041F5\r
+:10056000CC290000CEC0001E8000015FC83000040E\r
+:10057000CD01216DCD41216EC83000037F1F0006E3\r
+:100580001CF40007137800019740002A07B80164A3\r
+:100590009F80000000000000800001747F1B800E1F\r
+:1005A000800001787F1B800F8000017C7F1B800C06\r
+:1005B000800001807F1B800D800001847F1B8011E3\r
+:1005C000800001887F1B80108000018D14A400082A\r
+:1005D0009B80001914A400088000019D1E6400FF88\r
+:1005E0009B80001514A400088000019D1E6400FF7C\r
+:1005F0009B80001114A400088000019D1E6400FF70\r
+:100600009B80000D14A400088000019D1E6400FF63\r
+:100610009B80000914A400088000019D1E6400FF57\r
+:100620009B80000514A400088000019D1E6400FF4B\r
+:1006300014A400081E6400FF2A68003C9A80FE7122\r
+:1006400014EC00087C4340007C4380007C43C000E5\r
+:1006500096C00007CC00004DCF412169CF81216AAF\r
+:10066000CFC1216B80000000CC01216C8000000014\r
+:10067000CFF50000CC000059840004C32A68003C78\r
+:100680009A800004C828001780000000D440007F32\r
+:100690009680FFAB7E02400084000288C00E0002FC\r
+:1006A000CC000041800001ABCCC1304A9400000076\r
+:1006B000C83C001C7C40C0007C410000C01E000102\r
+:1006C00015240012C022000296400005C026000436\r
+:1006D000C027FFFB7D250006C02600007DD28006D6\r
+:1006E0007E12C0067D2500077C4140007C418000D1\r
+:1006F000CCC121699A80000CCD01216ACD41216BCA\r
+:1007000096C0FE40CD81216C840004C3CC00007FE4\r
+:10071000C830001A97000000C830001A800000019D\r
+:100720007C408000840004C3CC00007FC814001506\r
+:10073000C8180016CD41216B96C0FE32CD81216CC8\r
+:10074000800001C2CC00007FCC0003E5C82C002053\r
+:10075000C00E20240410300020CC226B0414300181\r
+:10076000CC000041D0110000CCD50000CEC0001E4E\r
+:10077000C80C000998C00000C80C00097C410000AA\r
+:100780007C414000CC400043CC400044C00E80007F\r
+:100790007C4240007C42800016AC001F96C0FE19CF\r
+:1007A000C035F000CE4003E11E780003127C000843\r
+:1007B0007FF7C0067FFBC00716780018CFC003E2A2\r
+:1007C000CF8003E312B000027F3F0000CF0003E4BC\r
+:1007D0008000044F7C80C0007C40C00018D001E83D\r
+:1007E000112800019500001006A801FB9E80000062\r
+:1007F0000000000080000213C012080080000221E7\r
+:10080000C814001180000228C81400128000022FB2\r
+:10081000CCC1A2A4800002381CE8003F8000026026\r
+:100820007CC1800B1CD0003F29280006292C001613\r
+:100830007EAE8007C81C00139A80003D0414002E71\r
+:1008400080000000CCC1A2A4C01208007C4140007E\r
+:100850007D0CC007C012000815580003155C000C81\r
+:100860007C4200007DD1C006122000147E1E40078D\r
+:100870007E4E8007CE81A2A480000000CD81A1FE23\r
+:10088000C81400110410211895400000C81400116C\r
+:10089000D451000080000000CCC1A2A4C8140012F2\r
+:1008A0000410210695400000C8140012D451000025\r
+:1008B00080000000CCC1A2A4CCC1A2A404100001FD\r
+:1008C000CD000019840004C3CC00007FC810001BB9\r
+:1008D00099000000C810001B800000017C408000CF\r
+:1008E0002AA000042AA400147E2600070414002E67\r
+:1008F000960000080418002984000256C81C001342\r
+:100900000414002A840004C3040C002DCD41A2A4C9\r
+:1009100004102100C81C001395C00000C81C00135F\r
+:10092000D4510000800004C0CCC1A2A4840004C340\r
+:100930000418002984000256C81C00130414002A5D\r
+:10094000840004C30418002D84000256C81C001340\r
+:10095000800000017C40800095C00000C81C00138E\r
+:10096000CD41A2A4CC012100CC012101CD812102E5\r
+:10097000CD812103CD81A2A488000000CC00004DD0\r
+:100980001D9800017C4100007C41400099800009D5\r
+:100990007C420000C83C003211980010C81C000BBB\r
+:1009A0003BFC000197C0FFFFC83C00328000027290\r
+:1009B000C83C003311980010C81C000A3BFC000121\r
+:1009C00097C0FFFFC83C00331568001D7D594007E4\r
+:1009D0009A80000411E4000A7E260007CDC000665C\r
+:1009E000CD012158CD412159CE01215ACCC1A2A41B\r
+:1009F0009A80024405100004042C000112F0001D2E\r
+:100A00007D71400712E000102220000CCD0121581A\r
+:100A1000CD412159CE01215A800004C0CCC1A2A4ED\r
+:100A2000043C0005CFC1A2A4C0360002880000002B\r
+:100A3000CF4120107C40C00014D0001D9900000858\r
+:100A400014D4001C9540FD6FC0260004226421547C\r
+:100A5000CC25000080000000C8280004800004C0ED\r
+:100A6000CD400061840004C31C7400011C780002A6\r
+:100A70009B400003C80C00298400034CC814002BC1\r
+:100A80009B8000030410001084000363CCC1A250BB\r
+:100A9000CD01A050840002FD04180400840004C3AA\r
+:100AA000CC000063C83C002D8400030BC810002953\r
+:100AB000C81C002F1DDC0001C824002795C00009B8\r
+:100AC000C8340031C8380030C83C002D53740020B1\r
+:100AD0007FB7802747B80550CC000062CFFA0000EE\r
+:100AE0009A400000C8240027C82800233AA8000222\r
+:100AF0009A80FFFFC8280023C0300001C8280024C6\r
+:100B00009A800000C8280024CF00005B50D800085D\r
+:100B100014DC0018C03E100021DC80007DFDC00701\r
+:100B2000CD812180CDC121815120000815240018DC\r
+:100B30007E7E4007CE012182CE412183CD4121849A\r
+:100B40007C408000A0000000CC80004D840004C3E5\r
+:100B50001C7400011C7800029B400003C80C002A92\r
+:100B60008400034CC814002C9B8000030410001068\r
+:100B700084000363CCC1A260CD01A060840002FDAB\r
+:100B800004180980840004C3CC000064C83C002E13\r
+:100B90008400030BC810002AC81C002F1DDC0001B4\r
+:100BA000C824002895C00009C8340031C838003076\r
+:100BB000C83C002E537400207FB7802747B80554E7\r
+:100BC000CC000062CFFA00009A400000C824002840\r
+:100BD000C82800233AA800029A80FFFFC8280023F3\r
+:100BE000C82800259A800000C8280025800002C27D\r
+:100BF000C03000020598C00010DC000814E00018A6\r
+:100C0000CDD90000C81C0022C82400221DDC0FFF23\r
+:100C1000CDD900017E624007CE590002D818510399\r
+:100C2000D818510488000000D81851071BF800F0AC\r
+:100C3000C036080097800003C030008088000000A4\r
+:100C4000C02A0004CF41217CCF01217DCD01217E2E\r
+:100C500022A8217F042400089A4000000A640001B1\r
+:100C6000CC290000C82000041638001F9B80FFFB21\r
+:100C7000042400088800000000000000C80C0024C4\r
+:100C800094C0002438D400019940FFFDC81000230F\r
+:100C90007D0D00019900FFFBC80C0024800003308B\r
+:100CA000C80C002594C0001B38D400019940FFFDFA\r
+:100CB000C81000237D0D00019900FFFBC80C002522\r
+:100CC000840004C3CC00007FC83C03FB9BC0000031\r
+:100CD000C83C03FBD04003FCC03E0004D20121F815\r
+:100CE00023FC21F9840004C3CC3D0000C838000473\r
+:100CF0001BB4003E1FB000047F02C00B1EE80004BE\r
+:100D00007EB640079A40FFF6C03E0004D00003FCC8\r
+:100D10007C410000800000017C4080008400034C86\r
+:100D20007C40C0007C408000A0000000CC80004DD2\r
+:100D3000C83C000E97C00003D30003E68800000003\r
+:100D4000043C0026CFC1A2A4C83C03E60BFC000172\r
+:100D5000CFC003E69BC0FFFBCC00004D043C000568\r
+:100D6000CFC1A2A4CC01A1F4840004C3CC000047ED\r
+:100D700088000000CC00007F840003637C40C0003A\r
+:100D80007C408000A0000000CC80004D043C00228C\r
+:100D9000CFC1A2A4840004C3CC0000488800000096\r
+:100DA000CC00007F8400036E7C40C0007C4080004B\r
+:100DB000A0000000CC80004D043C0023CFC1A2A4C1\r
+:100DC000CC01A1F3840004C3CC00004988000000DA\r
+:100DD000CC00007F800000007C40C000800000004C\r
+:100DE0007C40C000C01200017C5140078000000020\r
+:100DF000D4550000CC400065C838002DC83C002EFA\r
+:100E0000C035E000C03200047FB780067FF7C0061F\r
+:100E100023B8100023FC1000CF812154CFC12155ED\r
+:100E2000CC312155C82C0004C81C0025C82400243E\r
+:100E30007DE5C00799C0FFFEC81C002580000001A9\r
+:100E40007C4080007C40C0007C41000019280030BC\r
+:100E500096800008C8280027C82400289A4000006F\r
+:100E6000C82400279A400000C8240028CC0003E0D2\r
+:100E70007C4140007C418000151C001FCCC000C795\r
+:100E8000CD0000C895C00003C01C8000CDC120105B\r
+:100E9000E1830000055C2000CC00004D80000000D4\r
+:100EA000DC1F41007C40C0007C4100007C414000D0\r
+:100EB0007C418000CCC000C9CD0000CAE1830000A5\r
+:100EC000055CA00080000000DC1F41007C40C000E9\r
+:100ED0007C4100007C4140007C418000CCC000CBC4\r
+:100EE000CD0000CCE1830000055CE94080000000FB\r
+:100EF000DC1F41007C40C0007C4100007C41400080\r
+:100F00007C418000CCC000CDCD0000CEE18300004C\r
+:100F1000055CE88080000000DC1F41007C40C000D0\r
+:100F20007C4100007C4140007C418000CCC000CF6F\r
+:100F3000CD0000D0E1830000055CC000800000000F\r
+:100F4000DC1F41007C40C0007C4100007C4140002F\r
+:100F50007C418000CCC000D1CD0000D2E1830000F4\r
+:100F6000055CF00080000000DC1F41007C40C000F8\r
+:100F70007C4100007C4140007C418000CCC000D31B\r
+:100F8000CD0000D4E1830000055CF3FC800000008C\r
+:100F9000DC1F4100D44320007C408000A000000002\r
+:100FA000CC80004DD443A0007C408000A000000015\r
+:100FB000CC80004DD443E9407C408000A00000007C\r
+:100FC000CC80004DD443E8807C408000A00000002D\r
+:100FD000CC80004DD443C0007C408000A0000000C5\r
+:100FE000CC80004DD443F0007C408000A000000085\r
+:100FF000CC80004DD443F3FC7C408000A000000076\r
+:10100000CC80004D041CA000CC43A0007C40C0005C\r
+:10101000D81FC1007C408000A0000000CC80004DA3\r
+:10102000041CC000CC43C0007C40C000D81FC100DD\r
+:101030007C408000A0000000CC80004D7C40C000BF\r
+:101040007C41000094C000037C4140007C41800052\r
+:10105000CC03F3FCCC43F3FCCC43F3FC7C4080009A\r
+:10106000A0000000CC80004DC01E0010C80C00295C\r
+:1010700050D0000810540002800004267D15802006\r
+:10108000C01E0020C80C002A50D0000808540400DC\r
+:10109000115400027D518020CDC00062D45A00005E\r
+:1010A0007C408000A0000000CC80004D7C40C0004F\r
+:1010B0001CD00003112800019500000A06A8043086\r
+:1010C0009E8000007C4180008000043E7C41C00086\r
+:1010D000800004447C41C0008000044A7C41C00080\r
+:1010E0007C4180007C41C00014D400100554A00055\r
+:1010F00080000000CD950000C02200040598A000EB\r
+:101100007DA18007CC1900008000043AC8180004B3\r
+:10111000C0220004CD8125D6222025D7CC21000075\r
+:101120008000043AC8180004CD81216DCDC1216E24\r
+:101130008000043AC81800037C40C000C81003E1D6\r
+:10114000C81403E4C81803E2C81C03E3CD81216975\r
+:10115000CDC1216ACCC1216BCC01216C04200004DB\r
+:101160007DA180007D96400C9640FBA6CD8003E2D9\r
+:101170001D280003C02DF000111800087DAD800669\r
+:101180007DA9800780000000CD8003E27C40C00084\r
+:1011900080000000CC4C03E01C8CFFFFD44D00000D\r
+:1011A0007C408000A0000000CC80004DC8140023CB\r
+:1011B000315800049580FFFFC8140023CC00005B69\r
+:1011C000CC412180204C8000CCC1218114D0001F53\r
+:1011D000CC412182CC4121839500FB8ACC412184E2\r
+:1011E000C81400239940FFFFC814002380000001A9\r
+:1011F0007C408000C016000421542140CC550000E2\r
+:10120000C818000480000000CC0003E07C40C0004F\r
+:1012100018D00038C016008095000003C02A0004D2\r
+:101220007CD4C007CCC1217CCC41217DCC41217E26\r
+:101230007C41800014FC001F1D98FFFF39B00003A3\r
+:1012400022A0217F9B000003419C0005041C00405C\r
+:1012500099C0000009DC0001CC210000C824000472\r
+:10126000166C001F419C00059AC0FFFACC80004D0F\r
+:101270009BC0FB640000000080000000CC0003E085\r
+:101280007C40C0007C4100001518001F5114002054\r
+:101290009980000B191C0031CD0000627D4D402764\r
+:1012A000D456000095C0FB57C82000269A000000C5\r
+:1012B000C8200026800000017C408000E03A000049\r
+:1012C000C0260004CCC121697D250007CD01216A1B\r
+:1012D0000BB80002CC41216B9B80FFFECC41216CFE\r
+:1012E00099C0FD0ACC00007F800000017C40800096\r
+:1012F000C00E0100CC000041CCC1304AC83C007F88\r
+:10130000CC00007F80000000CC00007FCC00007F7C\r
+:1013100088000000CC00007F0000000000000000FA\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001046600100003001200050015001A18\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007500300077003200E80034008C77\r
+:1014500000350062003900EA003A0112003B012524\r
+:10146000003C013D003D01AD003F00E70041046B41\r
+:101470000042047D00430483004401D20045013D45\r
+:10148000004601F6004701F6004801F6004A028DC9\r
+:10149000004B0375004C0299004D02D3004E031F10\r
+:1014A000004F032800510369005203470053035EB5\r
+:1014B000005403770057037900600391006103A98A\r
+:1014C0000062037D006303B3006403BD006503C7CE\r
+:1014D000006603D1006703DB006803E5006903E9E8\r
+:1014E000006A041A006B03ED006C03F1006D03F554\r
+:1014F000006E03F9006F03FD007003F50071042016\r
+:101500000072040F00730401007404080075042BBA\r
+:10151000007A04A0007C044E007D0463000F04BC2C\r
+:10152000000F04BC000F04BC000F04BC000F04BC7F\r
+:10153000000F04BC000F04BC000F04BC000F04BC6F\r
+:10154000000F04BC000F04BC000F04BC000F04BC5F\r
+:10155000000F04BC000F04BC000F04BC000F04BC4F\r
+:10156000000F04BC000F04BC000F04BC000F04BC3F\r
+:10157000000F04BC000F04BC000F04BC000F04BC2F\r
+:00000001FF\r
diff --git a/firmware/radeon/PALM_pfp.bin b/firmware/radeon/PALM_pfp.bin
new file mode 100644 (file)
index 0000000..94d779f
Binary files /dev/null and b/firmware/radeon/PALM_pfp.bin differ
diff --git a/firmware/radeon/PALM_pfp.bin.ihex b/firmware/radeon/PALM_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..1a801d7
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC40002980000365CC40002ABF\r
+:100040009900000500000000CC40002B80000365F3\r
+:10005000CC40002CCC40002D80000365CC40002E0D\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:1000700080000365CC00005280000365CC00005472\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000042F4\r
+:1000E000CD400042D10000427C40C000C81800034F\r
+:1000F000C81C0003C82000039580FFC2C824000369\r
+:1001000095C0FFC0C828001D9A800004CC0000558F\r
+:10011000D80003C0CC000040C8280016C02E000440\r
+:10012000C830000D1AA800277EF2C007CEC00040DC\r
+:10013000CC000040CD800040CDC00040CE0000404B\r
+:1001400096800003CE400040D080005CCC80004010\r
+:10015000CC000040CCC000407C408000A0000000EB\r
+:1001600004280001C810002CC80C002B51100020DE\r
+:100170007CD0C0277CC5002055140020CD00004253\r
+:10018000CD400042D14000427C40C000C81800036E\r
+:10019000C81C0003C8200003C82400039580FF99F1\r
+:1001A000C828000395C0FF97C82C03FD7E2F0011BF\r
+:1001B000970000037EE2C0017C02C006CEC3A29E6F\r
+:1001C000CC00006CCD00006DCD40006DC830001D2E\r
+:1001D0009B000004CC000055D80003C0CC000040B8\r
+:1001E000C82C0016C0320005C834000D1AEC0027D8\r
+:1001F0007F370007CF000040D0400040CD80004056\r
+:10020000CDC00040CE000040CE40004096C000036C\r
+:10021000CE800040D080005CCC800040CC0000400C\r
+:10022000CCC000407C408000A000000004280001F9\r
+:10023000C81800151D980001D000006F7C424000D6\r
+:10024000958002D37C428000C81C0020C037C000CB\r
+:100250007C40C0007C4100007CB48006C0360003B6\r
+:100260001AB801E897800007D04003E084000368D3\r
+:10027000CC00007FC83803E09B800000C83803E052\r
+:1002800099C00000C81C00207CB4800710D4000274\r
+:100290007D654000CD400043CE800043CD0000434B\r
+:1002A000CC800040CE400040CE800040CCC000401A\r
+:1002B000E03A00009780FF53CD0000407C40C00032\r
+:1002C000800000A37C4100001C8C000298C0000943\r
+:1002D000C810001C99000004C81C00068400036BB1\r
+:1002E000CC000052C81800158000008E1D98000236\r
+:1002F000C810001E9900FFFCC81C00088400036B96\r
+:10030000CC000054C81800158000008E1D98000213\r
+:100310001C8C0002C810001D98C0000EC8140049B3\r
+:1003200099000004C81C00078400036BCC00005334\r
+:10033000C818001594C00003189401E8055400067D\r
+:10034000201000017D1500038000008E7D91800645\r
+:100350009940FFF8C81C0007CDC00040CC00004009\r
+:10036000800000CCCC00006EC00E8080CC00006706\r
+:1003700004D08080CC000068CD0003F1CD0003F2F2\r
+:10038000CD0003F3CD0003F4CD0003F6CD0003F759\r
+:10039000CD0003F880000005CD0003F9CC800040BB\r
+:1003A000D44000407C408000A000000004280001F0\r
+:1003B000800000EFD8000440D8000340CC0000408B\r
+:1003C000CC800040D44000407C408000A000000071\r
+:1003D00004280001D80003C0800000FCCC000040CD\r
+:1003E000800000FBD8000440D8000340CC0000404F\r
+:1003F000C80C0029C810002ACC800040CC40004026\r
+:10040000511000207CD0C027105000027D0D00202C\r
+:1004100055140020CD000043CD400043D0400043A0\r
+:10042000CC0000407C408000A000000004280001B7\r
+:10043000D80003C0CC000040CC800040D440004035\r
+:100440007C408000A0000000042800011C8C0002F9\r
+:10045000C810001D98C00011C8140049990000047C\r
+:10046000C81C00078400036BCC000053C80C002F8D\r
+:10047000CC800040CC400040CC400040CC4000400C\r
+:100480007CC4C000CCC00040D44000407C40800010\r
+:10049000A0000000042800019940FFF5C81C0007D7\r
+:1004A000CDC00040CC0000408000011BCC00006E9D\r
+:1004B0007C40C000C81000479900000BC8140044DD\r
+:1004C00099400004C8180009CD800040CC000040CD\r
+:1004D00080000145CC8000407C40C000C81000472F\r
+:1004E0009500FFF7C814004599400004C818000A99\r
+:1004F000CD800040CC00004080000145D80008407D\r
+:100500007C40C000C81000479900FFFC00000000BC\r
+:10051000CC800040CCC00040D44000407C408000F3\r
+:10052000A000000004280001C8100046D8000740C1\r
+:10053000CD0000408400015CCD000040C80C0043A9\r
+:1005400094C0000AC814004880000155041000033C\r
+:10055000C8100046D80007C0CD0000408400015CF0\r
+:10056000CD000040C81400489D400000CC00006A47\r
+:10057000C82800161EA800019A800003C0290001A7\r
+:1005800088000000C02C0156CE80005CD80008C056\r
+:10059000CEC0004088000000CC0000401C8C00024F\r
+:1005A000C810001E94C00008C814001C9900000A5E\r
+:1005B000C81C00088400036BCC0000548000017646\r
+:1005C000CC80004099400004C81C00068400036BE6\r
+:1005D000CC000052CC80004080000000D44000409D\r
+:1005E000CC400027CC40002880000365CC00006B85\r
+:1005F000C0320003C037FFFF800001817CB080075C\r
+:100600007C434000C8200028C81C0027C8180026CA\r
+:10061000CF43A29E7C414000522000207DE1C027B4\r
+:100620007D58C0037CDCC02054D00020800001969F\r
+:10063000CC8000407C418000CC8000408000019351\r
+:10064000CD800040C019FFFFCC800040CD83A29E2A\r
+:100650007C40C0007C4100007C414000CCC3A1FA3A\r
+:10066000CD03A1F9CD43A29DCCC00040CD000040F8\r
+:10067000CD400040CC4000407C408000A000000005\r
+:10068000042800017C40C0001CD00001CCC3A29F04\r
+:1006900095000003D0400026D0800026CC8000408A\r
+:1006A00080000000CCC000407C40C000CC800040F6\r
+:1006B000CCC3A2A280000000CCC00040C81C004CEB\r
+:1006C0007C40C00029E0000014D4001F7D6140067A\r
+:1006D000CC800040954000037C410000CCC0005914\r
+:1006E0001518001FCCC0004095800003CD000040CD\r
+:1006F000CD00005A80000365CC00007FC80C004C80\r
+:1007000094C001A3C820001F7C410000D8200244EF\r
+:10071000CE2000447C4140007C418000CDA00049B7\r
+:10072000CD200041CD600041CDA000411510000852\r
+:10073000115400187D53C007CFC0002F06200001C0\r
+:10074000CE00005880000365CC00007FC820001F49\r
+:10075000CA0C001794C000057C410000D82002C6D6\r
+:10076000800001C5CE200046CC000048800001DB9F\r
+:1007700000000000C820001F7C4180000A2000010A\r
+:10078000CA14001ACA1800177D5980079580000501\r
+:10079000CE000058CCA0004680000000CD6000468E\r
+:1007A000CCA0004480000000CD60004480000365C0\r
+:1007B000CC40006AC80C03FA98C0000BD04003FA82\r
+:1007C000C8180042C81C0043C810001DC814001CF3\r
+:1007D000111000019980FF567D15000799C0FF5E3A\r
+:1007E00000000000D00003FA800000007C40C00040\r
+:1007F000CC80004080000000D44000407C40C0001D\r
+:100800007C4100007C4380007C43C000041C00024B\r
+:10081000CF800042CFC00042CDC00042041C000483\r
+:10082000CCC00042CD000042CDC00042041C0000FC\r
+:10083000042000017C024000C8140003C818000313\r
+:10084000519800207D594027C8280003C82C000378\r
+:10085000C8300003C834000352EC00207EAE80276D\r
+:10086000537400207F3700277F2B40217E76402065\r
+:1008700056A8003F5730003F7EB280067E2A000611\r
+:1008800099C0FFF209DC00019680FFE153F40020DB\r
+:100890007F7B40277D65402055580020CC00005BC1\r
+:1008A000CD760000CDB60000C82000419A000000BF\r
+:1008B000C8200041800000017C4080007C40C000D6\r
+:1008C0007C410000CCC003FECD0003FFCCC0004241\r
+:1008D000CD0000421514001F191800F0275C00011C\r
+:1008E0007D760006998000057D5E4006CC000042C2\r
+:1008F00080000365CC00004D15980001152C000800\r
+:10090000998000311EEC0001960000041530000CA7\r
+:1009100080000365CC00004204140004CD40004276\r
+:100920001F3000012028000104380004043C0000AE\r
+:10093000C8140003C8180003C81C0003C820000323\r
+:100940007D5D400D7DA1C00D7D5D40071610001F2F\r
+:10095000159C001F7D1D00067D1740067E928006B7\r
+:100960009B4000120BB800049BC0FFF20BFC00017F\r
+:10097000C80C03FE9A800009C81003FF9B00010603\r
+:10098000CC00004D04140004CCC00042CD00004255\r
+:1009900080000249CD40004296C000FFCC00004DCF\r
+:1009A00080000365CC00004E9AC00003CC00004DCF\r
+:1009B000CC00004E9780FD93E38300008000000090\r
+:1009C000DC0301FF96400004CC00004E800003656C\r
+:1009D000CC000042D2000042C8080003C80C00034B\r
+:1009E000C8100003C8140003C8180003C81C000383\r
+:1009F000C8240003C828000315FC001F16B0001F00\r
+:100A00007FF3C00614F0001F7FF3C0061570001FAF\r
+:100A10007FF3C0067D88800197C0000D7DCCC001AA\r
+:100A20007E5100017E9540017C90800C7CD4C00CEE\r
+:100A30009AC000037C8F400624B400019B4000D67E\r
+:100A4000CC00004D80000365CC00004EC80C03FEB6\r
+:100A5000C81003FFCCC0004280000275CD000042E8\r
+:100A60007C40C0007C4100007C42C0007C43000010\r
+:100A7000C03B001F7C4340007FB78006C03E100093\r
+:100A80009780FD607D3D00077F3F00071914003B04\r
+:100A9000CC00005B95400013C814004031580002A0\r
+:100AA0009580FFFFC8140040CC000063211C80002B\r
+:100AB000CCC12185CDC121861514001FCEC121874F\r
+:100AC000CF0121889540FD4FCF412189C8140040B6\r
+:100AD0009940FFFFC8140040800000017C40800066\r
+:100AE000CC800040CCC00040CD000040CEC00040D3\r
+:100AF000CF00004080000000CF400040D08003E0E5\r
+:100B0000CC80004084000368CC400040C80C03E067\r
+:100B100098C00000C80C03E07C408000A0000000EA\r
+:100B20007E8280067C40C000840002D214D0001F68\r
+:100B30009900FD34D04003E084000368CC00007FBE\r
+:100B4000800002C4C80C03E0CC800040CCC0004050\r
+:100B500088000000D4400040CC800040CC400040E1\r
+:100B6000CC400040CC4000407C40C000CCC00021C4\r
+:100B7000CCC00040D4400040C037FFFFD00003FB92\r
+:100B8000D00003FCD00003FA80000000CF4003FD3A\r
+:100B90007C40C00014DC001D99C00007CC800040E0\r
+:100BA00018DC003C99C0007CCCC00040800003658C\r
+:100BB000CC00006A18D8003CCD800066CC00006AEA\r
+:100BC00080000365CCC000407C40C0005050002035\r
+:100BD00084000368CC00005D7CD0C027C820001FC3\r
+:100BE000C8D60000994000087C438000E3830000E1\r
+:100BF000CFA0004F84000368CC00005E800000009E\r
+:100C0000D440007F80000365CC00005E8400036850\r
+:100C1000CC00005DC820001F7C40C000C036FF0033\r
+:100C2000C8100021C0303FFF7CF540067D51800692\r
+:100C30007D81800A998000087CF38006E3830000B0\r
+:100C4000CFA0004F84000368CC00005E800000004D\r
+:100C5000D440007F80000365CC00005E8400036800\r
+:100C60007C40C00014DC000895C000191CDC00109A\r
+:100C70007C41000099C000045054002080000323F0\r
+:100C8000C91D00007D150027C91E00007C42000020\r
+:100C90007C4240007C4180007DE5C0067DE2801101\r
+:100CA0009A80FCD841AC00059AC000000AEC000113\r
+:100CB0001CDC001099C00004000000008000032626\r
+:100CC000C91D000080000326C91E0000CC80004022\r
+:100CD000CCC0004080000000D4400040D800034059\r
+:100CE000CC000040CC800040D44000407C408000DC\r
+:100CF000A000000004280001D80003C0CC00004080\r
+:100D0000CC800040D44000407C408000A000000027\r
+:100D1000042800017C40C0001CD0000629100006F9\r
+:100D200099000006C814001C99400004CC00005231\r
+:100D30008400036BC81C0006CC800040CCC000407F\r
+:100D400080000000D44000407C40C0007C41000096\r
+:100D50001518001FCD00005B99800004511400207D\r
+:100D600080000000D44D00007D4D4027191C00314B\r
+:100D7000D456000095C0FCA3C82000419A00000092\r
+:100D8000C8200041800000017C40800080000000FD\r
+:100D9000D440007FCC00007F80000000CC00007FAA\r
+:100DA000CC00007F88000000CC00007FCDC0004058\r
+:100DB00088000000CC00004000000000000000009F\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:1010000000020003000303370004033E000501C192\r
+:10101000000600EE000700FA0008010C000900F5C8\r
+:10102000000A00EC000B00F8000C012C000D01364A\r
+:10103000000E014A000F0154001003630011000A62\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025005900260178001701DD001801EB7A\r
+:10106000001A01ED002202F2002303030027018D84\r
+:10107000001F01FF0020022F002801AF0029017C82\r
+:10108000002A01A1002B0191002F01AA003201D3F7\r
+:101090000034034500350180003901FC003C031792\r
+:1010A000003E01BF003F01C100410298004202BF63\r
+:1010B000004302C9004402D6004A02E40055033945\r
+:1010C000005603400060008C006100B2006200DA4C\r
+:1010D000006300C4006400C4006500C4006600C46E\r
+:1010E000006700C4006800E7006900F0006A014082\r
+:1010F000006B010E006C010E006D010E006E010E02\r
+:10110000006F010E00700113007300FC007400FCFE\r
+:1011100000750167007B0352000000050000000518\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/R600_rlc.bin.ihex b/firmware/radeon/R600_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..67327dd
--- /dev/null
@@ -0,0 +1,193 @@
+:10000000002804100028440000D4401100D40079D6\r
+:100010000004180100D5807A00D4007400D4007365\r
+:1000200000D4000B008402B20031841F0084023F20\r
+:100030000028040100D4000E0028200400C8107419\r
+:1000400000C80436009842D0002829DE00C8047990\r
+:10005000009840080000000000C8280A00968005AB\r
+:1000600000000000002829DF0080008800D5800EF5\r
+:1000700000C82800009680290028080100D48000CC\r
+:10008000000E89BB0094800900CAC401009500FDE0\r
+:100090000030440C00D04804009480F10028200176\r
+:1000A0000080012A00000000000E89BC009880DC5E\r
+:1000B00000282006009501FB000E89BE00948004F4\r
+:1000C0000000000000D580790080000D000E89BD81\r
+:1000D000009480040000000000D400790080000D2E\r
+:1000E000000E89B4009880F100282004001689B71A\r
+:1000F000009881EC001E89BA009881EA0000000097\r
+:10010000000E89BA009480E900282004002820020B\r
+:100110000080012A0000000000C828020096801715\r
+:100120000028080100D48002009501DE0026840129\r
+:10013000009840030000000000282000002289C829\r
+:10014000001A8DDD007C8C8B009880D80022899865\r
+:10015000001A8D9B007C8C8B009880D4002289A88B\r
+:10016000001A8DAB007C8C8B009880D000000000C2\r
+:10017000008002280000000000C828010096800BC3\r
+:100180000028080100D48001009501C6000E89E80E\r
+:10019000009880C6000E89EA009880C40000000024\r
+:1001A000008002280000000000C828030096800795\r
+:1001B000000E8DE50098C0FD0028080100D48003E2\r
+:1001C000008002280000000000C828040096800972\r
+:1001D0000028080100D48004009501B2000E89E2D5\r
+:1001E000009880B20000000000800228000000009B\r
+:1001F00000C82805009683930028080100D48005D4\r
+:10020000009501A8000E8992009880A8000E89949C\r
+:10021000009481A4000000000080012A0028200230\r
+:10022000008400BD0028200300CAC400002444024A\r
+:10023000009440060000000000C8047800D4407715\r
+:100240000080012E00000000008402B20031841FF3\r
+:1002500000CAC400002444010098403F0000000090\r
+:1002600000C8047A00D4007A00C8087D00CACC0B0C\r
+:10027000007C8C8200944006000000000094800BFB\r
+:1002800000000000008000A7000000000094808BA8\r
+:10029000000000000080029500000000008402B20F\r
+:1002A0000031841F0080029500C8047D00C8087FCB\r
+:1002B000007C48420098400400000000008402B521\r
+:1002C0000000000000CAC4010030440C00D0480007\r
+:1002D00000248801009881050000000000840204C9\r
+:1002E00000000000008402C80000000000800295A9\r
+:1002F0000000000000C80421003044080028084025\r
+:1003000000C810220095034C0000000000D50078C2\r
+:1003100000D40077007C00C00004CC0C0009100160\r
+:10032000009903FE0000000000D0500000D5080036\r
+:100330000008CC010094C006000000000004440442\r
+:1003400000048801008000CA00000000008800004E\r
+:1003500000282C4000D5807400CAE40B00CADC02DF\r
+:1003600000D6407F00D6407D0036640400D6400BA6\r
+:1003700000D6402D00D5C07E00D5C07C00C8042426\r
+:100380000030440800D4407B00CAC400002444105C\r
+:10039000009843290000000000840237002804016F\r
+:1003A000000C440200984198002805F1007DC04CE3\r
+:1003B000007DC08C0084024F0000000000840237E2\r
+:1003C00000280403000C44020098418F002805F027\r
+:1003D0000084023700280402000C44020098418A7D\r
+:1003E000002805F00084023700280404000C4402B1\r
+:1003F00000984185002805F2008402390028040293\r
+:100400000084024A0000000000C101F0002804003E\r
+:1004100000D870000080000D0000000000C8047AC1\r
+:1004200000984004000000000080000D0000000063\r
+:1004300000D4007A00C804770008440100D4407753\r
+:10044000008402B20031841F0080029E0000000080\r
+:1004500000CAC4010030440C00DC040000C804776A\r
+:100460000004440100D440770006EC0C00C8087872\r
+:10047000007C48820094839200000000000AEC0C8B\r
+:1004800000D5807A008402B2002804000095017B28\r
+:1004900000000000008002950000000000CAC401B6\r
+:1004A0000030440C00DD840000C8047700044401DF\r
+:1004B00000D440770006EC0C0084028E000000009F\r
+:1004C0000084023D00280400008402370028040153\r
+:1004D000000C4402009440050000000000282004A5\r
+:1004E000002829F10000000000C8047700C808783F\r
+:1004F000007C488200948063000000000084026059\r
+:10050000002820050084022C0000000000C8280AF2\r
+:10051000009683FF00282003002829DF008400BD07\r
+:100520000028200300CAC40B00C8087D007C488254\r
+:1005300000D4807300948053000000000084020205\r
+:10054000000000000084023700280404000C44026C\r
+:100550000098412D002805F200C804730098400A55\r
+:1005600000D4007300CAC4010030440C00D048001D\r
+:10057000002488010098800400000000008402C864\r
+:10058000000000000084023D0028040100C804208F\r
+:10059000002444FD00D440200084023900280402D5\r
+:1005A000008002950000000000C8047A0094400614\r
+:1005B000000000000084023F002804000098400969\r
+:1005C00000000000008402B20031841F00C101F06D\r
+:1005D00000CF0400002804000080000D00D4400378\r
+:1005E0000028040100D4400300C101F100CF040041\r
+:1005F00000344404009843FE0000000000C4280AB0\r
+:10060000009A801900C82800000E85BC009840138D\r
+:100610000000000000C1200400CF04000034441F8B\r
+:10062000009840110000000000C8280500968005D1\r
+:100630000028080100D480050084022C000000007E\r
+:1006400000C82803000E85E5009443ED000000007B\r
+:10065000008001990000000000D4007A008402B2FA\r
+:100660000031841F0084023B0028040200D83000BF\r
+:100670000084023F002804010080000D00000000FB\r
+:1006800000D4007200CAC4010030440C00D04800FD\r
+:1006900000248801009880050000000000C8087E42\r
+:1006A000008001AB00D5807200CAC80200C8047C7B\r
+:1006B0000084024F00000000008402370028040379\r
+:1006C000000C440200984004000000000080014F2C\r
+:1006D0000000000000C804720094401F00000000E9\r
+:1006E00000800281000000000084028E00000000F3\r
+:1006F0000084023D00280400008402370028040121\r
+:10070000000C440200944005000000000028200472\r
+:10071000002829F10000000000D4007200CAC802BD\r
+:10072000007C004C0084024F00000000008402376F\r
+:1007300000280402000C44020094438100000000E1\r
+:1007400000C8047200944004000000000080028190\r
+:100750000000000000CAC40B00D440760084026090\r
+:100760000000000000D6800C00282004002829F09A\r
+:1007700000C8087600D4807D0034880400D4800B43\r
+:1007800000C804770004440100D440770006EC0C54\r
+:1007900000C80878007C48820094800F00000000A8\r
+:1007A00000C8140A009543FF00000000008400BD4B\r
+:1007B0000000000000C8047D00CAC80B007C48424D\r
+:1007C000009843E500C80476007C4842009843E264\r
+:1007D0000000000000CAC4010030440C00D04800F2\r
+:1007E00000248801009883CD0000000000D58072AD\r
+:1007F00000C8087E007C004C0084024F000000000E\r
+:10080000008001CB000000000084024300280406A1\r
+:1008100000C1051600CAC40A00D8700000C105381E\r
+:1008200000CAC40800D8700000C1053900CAC40954\r
+:1008300000D8700000C1055F00CAC40300D8700072\r
+:1008400000C1052600CAC40600D8700000C1052EEC\r
+:1008500000CAC40700D8700000C1056700CAC404FC\r
+:1008600000D8700000C1056F00CAC40500D8700030\r
+:1008700000CF040000CAC4000024440400984004CF\r
+:100880000028040100800224000000000028040267\r
+:100890000084024300000000008800000000000007\r
+:1008A0000084022C000000000080000D0000000009\r
+:1008B0000026A8FF00D6800C008800000000000081\r
+:1008C00000D8700000CF040000344404009443FEBC\r
+:1008D00000000000008800000000000000800230DE\r
+:1008E00000C10EFB0080023000C10F910080023079\r
+:1008F00000C101F10080023000C1039100C120035A\r
+:1009000000D870000088000000CF04000080023092\r
+:1009100000C1051E00C83020002B300200D7002087\r
+:10092000008800000000000000C83020002733FDD0\r
+:1009300000D7002000880000000000000028141FDD\r
+:100940000031541B007D444C002814080031541B16\r
+:10095000007D488C00C10F0000280C0800D8B000B2\r
+:1009600000D870010008CC010094C00400073010CA\r
+:100970000080025700000000008800000000000016\r
+:1009800000D4003000C8087B00C80C7D007CE0CC9F\r
+:1009900000DCC80000C80C2E00DCC80400C80C2F06\r
+:1009A00000DCC80800C8142500C80C2700C81023A4\r
+:1009B0000004CC01007CD107009900080000000071\r
+:1009C0000004880C00D4807B00D4C02700DCD40055\r
+:1009D0000080027B0000000000C808240030880866\r
+:1009E00000D4807B00D40027007C00CC00C8082500\r
+:1009F00000DCC800008402880000000000880000BD\r
+:100A000000000000007C428C00840260002820046A\r
+:100A10000084022C0000000000800286000000001C\r
+:100A200000C8040D00084403009843FE00000000C5\r
+:100A3000008800000000000000C8042000284402D4\r
+:100A400000D44020008402390028040100880000FE\r
+:100A500000000000008402600000000000C13C8132\r
+:100A600000CF040000D8700000C1340100CF0400A2\r
+:100A700000D870000084022C00C810740095016E2C\r
+:100A80000000000000C8047A0094400400C8247FDD\r
+:100A9000008002A70000000000CAE40B00D6407DE1\r
+:100AA0000036640400D6400B00D6402D00CACC02AC\r
+:100AB00000D4C07C00CACC010030CC0C00D4C0757E\r
+:100AC0000080000D0000000000C101F0008800005F\r
+:100AD00000D8700000C8047500C1FFFF00D0480CAA\r
+:100AE00000044404007CB0CB0094C00C0000000063\r
+:100AF00000CCD00000DD040C000444040034881055\r
+:100B0000009480060000000000CC900000DD040C82\r
+:100B1000008002B7000444040088000000000000C8\r
+:100B200000C130410031841F00D8700000C13C82F8\r
+:100B300000D8700000C1340000D8300000CAC401E1\r
+:100B40000030440C00C1FFFF00D0480C00044404F6\r
+:100B5000007CB0CB0094C00A00D0500C00D90C002F\r
+:100B600000044404003488100094800500D0500C28\r
+:100B700000D90800008002D200044404008800006C\r
+:100B80000000000000C8040A00D400790084023785\r
+:100B90000028040100C8087E00C8047C0084024FBD\r
+:100BA000000000000084023700280403000C440207\r
+:100BB00000984395000000000084023700280404D8\r
+:100BC000000C440200984390002805F200282004FD\r
+:100BD00000840260000000000084022C000000007D\r
+:100BE00000C8247F00D6407D0036640400D6400B48\r
+:100BF00000D6402D0080000D00D40036000000001B\r
+:00000001FF\r
diff --git a/firmware/radeon/R700_rlc.bin.ihex b/firmware/radeon/R700_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..4ed85d0
--- /dev/null
@@ -0,0 +1,257 @@
+:100000003438001037B80000CF800012CC0000D385\r
+:10001000CC0000DD04180001CC1800D3CC0000C9CE\r
+:10002000CC1800C9CD8000D5CD9800D5CC0000CB30\r
+:10003000CC1800CBCC0000D9CC1800D9CC0000C320\r
+:10004000CD8000C8CC1800C1CC0000C1CC0000CCD1\r
+:10005000CC00000BCC00000E8000021F000000004E\r
+:1000600034200004CC00000EC81000CBC83800CCEF\r
+:100070009B80018A00000000C8380056342801C364\r
+:100080009B80018C341C0000C81000CBC9EC00D947\r
+:10009000C9F800D3C80800DD7CB8C00C98C00017B0\r
+:1000A00000000000C80800C8948001F100000000B2\r
+:1000B000C80C004030CC002094C0004ACD8000DD48\r
+:1000C000C428000996800044CD8000DDC9C800D551\r
+:1000D000C9CC00C97CC8800C9480002000000000BE\r
+:1000E000C8280009342801DFC9EC00008000010A9B\r
+:1000F000CD80000E00000000C8380057342801E110\r
+:100100009B80016C341C0001C8080040308800202E\r
+:1001100094800034CC0000DDC428000A96800031B1\r
+:10012000CC0000DD341C0001C9C800D5C9CC00C911\r
+:100130007CC8800C9480000900000000C828000AD8\r
+:10014000342801F0C81000CBC9EC00D98000010AA6\r
+:10015000CD80000E00000000C9EC00D9C9C800C164\r
+:100160009880002000000000840002517F03000BF3\r
+:10017000CB3800429780011000000000CB380041CE\r
+:1001800067B8000834340007CC000015CB8A0000A3\r
+:100190000B7400019B40FFFE07B80004CACC0006A8\r
+:1001A0007CC88002948001040000000099C0000611\r
+:1001B00034200003C8280009342801DF8000010A28\r
+:1001C000CD80000EC828000A342801F08000010A02\r
+:1001D000CD80000EC9C800C99880FFA500000000AE\r
+:1001E000C80800C89480004700000000C82800002C\r
+:1001F0009680004434080001CC800000301C0000D0\r
+:100200000E8801BB94800004000000008000019D66\r
+:10021000342000010E8801BC9880010B0000000012\r
+:10022000950001B8000000000E8801BE9480000512\r
+:1002300000000000CD8000D3800000180000000006\r
+:100240000E8801BD9480000400000000CC0000D3A3\r
+:10025000800000180E8801C1988000B93420000683\r
+:100260000E8801C29480000800000000C828000920\r
+:10027000342801DFCD9C00C3CD9C00D5988000B010\r
+:10028000342000030E8801C39880011C3420000430\r
+:100290000E8801C0988000AA342000070E8801B79C\r
+:1002A00098800116342000040E8801B8988001134C\r
+:1002B000342000040E8801B9988001103420000415\r
+:1002C0000E8801B49880010D34200004168801B412\r
+:1002D0009880018C168801B79880018A1E8801C019\r
+:1002E00098800188000000000E8801BA9480010304\r
+:1002F00034200004342000028000014F0000000080\r
+:10030000C82800029680001434080001CC80000246\r
+:10031000228801DC1A8C01DD7C8C800B988000091E\r
+:1003200000000000228801C81A8C01DB7C8C800B45\r
+:1003300098800007301C0000800002400000000090\r
+:10034000341C0001C81000CBC9EC00D9800001BEEC\r
+:1003500034200004C82800019680000B0000000033\r
+:10036000301C000034080001CC80000195000165BC\r
+:100370000E8801E8988000E13420000480000240EB\r
+:1003800000000000C828000396800008000000005C\r
+:100390000E8C01E598C0011A34080001CC800003DE\r
+:1003A0008000024000000000C8280004341C000146\r
+:1003B000C81000CB9680FF2EC9EC00D9340800018C\r
+:1003C000CC8000040E8801F09480000A0000000038\r
+:1003D0008400026C00000000C828000A342801F0E4\r
+:1003E000CD9C00C3CD9C00D59880005534200003DF\r
+:1003F0000E8801E298800052342000020E8801F637\r
+:100400009880004F342000060E8801F39880009AEF\r
+:10041000342000010E8801E1988000B8000000003F\r
+:100420008000024000000000CC1C00C3CC0000157E\r
+:10043000840001313420000399C000040000000052\r
+:100440008400034125B8001FC9F800C99B80000F34\r
+:1004500000000000CAF8000033B800019B80006370\r
+:1004600000000000C9F400D5CC1C00D5C9C800DBD1\r
+:10047000CACC00067C8C8002974002060000000077\r
+:1004800080000304CC8000C3CAC80000308800107C\r
+:100490009880005400000000CC1C00C999C00004E2\r
+:1004A000CC1C00168400023C343800078400023C57\r
+:1004B0003438000199C001D20000000080000324FC\r
+:1004C00000000000840002517F03000BCB38004184\r
+:1004D00067B8000825C80005348800807C82C00CFD\r
+:1004E000CEDC00D9CB100042950001EA00000000EC\r
+:1004F000CD1C00D17D18C001CCDC00CF7C00C00039\r
+:1005000004CC0007091000019900FFFE0000000064\r
+:10051000CB920000CD08000008CC000194C000067A\r
+:100520000000000047B80004048800018000014476\r
+:100530000000000088000000000000008400034468\r
+:100540000000000099C0000800000000C0302192A7\r
+:10055000CB09000007740008CCB6000C0774002C0F\r
+:10056000CCB6000C8400028900000000800001610C\r
+:10057000000000008400034400000000800001DB54\r
+:100580000000000099C00006CD9C00D584000290B8\r
+:1005900000000000800001DB00000000840002ACCD\r
+:1005A000000000008400027100000000800001DBF8\r
+:1005B00000000000CD9C00C199C0000600000000B2\r
+:1005C000C03021B9CDB100008000001B0000000048\r
+:1005D000C0303418CDB100008000001B00000000C6\r
+:1005E0008000032434200008CD8000CBCAE400063C\r
+:1005F000CE5C00DECE5C00DB2A640004CE40000B43\r
+:10060000840002517F03000BCE70004DCB380044B4\r
+:1006100027B80008CF9C00D76BB80020CF9C00C63D\r
+:1006200099C0FE90000000008400034134380000AF\r
+:1006300099C0FE8C00000000C030235580000018D7\r
+:10064000CE710000C9F800D59B80000400000000B6\r
+:100650008000001800000000CC1C00D599C0FE816D\r
+:10066000000000008400034125B8001F800000182E\r
+:1006700000000000CD9C00D599C0000400000000DF\r
+:1006800084000341343800009500FE79000000002A\r
+:100690008000015D000000002B9C001F2BB80010A3\r
+:1006A00033A800FFCC0000CC800001BE3420000441\r
+:1006B000C9EC00D9C81000CBC9F80009CC1C00D384\r
+:1006C00099C00008000000008400029000000000B3\r
+:1006D000840002710000000080000327CD9C00D53B\r
+:1006E000840002AC000000008400027100000000E1\r
+:1006F00080000327CD9C00D5C8080040308800202A\r
+:100700009480008000000000C9EC00D9C9F800CD39\r
+:10071000C9C800C4648800207F8B802C668C0010C0\r
+:100720007CE0C00CCCFA0004840002F00000000061\r
+:10073000C8080040308800109880002400000000A5\r
+:1007400099C0000600000000840002900000000034\r
+:10075000800001D800000000840002AC000000000E\r
+:10076000CD9C00D5800001EB00000000C9C800C38B\r
+:100770009880FF2E0000000084000271000000003D\r
+:10078000C9F800C19B80000A00000000C9F800CF32\r
+:1007900097800007000000000BB80001CF9C00CF3D\r
+:1007A00006EC0007800003040000000084000271D2\r
+:1007B00000000000CD9C00D58400028900000000EC\r
+:1007C000800003240000000099C000053408001FC9\r
+:1007D00034380003800001F9CF9C00163438000142\r
+:1007E000CF9C0016988000000888000184000284D5\r
+:1007F000000000008000032400000000C9CC00D5E8\r
+:1008000094C000080000000084000248340C00017D\r
+:1008100084000263343800009B80000B000000005D\r
+:1008200084000248340C00008400034125B8001FF6\r
+:10083000C03001C0CB3900003438000080000018FF\r
+:10084000CF80000334380001CF800003C81000CBF4\r
+:10085000C03001C1CB3900002BB800049B80FFFEE3\r
+:1008600000000000CC0000C800000000C808001A0A\r
+:100870009480FDFFCD8000DD000000008400026157\r
+:1008800034380002CC3100008400026334380001A7\r
+:10089000CD8000C884000248340C0000800000189D\r
+:1008A00000000000C03005157F1F0020CAF80005B9\r
+:1008B000CFB10000C03005507F1F0020CAF80002F1\r
+:1008C000CFB10000C03005587F1F0020CAF80003D8\r
+:1008D000CFB10000C03005607F1F0020CAF80004BF\r
+:1008E000CFB10000CB3900008800000000000000FC\r
+:1008F0008400026700000000880000000000000083\r
+:100900008400024400000000800000180000000085\r
+:1009100032A800FFCE80000C88000000000000001C\r
+:10092000C0300390CB390000C00BFFFE7F8B800BE3\r
+:1009300024CC00107F8F800CCFB100008800000015\r
+:10094000CB39000095C000030000000007300028EC\r
+:100950008800000000000000880000000000000087\r
+:10096000CFB10000CD80000ECB39000033B80010AD\r
+:100970002BB800049780FFFD0000000088000000F5\r
+:100980000000000080000258C03001C1C0302003C8\r
+:10099000CFB1000088000000CB390000CD80000EF0\r
+:1009A0007C1C800CC030051D800002587F1F002079\r
+:1009B000C830004037300002CF00004088000000FF\r
+:1009C00000000000C8300040333003FDCF0000407D\r
+:1009D0008800000000000000CF9C0016CD80000EB3\r
+:1009E000C9F000187F3880029480FFFE00000000EC\r
+:1009F0008800000000000000CFB10000CB390000EB\r
+:100A00003408001F9880000008880001CC1C0016E4\r
+:100A1000C9F0001B9700FFFF0000000088000000E5\r
+:100A20000000000099C00004CC1C00C18000028EB0\r
+:100A3000C03021B9C030341888000000CC3100002B\r
+:100A4000C0302356C0080100C03AFF007F8B800CE5\r
+:100A5000CFB10000CB3900008400027634380003A7\r
+:100A6000C03020088400027E3438FFFFC0302008E8\r
+:100A7000CC310000CB390000C03003988400027EE6\r
+:100A800034380100CC000056C0300398CC3100004F\r
+:100A9000CB090000C0302356C0080100CCB10000D3\r
+:100AA000CB390000C03021B688000000CC310000F6\r
+:100AB000840002763438000134380001C0300398D5\r
+:100AC0008400027E27B80014CC000057C030039881\r
+:100AD000CC31000088000000CB090000CC000050A1\r
+:100AE000C9C800D7C9CC00C664CC00207C8C802C3F\r
+:100AF000840002517F03000BCB0C004D24CC00047A\r
+:100B00007CE0C00CCCCA0000C80C004ECCCA00046B\r
+:100B1000C80C004FCCCA0008840002517F03000BB0\r
+:100B2000CB0C004664CC0020CB1400457D4D402CFE\r
+:100B3000CB0C0047CB10004304CC00017CD1000754\r
+:100B40009900000A000000004488000CCC9C00D7EB\r
+:100B500068880020CC9C00C6CCF00047CCD60000B2\r
+:100B6000800002E100000000CB0800442488000857\r
+:100B7000CC9C00D768880020CC9C00C6CC300047B5\r
+:100B80007C00C00CCB14004665540020CB08004507\r
+:100B90007C94802CCCCA0000840002EA0000000093\r
+:100BA0008800000000000000C838000D0BB80001EC\r
+:100BB0009B80FFFE00000000880000000000000095\r
+:100BC0008400026C000000008800000000000000AB\r
+:100BD00099C0000B00000000C0303041CB3900004C\r
+:100BE000C00BFEFF7F88C00BCCF10000CB0D0000D6\r
+:100BF000CFB100008000032400000000C0303400AA\r
+:100C0000CB390000CFB100008000032400000000B9\r
+:100C10008400034125B8001FCAF8000167B8000C22\r
+:100C2000CB8E000434C800047C8CC002CC1C00D5E0\r
+:100C300098C0001500000000840002290000000098\r
+:100C40008400023C3438000100000000C80800C3E2\r
+:100C50009880FFE0CC0000C3C9C800C194800006A2\r
+:100C600000000000840002890000000080000324CE\r
+:100C700000000000840003610000000080000324E5\r
+:100C80000000000065CC001F7CC8800CCC8000CC2C\r
+:100C9000840002B70000000084000244000000004D\r
+:100CA000C9F800D597800007C9E400DE32080001CA\r
+:100CB000988000050000000080000331CE5C00DB5E\r
+:100CC000CAE400062A640004CE40000B84000251EE\r
+:100CD0007F03000BCE70004DCACC000124CC000C69\r
+:100CE000CCDC00CD68CC0020CCDC00C4CEDC00D94C\r
+:100CF00099C0FCDC00000000C030235580000018C3\r
+:100D0000CE710000C03001C088000000CFB10000EB\r
+:100D1000C9F800CDC9C800C4648800207F8B802C2E\r
+:100D200007B40000C030FFFFCB8E0004340800047D\r
+:100D300030CC000F7CC8C00298C000110000000039\r
+:100D4000CB8A000C47B800047CB0C00B94C0000CE8\r
+:100D500000000000C8D10000CD3A000C07B8000424\r
+:100D6000288800109480000600000000C891000050\r
+:100D7000CD3A000C8000035007B800048800000042\r
+:100D800000000000CAF00006CF1C00DBCC1C00D520\r
+:100D900095C0000600000000C0303400CC310000D7\r
+:100DA0008000037500000000C80800009480000364\r
+:100DB000340C0001CCC00000C030304125B8001F09\r
+:100DC000CFB10000C030218EC00A0001348800FF7E\r
+:100DD000CCB10000CAF8000167B8000CC030FFFFBA\r
+:100DE000CB8A0004CB8A000C47B800047CB0C00B4F\r
+:100DF00094C0000ACB92000CCD0D000047B800044F\r
+:100E00002888001094800005CB92000CCD090000CA\r
+:100E10008000037947B8000488000000000000004B\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:00000001FF\r
diff --git a/firmware/radeon/REDWOOD_me.bin.ihex b/firmware/radeon/REDWOOD_me.bin.ihex
new file mode 100644 (file)
index 0000000..aaa5a66
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000040CA1FDC0120001CC000045CC00004A97\r
+:1001C0007CD0C007CC41225CCC41A1FCD44D0000C6\r
+:1001D0007C408000A0000000CC80004D800000002A\r
+:1001E000CC41225DCC000045CC00004A084C000107\r
+:1001F0007C4100007C4140001D58FFFF195C03F06A\r
+:1002000015600015CD81A102CDC12256CE01225C20\r
+:1002100094C0000521240020CE41A1FC8000007D77\r
+:1002200008CC0001CD01A1FCCC01A1027C408000E2\r
+:10023000A0000000CC80004D7C4080007C40C000CD\r
+:10024000C02A00027C4100007D2900071C940001A7\r
+:100250001C9800061C9C030015DC00087C42000072\r
+:100260007C4240009540000FC02E000405F022584B\r
+:100270007F2F0007CC310000C8280004CCC12169C1\r
+:10028000CD01216ACE81216B29B40002CC01216C01\r
+:100290009740000E29B40000800000BDC834000E55\r
+:1002A00029B400029740000929B40000C02E0004C0\r
+:1002B00005F022587F2F0007CC310000C828000429\r
+:1002C000800000BDC834000E974000047E0280000C\r
+:1002D000800000BDC834000E29B400049740FF49D7\r
+:1002E00000000000CE01216DCE41216EC828000320\r
+:1002F000C834000E9B400004C83C000E8400034E2E\r
+:10030000CC00004D29F40000974000070430A2B64D\r
+:10031000840000DFCE81A2B7CF81A2C4800000009C\r
+:10032000CFC1A2D129F40001974000070430A2BA3E\r
+:10033000840000DFCE81A2BBCF81A2C58000000077\r
+:10034000CFC1A2D229F40002974000070430A2BE18\r
+:10035000840000DFCE81A2BFCF81A2C68000000052\r
+:10036000CFC1A2D30430A2C2840000DFCE81A2C3D9\r
+:10037000CF81A2C780000000CFC1A2D4C02E00044C\r
+:100380007F2F0007CC310000C82C0004C0300006CD\r
+:100390007EF34023C03000207F6B80208800000067\r
+:1003A0007FB3C024CC00004280000000CC40001F7E\r
+:1003B0007C40C0007C4100001914003D99400013AE\r
+:1003C0000414002E840004C1041800298400025A79\r
+:1003D000C81C00130414002A840004C10418002D52\r
+:1003E000CD41A2A4C81C001395C00000C81C001376\r
+:1003F000CCC12100CD012101CCC12102CD012103BD\r
+:10040000800004BECD81A2A41D18100095800005B7\r
+:10041000C81C001329E400409640FFFFC81C0013CD\r
+:10042000CCC12175CD012176C820001496000000B2\r
+:10043000C8200014162800019A800004CC00004F48\r
+:10044000800004BECC00007F80000109CCC1217572\r
+:100450007C40C0007C410000CC000045CC00004A3C\r
+:1004600040D40003CD41225CCD01A1FCC01A0001A3\r
+:10047000041CA1FD7DD9C0077C42000008CC00010E\r
+:100480000624000106280002CE1D0000CE5D0000FB\r
+:1004900098C0FFFACE9D00007C408000A0000000C4\r
+:1004A000CC80004D7C40C0001CD0000114CC000169\r
+:1004B0007C414000950000067C418000CD41216DCB\r
+:1004C000CD81216E80000137C81C0003C0220004CA\r
+:1004D0007E160007CC210000C81C00047C424000AE\r
+:1004E00098C000047C42800080000000CDE5000040\r
+:1004F000CE412169CE81216ACDC1216B80000000EF\r
+:10050000CC01216C7C40C0007C4100007C4140005B\r
+:100510007C4180007C41C00018A41FE82A68003C90\r
+:100520009680000A7C0200007C4200003A30000302\r
+:10053000CC0000589B00000342200005042000402E\r
+:10054000800001537C0240007E0240009A4000007F\r
+:100550000A6400011CEC00109AC0000ACC00004D97\r
+:10056000C02A0004C82C00207E928007CC000041E5\r
+:10057000CC290000CEC0001E80000163C8300004FA\r
+:10058000CD01216DCD41216EC83000037F1F0006D3\r
+:100590001CF40007137800019740002A07B801688F\r
+:1005A0009F80000000000000800001787F1B800E0B\r
+:1005B0008000017C7F1B800F800001807F1B800CEE\r
+:1005C000800001847F1B800D800001887F1B8011CB\r
+:1005D0008000018C7F1B80108000019114A4000812\r
+:1005E0009B80001914A40008800001A11E6400FF74\r
+:1005F0009B80001514A40008800001A11E6400FF68\r
+:100600009B80001114A40008800001A11E6400FF5B\r
+:100610009B80000D14A40008800001A11E6400FF4F\r
+:100620009B80000914A40008800001A11E6400FF43\r
+:100630009B80000514A40008800001A11E6400FF37\r
+:1006400014A400081E6400FF2A68003C9A80FE6D16\r
+:1006500014EC00087C4340007C4380007C43C000D5\r
+:1006600096C00007CC00004DCF412169CF81216A9F\r
+:10067000CFC1216B80000000CC01216C8000000004\r
+:10068000CFF50000CC000059840004C12A68003C6A\r
+:100690009A800004C828001780000000D440007F22\r
+:1006A0009680FFAB7E0240008400028CC00E0002E8\r
+:1006B000CC000041800001AFCCC1304A9400000062\r
+:1006C000C83C001C7C40C0007C410000C01E0001F2\r
+:1006D00015240012C022000296400005C026000426\r
+:1006E000C027FFFB7D250006C02600007DD28006C6\r
+:1006F0007E12C0067D2500077C4140007C418000C1\r
+:10070000CCC121699A80000CCD01216ACD41216BB9\r
+:1007100096C0FE3CCD81216C840004C1CC00007FDA\r
+:10072000C830001A97000000C830001A800000018D\r
+:100730007C408000840004C1CC00007FC8140015F8\r
+:10074000C8180016CD41216B96C0FE2ECD81216CBC\r
+:10075000800001C6CC00007FCC0003E5C82C00203F\r
+:10076000C00E20240410300020CC226B0414300171\r
+:10077000CC000041D0110000CCD50000CEC0001E3E\r
+:10078000C80C000998C00000C80C00097C4100009A\r
+:100790007C414000CC400043CC400044C00E80006F\r
+:1007A0007C4240007C42800016AC001F96C0FE15C3\r
+:1007B000C035F000CE4003E11E780003127C000833\r
+:1007C0007FF7C0067FFBC00716780018CFC003E292\r
+:1007D000CF8003E312B000027F3F0000CF0003E4AC\r
+:1007E000800004517C80C0007C40C00018D001E82B\r
+:1007F000112800019500001006A801FF9E8000004E\r
+:100800000000000080000217C012080080000225CE\r
+:10081000C81400118000022CC8140012800002339A\r
+:10082000CCC1A2A48000023C1CE8003F800002640E\r
+:100830007CC1800B1CD0003F29280006292C001603\r
+:100840007EAE8007C81C00139A80003D0414002E61\r
+:1008500080000000CCC1A2A4C01208007C4140006E\r
+:100860007D0CC007C012000815580003155C000C71\r
+:100870007C4200007DD1C006122000147E1E40077D\r
+:100880007E4E8007CE81A2A480000000CD81A1FE13\r
+:10089000C81400110410211895400000C81400115C\r
+:1008A000D451000080000000CCC1A2A4C8140012E2\r
+:1008B0000410210695400000C8140012D451000015\r
+:1008C00080000000CCC1A2A4CCC1A2A404100001ED\r
+:1008D000CD000019840004C1CC00007FC810001BAB\r
+:1008E00099000000C810001B800000017C408000BF\r
+:1008F0002AA000042AA400147E2600070414002E57\r
+:1009000096000008041800298400025AC81C00132D\r
+:100910000414002A840004C1040C002DCD41A2A4BB\r
+:1009200004102100C81C001395C00000C81C00134F\r
+:10093000D4510000800004BECCC1A2A4840004C134\r
+:10094000041800298400025AC81C00130414002A49\r
+:10095000840004C10418002D8400025AC81C00132E\r
+:10096000800000017C40800095C00000C81C00137E\r
+:10097000CD41A2A4CC012100CC012101CD812102D5\r
+:10098000CD812103CD81A2A488000000CC00004DC0\r
+:100990001D9800017C4100007C41400099800009C5\r
+:1009A0007C420000C83C003211980010C81C000BAB\r
+:1009B0003BFC000197C0FFFFC83C0032800002767C\r
+:1009C000C83C003311980010C81C000A3BFC000111\r
+:1009D00097C0FFFFC83C00331568001D7D594007D4\r
+:1009E0009A80000411E4000A7E260007CDC000664C\r
+:1009F000CD012158CD412159CE01215ACCC1A2A40B\r
+:100A00009A80023E05100004042C000112F0001D23\r
+:100A10007D71400712E000102220000CCD0121580A\r
+:100A2000CD412159CE01215A800004BECCC1A2A4DF\r
+:100A3000043C0005CFC1A2A4C0360002880000001B\r
+:100A4000CF4120107C40C00014D0001D9900000848\r
+:100A500014D4001C9540FD6BC02600042264215470\r
+:100A6000CC25000080000000C8280004800004BEDF\r
+:100A7000CD400061840004C11C7400011C78000298\r
+:100A80009B400003C80C00298400034DC814002BB0\r
+:100A90009B8000030410001084000364CCC1A250AA\r
+:100AA000CD01A050840002FE04180400840004C19B\r
+:100AB000CC000063C83C002D8400030CC810002942\r
+:100AC000C81C002F1DDC0001C824002795C00009A8\r
+:100AD000C8340031C8380030C83C002D53740020A1\r
+:100AE0007FB7802747B80550CC000062CFFA0000DE\r
+:100AF0009A400000C8240027C82800233AA8000212\r
+:100B00009A80FFFFC8280023C0300001C8280024B5\r
+:100B10009A800000C8280024CF00005B50D800084D\r
+:100B200014DC001821DC8000CD812180CDC1218121\r
+:100B30005120000815240018CE012182CE412183C6\r
+:100B4000CD4121847C408000A0000000CC80004D7D\r
+:100B5000840004C11C7400011C7800029B40000347\r
+:100B6000C80C002A8400034DC814002C9B8000038D\r
+:100B70000410001084000364CCC1A260CD01A06009\r
+:100B8000840002FE04180980840004C1CC000064C3\r
+:100B9000C83C002E8400030CC810002AC81C002F7B\r
+:100BA0001DDC0001C824002895C00009C8340031AC\r
+:100BB000C8380030C83C002E537400207FB780270F\r
+:100BC00047B80554CC000062CFFA00009A400000FC\r
+:100BD000C8240028C8280025C82800233AA80002F5\r
+:100BE0009A80FFFFC82800239A800000C8280025AB\r
+:100BF000800002C6C03000020598C00010DC00086A\r
+:100C000014E00018CDD90000C81C0022C82400221E\r
+:100C10001DDC0FFFCDD900017E624007CE590002D6\r
+:100C2000D8185103D818510488000000D81851076B\r
+:100C30001BF800F0C036080097800003C030008029\r
+:100C400088000000C02A0004CF41217CCF01217D13\r
+:100C5000CD01217E22A8217F042400089A400000B3\r
+:100C60000A640001CC290000C82000041638001FC7\r
+:100C70009B80FFFB042400088800000000000000A7\r
+:100C8000C80C002494C0002438D400019940FFFD12\r
+:100C9000C81000237D0D00019900FFFBC80C002443\r
+:100CA00080000331C80C002594C0001B38D400011B\r
+:100CB0009940FFFDC81000237D0D00019900FFFB46\r
+:100CC000C80C0025840004C1CC00007FC83C03FB95\r
+:100CD0009BC00000C83C03FBD04003FCC03E0004A6\r
+:100CE000D20121F823FC21F9840004C1CC3D00008D\r
+:100CF000C83800041BB4003E1FB000047F02C00BC4\r
+:100D00001EE800047EB640079A40FFF6C03E00048D\r
+:100D1000D00003FC7C410000800000017C4080008A\r
+:100D20008400034D7C40C0007C408000A000000097\r
+:100D3000CC80004DC83C000E97C00003D30003E6F2\r
+:100D400088000000043C0026CFC1A2A4C83C03E6F2\r
+:100D50000BFC0001CFC003E69BC0FFFBCC00004DA5\r
+:100D6000043C0005CFC1A2A4CC01A1F4840004C1BD\r
+:100D7000CC00004788000000CC00007F84000364A2\r
+:100D80007C40C0007C408000A0000000CC80004D72\r
+:100D9000043C0022CFC1A2A4840004C1CC000048BE\r
+:100DA00088000000CC00007F8400036F7C40C000FE\r
+:100DB0007C408000A0000000CC80004D043C00235B\r
+:100DC000CFC1A2A4CC01A1F3840004C1CC0000498E\r
+:100DD00088000000CC00007F800000007C40C00044\r
+:100DE000800000007C40C000C01200017C51400720\r
+:100DF00080000000D4550000CC400065C838002DAC\r
+:100E0000C83C002EC035E000C03200047FB7800629\r
+:100E10007FF7C00623B8100023FC1000CF812154B7\r
+:100E2000CFC12155CC312155C82C0004C81C002548\r
+:100E3000C82400247DE5C00799C0FFFEC81C00251A\r
+:100E4000800000017C4080007C40C0007C410000AC\r
+:100E50001928003096800008C8280027C8240028D8\r
+:100E60009A400000C82400279A400000C8240028A7\r
+:100E7000CC0003E07C4140007C418000151C001F39\r
+:100E8000CCC000C7CD0000C895C00003C01C8000C6\r
+:100E9000CDC12010E1830000055C2000CC00004D96\r
+:100EA00080000000DC1F41007C40C0007C4100004D\r
+:100EB0007C4140007C418000CCC000C9CD0000CA0C\r
+:100EC000E1830000055CA00080000000DC1F410001\r
+:100ED0007C40C0007C4100007C4140007C4180009F\r
+:100EE000CCC000CBCD0000CCE1830000055CE94024\r
+:100EF00080000000DC1F41007C40C0007C410000FD\r
+:100F00007C4140007C418000CCC000CDCD0000CEB3\r
+:100F1000E1830000055CE88080000000DC1F4100E8\r
+:100F20007C40C0007C4100007C4140007C4180004E\r
+:100F3000CCC000CFCD0000D0E1830000055CC00034\r
+:100F400080000000DC1F41007C40C0007C410000AC\r
+:100F50007C4140007C418000CCC000D1CD0000D25B\r
+:100F6000E1830000055CF00080000000DC1F410010\r
+:100F70007C40C0007C4100007C4140007C418000FE\r
+:100F8000CCC000D3CD0000D4E1830000055CF3FCAD\r
+:100F900080000000DC1F4100D44320007C40800022\r
+:100FA000A0000000CC80004DD443A0007C40800015\r
+:100FB000A0000000CC80004DD443E9407C4080007C\r
+:100FC000A0000000CC80004DD443E8807C4080002D\r
+:100FD000A0000000CC80004DD443C0007C408000C5\r
+:100FE000A0000000CC80004DD443F0007C40800085\r
+:100FF000A0000000CC80004DD443F3FC7C40800076\r
+:10100000A0000000CC80004D041CA000CC43A00038\r
+:101010007C40C000D81FC1007C408000A0000000C0\r
+:10102000CC80004D041CC000CC43C0007C40C000FC\r
+:10103000D81FC1007C408000A0000000CC80004D83\r
+:101040007C40C000C813000294C00003C81700020F\r
+:10105000C81B0002041CF3FCCC03F3FCD81FC10026\r
+:10106000D81FC1007C408000A0000000CC80004D53\r
+:10107000C01E0010C80C002950D0000810540002F7\r
+:10108000800004287D158020C01E0020C80C002A86\r
+:1010900050D0000808540400115400027D518020F3\r
+:1010A000CDC00062D45A00007C408000A000000047\r
+:1010B000CC80004D7C40C0001CD0000311280001F2\r
+:1010C0009500000A06A804329E8000007C41800042\r
+:1010D000800004407C41C000800004467C41C00088\r
+:1010E0008000044C7C41C0007C4180007C41C000F9\r
+:1010F00014D400100554A00080000000CD9500001D\r
+:10110000C02200040598A0007DA18007CC19000032\r
+:101110008000043CC8180004C0220004CD8125D6FC\r
+:10112000222025D7CC2100008000043CC8180004F0\r
+:10113000CD81216DCDC1216E8000043CC818000313\r
+:101140007C40C000C81003E1C81403E4C81803E2DF\r
+:10115000C81C03E3CD812169CDC1216ACCC1216BBB\r
+:10116000CC01216C042000047DA180007D96400C00\r
+:101170009640FBA4CD8003E21D280003C02DF000A3\r
+:10118000111800087DAD80067DA980078000000051\r
+:10119000CD8003E27C40C00080000000CC4C03E026\r
+:1011A0001C8CFFFFD44D00007C408000A00000009C\r
+:1011B000CC80004DC8140023315800049580FFFFF7\r
+:1011C000C8140023CC00005BCC412180204C80005F\r
+:1011D000CCC1218114D0001FCC412182CC4121837C\r
+:1011E0009500FB88CC412184C81400239940FFFF5F\r
+:1011F000C8140023800000017C408000C016000459\r
+:1012000021542140CC550000C81800048000000083\r
+:10121000CC0003E0C02A00047C40C000CCC1217C8B\r
+:10122000CC41217DCC41217E7C41800014FC001FFB\r
+:101230001D98FFFF39B0000322A0217F9B0000030F\r
+:10124000419C0005041C004099C0000009DC00011D\r
+:10125000CC210000C8240004166C001F419C00052E\r
+:101260009AC0FFFACC80004D9BC0FB6600000000D6\r
+:1012700080000000CC0003E07C40C0007C41000006\r
+:101280001518001F511400209980000B191C003103\r
+:10129000CD0000627D4D4027D456000095C0FB591B\r
+:1012A000C82000269A000000C82000268000000107\r
+:1012B0007C408000E03A0000C0260004CCC12169D7\r
+:1012C0007D250007CD01216A0BB80002CC41216BBE\r
+:1012D0009B80FFFECC41216C99C0FD10CC00007FAB\r
+:1012E000800000017C408000C00E0100CC00004165\r
+:1012F000CCC1304AC83C007FCC00007F8000000099\r
+:10130000CC00007FCC00007F88000000CC00007F74\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001046800100003001200050015001A16\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007700300079003200EA0034008E6F\r
+:1014500000350062003900EC003A0114003B01291C\r
+:10146000003C0141003D01B1003F00E90041046D35\r
+:101470000042047F00430485004401D60045014139\r
+:10148000004601FA004701FA004801FA004A0291B9\r
+:10149000004B0376004C029D004D02D4004E032009\r
+:1014A000004F03290051036A005203480053035FB1\r
+:1014B000005403780057037A00600392006103AA86\r
+:1014C0000062037E006303B4006403BE006503C8CA\r
+:1014D000006603D2006703DC006803E6006903EAE4\r
+:1014E000006A041C006B03EE006C03F2006D03F64F\r
+:1014F000006E03FA006F03FE007003F60071042211\r
+:101500000072041000730402007404090075042DB5\r
+:10151000007A049E007C0450007D0465000F04BA2C\r
+:10152000000F04BA000F04BA000F04BA000F04BA87\r
+:10153000000F04BA000F04BA000F04BA000F04BA77\r
+:10154000000F04BA000F04BA000F04BA000F04BA67\r
+:10155000000F04BA000F04BA000F04BA000F04BA57\r
+:10156000000F04BA000F04BA000F04BA000F04BA47\r
+:10157000000F04BA000F04BA000F04BA000F04BA37\r
+:00000001FF\r
diff --git a/firmware/radeon/REDWOOD_pfp.bin.ihex b/firmware/radeon/REDWOOD_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..f488810
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC40002980000337CC40002AED\r
+:100040009900000500000000CC40002B8000033721\r
+:10005000CC40002CCC40002D80000337CC40002E3B\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:1000700080000337CC00005280000337CC000054CE\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000043F3\r
+:1000E000CD400043C81C001DD100004399C000054D\r
+:1000F000CC000055C820001FD80003C0CC00004031\r
+:10010000C8280016D80006C01AA800279680000349\r
+:10011000CC000040D080005CCC800040CC0000408F\r
+:10012000CC4000407C408000A0000000042800017A\r
+:10013000C810002CC80C002B511000207CD0C02708\r
+:100140007CC5002045180008C99E0000C82403FD96\r
+:100150007DE68011968000037E5EC0017C02C006B1\r
+:10016000CEC3A29E55140020CC00006CCD00006DC3\r
+:10017000CD40006DCD000043CD400043C81C001DA4\r
+:10018000D140004399C00005CC000055C820001F95\r
+:10019000D80003C0CC000040C8280016D80006C014\r
+:1001A0001AA8002796800003CC800040D080005C15\r
+:1001B000CC800040CC000040CC4000407C4080001F\r
+:1001C000A000000004280001C81800151D980001B7\r
+:1001D0007C424000958002C07C428000C81C002008\r
+:1001E000C037C0007C40C0007C4100007CB4800669\r
+:1001F000C03600031AB801E897800007D04003E03A\r
+:100200008400033ACC00007FC83803E09B800000E4\r
+:10021000C83803E099C00000C81C00207CB48007E7\r
+:1002200010D400027D654000CD400043CE800043E5\r
+:10023000CD000043CC800040CE400040CE80004046\r
+:10024000CCC00040E03A00009780FF6ECD00004037\r
+:100250007C40C000800000887C4100001C8C0002B3\r
+:10026000C810001C98C00009C820001F9900000495\r
+:10027000C81C00068400033DCC000052C8180015BD\r
+:10028000800000741D980002C810001E9900FFFC39\r
+:10029000C81C00088400033DCC000054C818001599\r
+:1002A000800000741D9800021C8C0002C810001D04\r
+:1002B00098C0000FC814004999000005C820001F0D\r
+:1002C000C81C00078400033DCC000053C81800156B\r
+:1002D00094C00003189401E80554000620100001A2\r
+:1002E0007D150003800000747D9180069940FFF821\r
+:1002F000C820001F8400033DC81C0007800000B315\r
+:10030000CC00006EC00E8080CC00006704D08080DE\r
+:10031000CC000068CD0003F1CD0003F2CD0003F363\r
+:10032000CD0003F4CD0003F6CD0003F7CD0003F8B4\r
+:1003300080000005CD0003F9CC800040D44000408F\r
+:100340007C408000A000000004280001C820001F9D\r
+:10035000800000D8D8000440C820001FD800034007\r
+:10036000CC000040CC800040D44000407C40800065\r
+:10037000A000000004280001C820001FD80003C00E\r
+:10038000800000E8CC000040C820001F800000E78B\r
+:10039000D8000440C820001FD8000340CC00004013\r
+:1003A000C80C0029C810002ACC800040CC40004076\r
+:1003B000511000207CD0C027105000027D0D00207D\r
+:1003C00055140020CD000043CD400043D0400043F1\r
+:1003D000CC0000407C408000A00000000428000108\r
+:1003E000C820001FD80003C0CC000040CC800040D3\r
+:1003F000D44000407C408000A000000004280001A0\r
+:100400001C8C0002C810001D98C00012C8140049BE\r
+:1004100099000005C820001FC81C00078400033D88\r
+:10042000CC000053C80C002FCC800040CC400040D2\r
+:10043000CC400040CC4000407CC4C000CCC0004058\r
+:10044000D44000407C408000A0000000042800014F\r
+:100450009940FFF5C820001F8400033DC81C000719\r
+:1004600080000109CC00006E7C40C000C81000472D\r
+:100470009900000BC814004499400004C8180009F2\r
+:10048000CD800040CC00004080000133CC80004093\r
+:100490007C40C000C81000479500FFF7C814004515\r
+:1004A00099400004C818000ACD800040CC000040EC\r
+:1004B00080000133D80008407C40C000C8100047CD\r
+:1004C0009900FFFC00000000CC800040CCC0004040\r
+:1004D000D44000407C408000A000000004280001BF\r
+:1004E000C8100046D8000740CD0000408400014AF3\r
+:1004F000CD000040C80C004394C0000AC814004856\r
+:100500008000014304100003C8100046D80007C053\r
+:10051000CD0000408400014ACD000040C8140048CE\r
+:100520009D400000CC00006AC82800161EA80001EB\r
+:100530009A800003C029000188000000C02C0156E9\r
+:10054000CE80005CD80008C0CEC00040880000000B\r
+:10055000CC0000401C8C0002C810001EC820001FE8\r
+:1005600094C00008C814001C9900000AC81C0008A8\r
+:100570008400033DCC00005480000165CC80004025\r
+:1005800099400004C81C00068400033DCC000052C2\r
+:10059000CC80004080000000D4400040CC400027C8\r
+:1005A000CC40002880000337CC00006BC032000331\r
+:1005B000C037FFFF800001707CB080077C434000A3\r
+:1005C000C8200028C81C0027C8180026CF43A29EB8\r
+:1005D0007C414000522000207DE1C0277D58C003AF\r
+:1005E0007CDCC02054D0002080000185CC800040FD\r
+:1005F0007C418000CC80004080000182CD800040A2\r
+:10060000C019FFFFCC800040CD83A29E7C40C0007B\r
+:100610007C4100007C414000CCC3A1FACD03A1F98C\r
+:10062000CD43A29DCCC00040CD000040CD40004055\r
+:10063000CC4000407C408000A00000000428000165\r
+:100640007C40C0001CD00001CCC3A29F95000003D9\r
+:10065000D0400026D0800026CC80004080000000E2\r
+:10066000CCC000407C40C000CC800040CCC3A2A2E3\r
+:1006700080000000CCC000407C40C00014D4001FAB\r
+:10068000CC800040954000037C410000CCC0005964\r
+:100690001518001FCCC0004095800003CD0000401D\r
+:1006A000CD00005A80000337CC00007FC820001F17\r
+:1006B0007C410000D8200244CE2000447C41400010\r
+:1006C0007C418000CDA00049CD200041CD6000419B\r
+:1006D000CDA0004115100008115400187D53C0072B\r
+:1006E000CFC0002F06200001CE0000588000033745\r
+:1006F000CC00007FC820001FCA0C001794C0000562\r
+:100700007C410000D82002C6800001AFCE20004608\r
+:10071000CC000048800001C500000000C820001F78\r
+:100720007C4180000A200001CA14001ACA18001770\r
+:100730007D59800795800005CE000058CCA000466A\r
+:1007400080000000CD600046CCA000448000000086\r
+:10075000CD60004480000337CC40006ACC8000406C\r
+:1007600080000000D44000407C40C0007C4100007C\r
+:100770007C4380007C43C000041C0002CF80004208\r
+:10078000CFC00042CDC00042041C0020CCC00042BB\r
+:10079000CD000042CDC00042041C0007042000012F\r
+:1007A0007C024000C8140003C818000351980020C0\r
+:1007B0007D594027C8280003C82C0003C830000317\r
+:1007C000C834000352EC00207EAE80275374002012\r
+:1007D0007F3700277F2B40217E76402056A8003FA0\r
+:1007E0005730003F7EB280067E2A000699C0FFF295\r
+:1007F00009DC00019680FFE153F400207F7B402755\r
+:100800007D65402055580020CC00005BCD7600006F\r
+:10081000CDB60000C82000419A000000C820004169\r
+:10082000800000017C4080007C40C0007C410000D2\r
+:10083000CCC003FECD0003FFCCC00042CD0000427F\r
+:100840001514001F191800F0275C00017D760006C2\r
+:10085000998000057D5E4006CC0000428000033791\r
+:10086000CC00004D15980001152C0008998000312E\r
+:100870001EEC0001960000041530000C80000337C8\r
+:10088000CC00004204140020CD4000421F30000183\r
+:100890002028000104380020043C0007C81400038D\r
+:1008A000C8180003C81C0003C82000037D5D400D6C\r
+:1008B0007DA1C00D7D5D40071610001F159C001F17\r
+:1008C0007D1D00067D1740067E9280069B4000122B\r
+:1008D0000BB800049BC0FFF20BFC0001C80C03FE28\r
+:1008E0009A800009C81003FF9B0000FDCC00004D5A\r
+:1008F00004140020CCC00042CD000042800002243D\r
+:10090000CD40004296C000F6CC00004D8000033779\r
+:10091000CC00004E9AC00003CC00004DCC00004E2D\r
+:100920009780FDB8E383000080000000DC0301FF36\r
+:1009300096400004CC00004E80000337CC000042FB\r
+:10094000D2000042C8080003C80C0003C81000030E\r
+:10095000C8140003C8180003C81C0003C8240003FF\r
+:10096000C828000315FC001F16B0001F7FF3C00647\r
+:1009700014F0001F7FF3C0061570001F7FF3C00640\r
+:100980007D88800197C0000D7DCCC0017E510001A3\r
+:100990007E9540017C90800C7CD4C00C9AC00003F2\r
+:1009A0007C8F400624B400019B4000CDCC00004D5C\r
+:1009B00080000337CC00004EC80C03FEC81003FFB4\r
+:1009C000CCC0004280000250CD0000427C40C000FC\r
+:1009D0007C4100001914003BCC00005B95400013E3\r
+:1009E000C8140040315800029580FFFFC814004031\r
+:1009F000CC000063211C8000CCC12185CDC12186A3\r
+:100A00001514001FCC412187CC4121889540FD7DE4\r
+:100A1000CC412189C81400409940FFFFC814004010\r
+:100A2000800000017C408000CC800040CCC00040B1\r
+:100A3000CD00004080000000D4400040D08003E0A2\r
+:100A4000CC8000408400033ACC400040C80C03E056\r
+:100A500098C00000C80C03E07C408000A0000000AB\r
+:100A60007E8280067C40C000840002A214D0001F59\r
+:100A70009900FD64D04003E08400033ACC00007F7D\r
+:100A800080000294C80C03E0CC800040CCC0004041\r
+:100A900088000000D4400040CC800040CC400040A2\r
+:100AA000CC400040CC4000407C40C000CCC0002185\r
+:100AB000CCC00040D4400040C037FFFFD00003FB53\r
+:100AC000D00003FC80000000CF4003FD7C40C0004C\r
+:100AD00014DC001D99C00007CC80004018DC003CED\r
+:100AE00099C0007FCCC0004080000337CC00006A72\r
+:100AF00018D8003CCD800066CC00006A8000033727\r
+:100B0000CCC000407C40C000505000208400033A1C\r
+:100B1000CC00005D7CD0C027C820001FC8D60000D4\r
+:100B2000994000087C438000E3830000CFA0004F81\r
+:100B30008400033ACC00005E80000000D440007FB7\r
+:100B400080000337CC00005E8400033ACC00005DD7\r
+:100B5000C820001F7C40C000C036FF00C810002124\r
+:100B6000C0303FFF7CF540067D5180067D81800AC4\r
+:100B7000998000087CF38006E3830000CFA0004F3B\r
+:100B80008400033ACC00005E80000000D440007F67\r
+:100B900080000337CC00005E8400033A7C40C00034\r
+:100BA00014DC000895C000191CDC00107C4100001A\r
+:100BB00099C0000450540020800002F2C91D0000BA\r
+:100BC0007D150027C91E00007C4200007C424000C9\r
+:100BD0007C4180007DE5C0067DE280119A80FD09A0\r
+:100BE00041AC00059AC000000AEC00011CDC0010BA\r
+:100BF00099C0000400000000800002F5C91D00003B\r
+:100C0000800002F5C91E0000CC800040CCC000402E\r
+:100C100080000000D4400040C820001FD8000340DE\r
+:100C2000CC000040CC800040D44000407C4080009C\r
+:100C3000A000000004280001C820001FD80003C045\r
+:100C4000CC000040CC800040D44000407C4080007C\r
+:100C5000A0000000042800017C40C0001CD0000659\r
+:100C60002910000699000007C814001C99400005CF\r
+:100C7000CC000052C81C00068400033DC820001FA1\r
+:100C8000CC800040CCC0004080000000D440004038\r
+:100C90007C40C0007C4100001518001FCD00005BA7\r
+:100CA000998000045114002080000000D44D000001\r
+:100CB0007D4D4027191C0031D456000095C0FCD151\r
+:100CC000C82000419A000000C820004180000001B7\r
+:100CD0007C40800080000000D440007FCC00007F7A\r
+:100CE00080000000CC00007FCC00007F8800000066\r
+:100CF000CC00007FCDC0004088000000CC00004048\r
+:100D000000000000000000000000000000000000E3\r
+:100D100000000000000000000000000000000000D3\r
+:100D200000000000000000000000000000000000C3\r
+:100D300000000000000000000000000000000000B3\r
+:100D400000000000000000000000000000000000A3\r
+:100D50000000000000000000000000000000000093\r
+:100D60000000000000000000000000000000000083\r
+:100D70000000000000000000000000000000000073\r
+:100D80000000000000000000000000000000000063\r
+:100D90000000000000000000000000000000000053\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:1010000000020003000303060004030E000501AB09\r
+:10101000000600D6000700E5000800F8000900DE21\r
+:10102000000A00D3000B00E2000C011A000D01249D\r
+:10103000000E0138000F0142001003350011000AB4\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025004C00260167001701C7001801D5C4\r
+:10106000002202C1002302D20027017C001F01DA06\r
+:101070000020020A0028019E0029016B002A01902D\r
+:10108000002B0180002F0199003201BD00340316AE\r
+:101090000035016F003901D7003C02E6003E033500\r
+:1010A000003F01AB004102730042028F00430299EE\r
+:1010B000004402A6004A02B300550309005603117A\r
+:1010C0000060007200610097006200C1006300AA26\r
+:1010D000006400AA006500AA006600AA006700AAD2\r
+:1010E000006800CE006900D9006A012E006B00FB89\r
+:1010F000006C00FB006D00FB006E00FB006F00FB4E\r
+:1011000000700100007300E8007400E800750155EC\r
+:10111000007B03240000000500000005000000051E\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/REDWOOD_rlc.bin.ihex b/firmware/radeon/REDWOOD_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..9cc48c4
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC000085FB\r
+:1000100004180001CD80000ECD800083CC0000824A\r
+:10002000CD800081CC00000B8000004A0000000061\r
+:10003000CC00000ECC00000EC8100082202801C3A6\r
+:10004000201C0000C8100082C80800857F8B800734\r
+:10005000C808008194800030000000008000005437\r
+:1000600000000000C9CC008394C00017000000000D\r
+:1000700084000097200C0001840000AA20380000B2\r
+:1000800097800011200C000DC0302009CCF1000039\r
+:10009000C030200AC03418181374000823741818CC\r
+:1000A000CB0D00007CF4C006C808001A988000063A\r
+:1000B000201C000194C0FFFB0000000080000041F4\r
+:1000C0007DC1C006840000BD11B8001F840000AAD5\r
+:1000D0002038000184000097200C0000C03001C0CF\r
+:1000E000CB3900002038000095C0FFD3CF8000033B\r
+:1000F0007DC1C006840000BD203800008000000DD6\r
+:10010000CF80000320380001CF800003C810008298\r
+:10011000CC000081C808001A9480000E0000000086\r
+:10012000CD80000E00000000840000A820380002EE\r
+:10013000CC310000840000AA20380001CD8000816D\r
+:1001400084000097200C00008000000D00000000DB\r
+:10015000C83800569B80006B201C0000C838005730\r
+:100160009B800068201C0001201C0000C808008142\r
+:100170009480001200000000C82800009680000F44\r
+:1001800020080001CD80000ECC8000001C1C000067\r
+:100190002A8801BB9480000400000000800000B8A1\r
+:1001A000000000002A8801BC988000440000000084\r
+:1001B0009500002300000000C82800029680000679\r
+:1001C00020080001CD80000ECC8000028000008F4E\r
+:1001D00000000000C8280001968000070000000011\r
+:1001E00020080001CD80000ECC8000018000008F2F\r
+:1001F00000000000C82800039680000900000000ED\r
+:10020000CD80000E2A8C01E598C0FF9720080001E0\r
+:10021000CC8000038000008F00000000C82800048C\r
+:100220009680FF850000000020080001CD80000EB0\r
+:10023000CC8000048000008F000000008400009348\r
+:10024000000000008000000D000000001EA800FF5C\r
+:10025000CE80000C8800000000000000C030039039\r
+:10026000CB390000C00BFFFE7F8B800610CC001046\r
+:100270007F8F8007CFB1000088000000CB390000DD\r
+:10028000CFB10000CD80000ECB39000017B80004BC\r
+:100290009780FFFE000000008800000000000000C2\r
+:1002A000800000A0C03001C1C0302003CFB10000E9\r
+:1002B00088000000CB390000C9F800839B8000044F\r
+:1002C000000000008000000D00000000CC1C008336\r
+:1002D000840000BD11B8001F8000000D0000000068\r
+:1002E000CD9C0083840000BD203800009500FF54A1\r
+:1002F00000000000C03001C088000000CFB1000045\r
+:1003000099C0000BC830004023300002CF000040ED\r
+:10031000840000D520380003C83000401F3003FDA2\r
+:10032000CF00004080000054CC000056C830004090\r
+:1003300023300040CF000040840000E62038000158\r
+:10034000C83000401F3003BFCF0000408000005481\r
+:10035000CC000056840000F100000000C0302008EE\r
+:10036000840000F92038FFFFC0302008CC310000A5\r
+:10037000CB390000C0300398840000F92038010018\r
+:10038000C0300398CC310000CB090000C03021B64A\r
+:1003900088000000CC310000840000F10000000063\r
+:1003A00020380001C0300398840000F913B800140D\r
+:1003B000CC000057C0300398CC310000880000000A\r
+:1003C000CB090000CF9C0016CD80000EC9F00018AC\r
+:1003D0007F38800C9480FFFE000000008800000041\r
+:1003E00000000000CFB10000CB3900002008001F42\r
+:1003F0009880000008880001CC1C0016C9F0001B82\r
+:100400009700FFFF000000008800000000000000CF\r
+:1004100000000000000000000000000000000000DC\r
+:1004200000000000000000000000000000000000CC\r
+:1004300000000000000000000000000000000000BC\r
+:1004400000000000000000000000000000000000AC\r
+:10045000000000000000000000000000000000009C\r
+:10046000000000000000000000000000000000008C\r
+:10047000000000000000000000000000000000007C\r
+:10048000000000000000000000000000000000006C\r
+:10049000000000000000000000000000000000005C\r
+:1004A000000000000000000000000000000000004C\r
+:1004B000000000000000000000000000000000003C\r
+:1004C000000000000000000000000000000000002C\r
+:1004D000000000000000000000000000000000001C\r
+:1004E000000000000000000000000000000000000C\r
+:1004F00000000000000000000000000000000000FC\r
+:1005000000000000000000000000000000000000EB\r
+:1005100000000000000000000000000000000000DB\r
+:1005200000000000000000000000000000000000CB\r
+:1005300000000000000000000000000000000000BB\r
+:1005400000000000000000000000000000000000AB\r
+:10055000000000000000000000000000000000009B\r
+:10056000000000000000000000000000000000008B\r
+:10057000000000000000000000000000000000007B\r
+:10058000000000000000000000000000000000006B\r
+:10059000000000000000000000000000000000005B\r
+:1005A000000000000000000000000000000000004B\r
+:1005B000000000000000000000000000000000003B\r
+:1005C000000000000000000000000000000000002B\r
+:1005D000000000000000000000000000000000001B\r
+:1005E000000000000000000000000000000000000B\r
+:1005F00000000000000000000000000000000000FB\r
+:1006000000000000000000000000000000000000EA\r
+:1006100000000000000000000000000000000000DA\r
+:1006200000000000000000000000000000000000CA\r
+:1006300000000000000000000000000000000000BA\r
+:1006400000000000000000000000000000000000AA\r
+:10065000000000000000000000000000000000009A\r
+:10066000000000000000000000000000000000008A\r
+:10067000000000000000000000000000000000007A\r
+:10068000000000000000000000000000000000006A\r
+:10069000000000000000000000000000000000005A\r
+:1006A000000000000000000000000000000000004A\r
+:1006B000000000000000000000000000000000003A\r
+:1006C000000000000000000000000000000000002A\r
+:1006D000000000000000000000000000000000001A\r
+:1006E000000000000000000000000000000000000A\r
+:1006F00000000000000000000000000000000000FA\r
+:1007000000000000000000000000000000000000E9\r
+:1007100000000000000000000000000000000000D9\r
+:1007200000000000000000000000000000000000C9\r
+:1007300000000000000000000000000000000000B9\r
+:1007400000000000000000000000000000000000A9\r
+:100750000000000000000000000000000000000099\r
+:100760000000000000000000000000000000000089\r
+:100770000000000000000000000000000000000079\r
+:100780000000000000000000000000000000000069\r
+:100790000000000000000000000000000000000059\r
+:1007A0000000000000000000000000000000000049\r
+:1007B0000000000000000000000000000000000039\r
+:1007C0000000000000000000000000000000000029\r
+:1007D0000000000000000000000000000000000019\r
+:1007E0000000000000000000000000000000000009\r
+:1007F00000000000000000000000000000000000F9\r
+:1008000000000000000000000000000000000000E8\r
+:1008100000000000000000000000000000000000D8\r
+:1008200000000000000000000000000000000000C8\r
+:1008300000000000000000000000000000000000B8\r
+:1008400000000000000000000000000000000000A8\r
+:100850000000000000000000000000000000000098\r
+:100860000000000000000000000000000000000088\r
+:100870000000000000000000000000000000000078\r
+:100880000000000000000000000000000000000068\r
+:100890000000000000000000000000000000000058\r
+:1008A0000000000000000000000000000000000048\r
+:1008B0000000000000000000000000000000000038\r
+:1008C0000000000000000000000000000000000028\r
+:1008D0000000000000000000000000000000000018\r
+:1008E0000000000000000000000000000000000008\r
+:1008F00000000000000000000000000000000000F8\r
+:1009000000000000000000000000000000000000E7\r
+:1009100000000000000000000000000000000000D7\r
+:1009200000000000000000000000000000000000C7\r
+:1009300000000000000000000000000000000000B7\r
+:1009400000000000000000000000000000000000A7\r
+:100950000000000000000000000000000000000097\r
+:100960000000000000000000000000000000000087\r
+:100970000000000000000000000000000000000077\r
+:100980000000000000000000000000000000000067\r
+:100990000000000000000000000000000000000057\r
+:1009A0000000000000000000000000000000000047\r
+:1009B0000000000000000000000000000000000037\r
+:1009C0000000000000000000000000000000000027\r
+:1009D0000000000000000000000000000000000017\r
+:1009E0000000000000000000000000000000000007\r
+:1009F00000000000000000000000000000000000F7\r
+:100A000000000000000000000000000000000000E6\r
+:100A100000000000000000000000000000000000D6\r
+:100A200000000000000000000000000000000000C6\r
+:100A300000000000000000000000000000000000B6\r
+:100A400000000000000000000000000000000000A6\r
+:100A50000000000000000000000000000000000096\r
+:100A60000000000000000000000000000000000086\r
+:100A70000000000000000000000000000000000076\r
+:100A80000000000000000000000000000000000066\r
+:100A90000000000000000000000000000000000056\r
+:100AA0000000000000000000000000000000000046\r
+:100AB0000000000000000000000000000000000036\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/SUMO2_me.bin.ihex b/firmware/radeon/SUMO2_me.bin.ihex
new file mode 100644 (file)
index 0000000..cb9feb5
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC4000407C40C000DB\r
+:10016000CD41225DCC400045CC40004ACD01225C0F\r
+:10017000CC41A1FC7C408000A0000000CC80004D60\r
+:1001800080000000CC4122577C418000CC400045DB\r
+:10019000CC40004ACC41225CCC41A1FC7C40800098\r
+:1001A000A0000000CC80004DCC0000458000006520\r
+:1001B000CC00004AC00E0001CC000045CC00004A33\r
+:1001C000CC41225CCC41A1FCD44DA1FD7C408000FF\r
+:1001D000A0000000CC80004D80000000CC41225DDA\r
+:1001E000CC000045CC00004A084C00017C410000D6\r
+:1001F0007C4140001D58FFFF195C03F0156000159D\r
+:10020000CD81A102CDC12256CE01225C94C0000551\r
+:1002100021240020CE41A1FC8000007C08CC0001FC\r
+:10022000CD01A1FCCC01A1027C408000A000000017\r
+:10023000CC80004D7C4080007C40C000C02A000281\r
+:100240007C4100007D2900071C9400011C980006D9\r
+:100250001C9C030015DC00087C4200007C4240002E\r
+:100260009540000FC02E000405F022587F2F000794\r
+:10027000CC310000C8280004CCC12169CD01216A1D\r
+:10028000CE81216B29B40002CC01216C9740000E75\r
+:1002900029B40000800000BCC834000E29B400025C\r
+:1002A0009740000929B40000C02E000405F0225830\r
+:1002B0007F2F0007CC310000C8280004800000BC5C\r
+:1002C000C834000E974000047E028000800000BC0D\r
+:1002D000C834000E29B400049740FF4A0000000013\r
+:1002E000CE01216DCE41216EC8280003C834000E16\r
+:1002F0009B400004C83C000E8400035CCC00004D11\r
+:1003000029F40000974000070430A2B6840000DE04\r
+:10031000CE81A2B7CF81A2C480000000CFC1A2D1FC\r
+:1003200029F40001974000070430A2BA840000DEDF\r
+:10033000CE81A2BBCF81A2C580000000CFC1A2D2D6\r
+:1003400029F40002974000070430A2BE840000DEBA\r
+:10035000CE81A2BFCF81A2C680000000CFC1A2D3B0\r
+:100360000430A2C2840000DECE81A2C3CF81A2C726\r
+:1003700080000000CFC1A2D4C02E00047F2F000750\r
+:10038000CC310000C82C0004C03000067EF34023AE\r
+:10039000C03000207F6B8020880000007FB3C02425\r
+:1003A000CC00004280000000CC40001F7C40C00018\r
+:1003B0007C4100001914003D994000130414002EE4\r
+:1003C000840004A10418002984000265C81C0013DD\r
+:1003D0000414002A840004A10418002DCD41A2A415\r
+:1003E000C81C001395C00000C81C0013CCC121001C\r
+:1003F000CD012101CCC12102CD0121038000049E49\r
+:10040000CD81A2A41D18100095800005C81C001302\r
+:1004100029E400409640FFFFC81C0013CCC12175A1\r
+:10042000CD012176C820001496000000C8200014D9\r
+:10043000162800019A800004CC00004F8000049E22\r
+:10044000CC00007F80000108CCC121757C40C00039\r
+:100450007C410000CC000045CC00004A40D40003A1\r
+:10046000CD41225CCD01A1FCC01E00017C420000F8\r
+:1004700008CC00010624000106280002CE1DA1FDC3\r
+:10048000CE5DA1FD98C0FFFACE9DA1FD7C4080000D\r
+:10049000A0000000CC80004D7C40C0001CD00001BA\r
+:1004A00014CC00017C414000950000067C41800096\r
+:1004B000CD41216DCD81216E80000134C81C000327\r
+:1004C000C02200047E160007CC210000C81C0004D6\r
+:1004D0007C42400098C000047C4280008000000004\r
+:1004E000CDE50000CE412169CE81216ACDC1216BCD\r
+:1004F00080000000CC01216C7C40C0007C410000E9\r
+:100500007C4140007C4180007C41C00018A41FE871\r
+:100510002A68003C9680000A7C0200007C420000B1\r
+:100520003A300003CC0000589B0000034220000535\r
+:1005300004200040800001507C0240007E02400008\r
+:100540009A4000000A6400011CEC00109AC0000AE6\r
+:10055000CC00004DC02A0004C82C00207E928007E9\r
+:10056000CC000041CC290000CEC0001E80000160FC\r
+:10057000C8300004CD01216DCD41216EC83000038B\r
+:100580007F1F00061CF40007137800019740002A23\r
+:1005900007B801659F800000000000008000017521\r
+:1005A0007F1B800E800001797F1B800F8000017D02\r
+:1005B0007F1B800C800001817F1B800D80000185E6\r
+:1005C0007F1B8011800001897F1B80108000018EBD\r
+:1005D00014A400089B80001914A400088000019E48\r
+:1005E0001E6400FF9B80001514A400088000019E7B\r
+:1005F0001E6400FF9B80001114A400088000019E6F\r
+:100600001E6400FF9B80000D14A400088000019E62\r
+:100610001E6400FF9B80000914A400088000019E56\r
+:100620001E6400FF9B80000514A400088000019E4A\r
+:100630001E6400FF14A400081E6400FF2A68003C2A\r
+:100640009A80FE7014EC00087C4340007C438000DC\r
+:100650007C43C00096C00007CC00004DCF4121690B\r
+:10066000CF81216ACFC1216B80000000CC01216CB9\r
+:1006700080000000CFF50000CC000059840004A1E8\r
+:100680002A68003C9A800004C828001780000000F7\r
+:10069000D440007F9680FFAB7E024000840002972A\r
+:1006A000C00E0002CC000041800001ACCCC1304A39\r
+:1006B00094000000C83C001C7C40C0007C4100004D\r
+:1006C000C01E000115240012C02200029640000541\r
+:1006D000C0260004C027FFFB7D250006C0260000C1\r
+:1006E0007DD280067E12C0067D2500077C41400039\r
+:1006F0007C418000CCC121699A80000CCD01216A27\r
+:10070000CD41216B96C0FE3FCD81216C840004A1B8\r
+:10071000CC00007FC830001A97000000C830001AD3\r
+:10072000800000017C408000840004A1CC00007F98\r
+:10073000C8140015C8180016CD41216B96C0FE31B3\r
+:10074000CD81216C800001C3CC00007F7C40C000C3\r
+:100750007C40800014940010115400051C88FFFF99\r
+:10076000108800057C40C00014D000101CCCFFFF96\r
+:10077000C01A000405981BA4CC190000C818000476\r
+:100780001D980FFF7D1900109900FE1E7D8D001031\r
+:100790009900FE1CCC000058CC000059840004A134\r
+:1007A000CC812174C80C001794C0FFFFCC00005905\r
+:1007B000800000017C408000CC0003E5C82C0020B4\r
+:1007C000C00E20240410300020CC226B0414300111\r
+:1007D000CC000041D0110000CCD50000CEC0001EDE\r
+:1007E000C80C000998C00000C80C00097C4100003A\r
+:1007F0007C414000CC0003E7CC0003E8CC0003E9D7\r
+:10080000CC400043CC400044D440007F8000000036\r
+:100810007C80C0007C40C00018D001E81128000195\r
+:100820009500001006A8020A9E800000000000004B\r
+:1008300080000222C012080080000230C81400119B\r
+:1008400080000237C81400128000023ECCC1A2A46E\r
+:10085000800002471CE8003F8000026F7CC1800BD3\r
+:100860001CD0003F29280006292C00167EAE8007E8\r
+:10087000C81C00139A80003D0414002E8000000064\r
+:10088000CCC1A2A4C01208007C4140007D0CC0076E\r
+:10089000C012000815580003155C000C7C420000D3\r
+:1008A0007DD1C006122000147E1E40077E4E8007B8\r
+:1008B000CE81A2A480000000CD81A1FEC814001149\r
+:1008C0000410211895400000C8140011D4510000F4\r
+:1008D00080000000CCC1A2A4C8140012041021069C\r
+:1008E00095400000C8140012D451000080000000A0\r
+:1008F000CCC1A2A4CCC1A2A404100001CD00001957\r
+:10090000840004A1CC00007FC810001B99000000E7\r
+:10091000C810001B800000017C4080002AA0000459\r
+:100920002AA400147E2600070414002E9600000856\r
+:100930000418002984000265C81C00130414002A4E\r
+:10094000840004A1040C002DCD41A2A404102100B8\r
+:10095000C81C001395C00000C81C0013D45100002F\r
+:100960008000049ECCC1A2A4840004A10418002924\r
+:1009700084000265C81C00130414002A840004A12A\r
+:100980000418002D84000265C81C001380000001BB\r
+:100990007C40800095C00000C81C0013CD41A2A47B\r
+:1009A000CC012100CC012101CD812102CD81210387\r
+:1009B000CD81A2A488000000CC00004D1D9800014C\r
+:1009C0007C4100007C414000998000097C4200008D\r
+:1009D000C83C003211980010C81C000B3BFC000101\r
+:1009E00097C0FFFFC83C003280000281C83C003342\r
+:1009F00011980010C81C000A3BFC000197C0FFFFC3\r
+:100A0000C83C00331568001D7D5940079A800004DA\r
+:100A100011E4000A7E260007CDC00066CD012158F2\r
+:100A2000CD412159CE01215ACCC1A2A49A800213F2\r
+:100A300005100004042C000112F0001D7D71400718\r
+:100A400012E000102220000CCD012158CD41215987\r
+:100A5000CE01215A8000049ECCC1A2A4043C000512\r
+:100A6000CFC1A2A4C036000288000000CF412010F0\r
+:100A70007C40C00014D0001D9900000814D4001C54\r
+:100A80009540FD60C026000422642154CC2500005E\r
+:100A900080000000C82800048000049ECD40006152\r
+:100AA000840004A11C7400011C7800029B40000318\r
+:100AB000C80C00298400035BC814002B9B80000332\r
+:100AC0000410001084000372CCC1A250CD01A050CC\r
+:100AD0008400030C04180400840004A1CC0000630B\r
+:100AE000C83C002D8400031AC8100029C81C002F20\r
+:100AF0001DDC0001C824002795C00009C83400315E\r
+:100B0000C8380030C83C002D537400207FB78027C0\r
+:100B100047B80550CC000062CFFA00009A400000B0\r
+:100B2000C8240027C82800233AA800029A80FFFFA3\r
+:100B3000C8280023C0300001C82800249A80000083\r
+:100B4000C8280024CF00005B50D8000814DC00182F\r
+:100B5000C03E100021DC80007DFDC007CD812180DA\r
+:100B6000CDC1218151200008152400187E7E400748\r
+:100B7000CE012182CE412183CD4121847C40800061\r
+:100B8000A0000000CC80004D840004A11C74000172\r
+:100B90001C7800029B400003C80C002A8400035B01\r
+:100BA000C814002C9B800003041000108400037202\r
+:100BB000CCC1A260CD01A0608400030C04180980A0\r
+:100BC000840004A1CC000064C83C002E8400031AF9\r
+:100BD000C810002AC81C002F1DDC0001C8240028F2\r
+:100BE00095C00009C8340031C8380030C83C002E18\r
+:100BF000537400207FB7802747B80554CC000062AB\r
+:100C0000CFFA00009A400000C8240028C82800231A\r
+:100C10003AA800029A80FFFFC8280023C8280025B0\r
+:100C20009A800000C8280025800002D1C030000250\r
+:100C30000598C00010DC000814E00018CDD90000B1\r
+:100C4000C81C0022C82400221DDC0FFFCDD90001E2\r
+:100C50007E624007CE590002D8185103D8185104BB\r
+:100C600088000000D81851071BF800F0C0360800B3\r
+:100C700097800003C030008088000000C02A000474\r
+:100C8000CF41217CCF01217DCD01217E22A8217F72\r
+:100C9000042400089A4000000A640001CC290000E6\r
+:100CA000C82000041638001F9B80FFFB04240008A6\r
+:100CB0008800000000000000C80C002494C000243C\r
+:100CC00038D400019940FFFDC81000237D0D0001BC\r
+:100CD0009900FFFBC80C00248000033FC80C0025CE\r
+:100CE00094C0001B38D400019940FFFDC8100023B8\r
+:100CF0007D0D00019900FFFBC80C0025840004A1B4\r
+:100D0000CC00007FC83C03FB9BC00000C83C03FB39\r
+:100D1000D04003FCC03E0004D20121F823FC21F99D\r
+:100D2000840004A1CC3D0000C83800041BB4003E80\r
+:100D30001FB000047F02C00B1EE800047EB640070F\r
+:100D40009A40FFF6C03E0004D00003FC7C41000046\r
+:100D5000800000017C4080008400035B7C40C00078\r
+:100D60007C408000A0000000CC80004DC83C000EFC\r
+:100D700097C00003D30003E688000000043C00266F\r
+:100D8000CFC1A2A4C83C03E60BFC0001CFC003E620\r
+:100D90009BC0FFFBCC00004D043C0005CFC1A2A4CA\r
+:100DA000CC01A1F4840004A1CC000047880000001D\r
+:100DB000CC00007F840003727C40C0007C40800037\r
+:100DC000A0000000CC80004D043C0022CFC1A2A4B2\r
+:100DD000840004A1CC00004888000000CC00007F03\r
+:100DE0008400037D7C40C0007C408000A0000000A7\r
+:100DF000CC80004D043C0023CFC1A2A4CC01A1F3C0\r
+:100E0000840004A1CC00004988000000CC00007FD1\r
+:100E1000800000007C40C000800000007C40C000DA\r
+:100E2000C01200017C51400780000000D455000032\r
+:100E3000CC400065C838002DC83C002EC035E0000D\r
+:100E4000C03200047FB780067FF7C00623B81000C9\r
+:100E500023FC1000CF812154CFC12155CC31215525\r
+:100E6000C82C0004C81C0025C82400247DE5C00748\r
+:100E700099C0FFFEC81C0025800000017C40800056\r
+:100E80007C40C0007C41000019280030968000089A\r
+:100E9000C8280027C82400289A400000C82400273A\r
+:100EA0009A400000C8240028CC0003E07C414000A8\r
+:100EB0007C418000151C001FCCC000C7CD0000C8BD\r
+:100EC00095C00003C01C8000CDC12010E18300004C\r
+:100ED000055C2000CC00004D80000000DC1F4100BC\r
+:100EE0007C40C0007C4100007C4140007C4180008F\r
+:100EF000CCC000C9CD0000CAE1830000055CA000A1\r
+:100F000080000000DC1F41007C40C0007C410000EC\r
+:100F10007C4140007C418000CCC000CBCD0000CCA7\r
+:100F2000E1830000055CE94080000000DC1F410017\r
+:100F30007C40C0007C4100007C4140007C4180003E\r
+:100F4000CCC000CDCD0000CEE1830000055CE88080\r
+:100F500080000000DC1F41007C40C0007C4100009C\r
+:100F60007C4140007C418000CCC000CFCD0000D04F\r
+:100F7000E1830000055CC00080000000DC1F410030\r
+:100F80007C40C0007C4100007C4140007C418000EE\r
+:100F9000CCC000D1CD0000D2E1830000055CF000A0\r
+:100FA00080000000DC1F41007C40C0007C4100004C\r
+:100FB0007C4140007C418000CCC000D3CD0000D4F7\r
+:100FC000E1830000055CF3FC80000000DC1F4100B1\r
+:100FD000D44320007C408000A0000000CC80004D65\r
+:100FE000D443A0007C408000A0000000CC80004DD5\r
+:100FF000D443E9407C408000A0000000CC80004D3C\r
+:10100000D443E8807C408000A0000000CC80004DEC\r
+:10101000D443C0007C408000A0000000CC80004D84\r
+:10102000D443F0007C408000A0000000CC80004D44\r
+:10103000D443F3FC7C408000A0000000CC80004D35\r
+:10104000041CA000CC43A0007C40C000D81FC100FD\r
+:101050007C408000A0000000CC80004D041CC0003B\r
+:10106000CC43C0007C40C000D81FC1007C40800041\r
+:10107000A0000000CC80004D7C40C0007C410000FE\r
+:1010800094C000037C4140007C418000CC03F3FC11\r
+:10109000CC43F3FCCC43F3FC7C408000A000000078\r
+:1010A000CC80004DC01E0010C80C002950D0000894\r
+:1010B00010540002800004357D158020C01E0020E1\r
+:1010C000C80C002A50D00008085404001154000233\r
+:1010D0007D518020CDC00062D45A00007C40800049\r
+:1010E000A0000000CC80004D7C40C0001CD000035C\r
+:1010F000112800019500000A06A8043F9E80000008\r
+:101100007C4180008000044D7C41C000800004537D\r
+:101110007C41C000800004597C41C0007C418000BB\r
+:101120007C41C00014D400100554A00080000000D1\r
+:10113000CD950000C02200040598A0007DA1800785\r
+:10114000CC19000080000449C8180004C022000423\r
+:10115000CD8125D6222025D7CC210000800004494E\r
+:10116000C8180004CD81216DCDC1216E80000449D5\r
+:10117000C81800037C40C00080000000CC4C03E095\r
+:101180001C8CFFFFD44D00007C408000A0000000BC\r
+:10119000CC80004DC8140023315800049580FFFF17\r
+:1011A000C8140023CC00005BCC412180204C80007F\r
+:1011B000CCC1218114D0001FCC412182CC4121839C\r
+:1011C0009500FB90CC412184C81400239940FFFF77\r
+:1011D000C8140023800000017C408000C016000479\r
+:1011E00021542140CC550000C818000480000000A4\r
+:1011F000CC0003E07C40C00018D00038C01600804E\r
+:1012000095000003C02A00047CD4C007CCC1217C17\r
+:10121000CC41217DCC41217E7C41800014FC001F0B\r
+:101220001D98FFFF39B0000322A0217F9B0000031F\r
+:10123000419C0005041C004099C0000009DC00012D\r
+:10124000CC210000C8240004166C001F419C00053E\r
+:101250009AC0FFFACC80004D9BC0FB6A00000000E2\r
+:1012600080000000CC0003E0C00E0100CC00004173\r
+:10127000CCC1304AC83C007FCC00007F8000000019\r
+:10128000CC00007FCC00007F88000000CC00007FF5\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001046000100003001200050015001A1E\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700620028005400290063AF\r
+:10143000002A0060002B0063002C0057002D006A7A\r
+:10144000002E006D002F007600300078003200E999\r
+:101450000034008D0035006300380057003900EB80\r
+:10146000003A0113003B0126003C013E003D01AE65\r
+:10147000003E01D3003F00E80041046500420477CC\r
+:101480000043047D004401EE0045013E0046020594\r
+:101490000047020500480205004A029C004B0384F5\r
+:1014A000004C02A8004D02E2004E032E004F03370D\r
+:1014B00000510378005203560053036D0054038615\r
+:1014C00000570388006003A0006103B80062038C2A\r
+:1014D000006303C2006403CC006503D6006603E02A\r
+:1014E000006703EA006803F4006903F8006A04294E\r
+:1014F000006B03FC006C0400006D0404006E040823\r
+:10150000006F040C007004040071042F0072041EAC\r
+:1015100000730410007404170075043A007D045D24\r
+:10152000000F049A000F049A000F049A000F049A07\r
+:10153000000F049A000F049A000F049A000F049AF7\r
+:10154000000F049A000F049A000F049A000F049AE7\r
+:10155000000F049A000F049A000F049A000F049AD7\r
+:10156000000F049A000F049A000F049A000F049AC7\r
+:10157000000F049A000F049A000F049A000F049AB7\r
+:00000001FF\r
diff --git a/firmware/radeon/SUMO2_pfp.bin.ihex b/firmware/radeon/SUMO2_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..b955efd
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC4000298000036FCC40002AB5\r
+:100040009900000500000000CC40002B8000036FE9\r
+:10005000CC40002CCC40002D8000036FCC40002E03\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:100070008000036FCC0000528000036FCC0000545E\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C000042800017C40C0007C41400080000039D1\r
+:1000D0007C4180007C40C00004140001C01A000371\r
+:1000E0007C9880077C41C000C810002CC820002BE1\r
+:1000F000511000207D2100277CD0C0209540FFC1F9\r
+:1001000054D00020CCC00042CD000042D1000042BB\r
+:10011000C8200003C8240003C82800039600FFB9C4\r
+:10012000C82C00039640FFB7C830001D9B00000498\r
+:10013000CC000055D80003C0CC000040C8300016E9\r
+:10014000C0360004C838000D1B3000277F7B4007F5\r
+:10015000CF400040CC000040CE000040CE400040E8\r
+:10016000CE80004097000003CEC00040D080005CED\r
+:1001700009540001CC800040CC000040CC0000407D\r
+:10018000CC000040CDC000409540FF9E7CD8C020F0\r
+:100190008000004154D000207C40C0007C414000E1\r
+:1001A0008000006E7C4180007C40C000041400018F\r
+:1001B000C01A00037C9880077C41C000C810002C46\r
+:1001C000C820002B511000207D2100277CD0C020AA\r
+:1001D0009540FF8C54D00020CCC00042CD0000429E\r
+:1001E000D1400042C8200003C8240003C8280003EF\r
+:1001F000C82C00039600FF83C83000039640FF819F\r
+:10020000C83403FD7EB78011978000037F6B4001E7\r
+:100210007C034006CF43A29ECC00006CCCC0006D96\r
+:10022000CD00006DC834001D9B400004CC0000557B\r
+:10023000D80003C0CC000040C8340016C03A000506\r
+:10024000C83C000D1B7400277FBF8007CF80004093\r
+:10025000D0400040CE000040CE400040CE80004064\r
+:10026000CEC0004097400003CF000040D080005C2B\r
+:1002700009540001CC800040CC000040CC0000407C\r
+:10028000CC000040CDC000409540FF5E7CD8C0202F\r
+:100290008000007654D00020C81800151D98000179\r
+:1002A000D000006F7C424000958002C37C428000F9\r
+:1002B000C81C0020C037C0007C40C0007C4100004A\r
+:1002C0007CB48006C03600031AB801E897800007A6\r
+:1002D000D04003E084000372CC00007FC83803E004\r
+:1002E0009B800000C83803E099C00000C81C0020B3\r
+:1002F0007CB4800710D400027D654000CD400043EF\r
+:10030000CE800043CD000043CC800040CE40004072\r
+:10031000CE800040CCC00040E03A00009780FF391A\r
+:10032000CD0000407C40C000800000BD7C4100004A\r
+:100330001C8C000298C00009C810001C9900000421\r
+:10034000C81C000684000375CC000052C8180015B4\r
+:10035000800000A81D980002C810001E9900FFFC34\r
+:10036000C81C000884000375CC000054C818001590\r
+:10037000800000A81D9800021C8C0002C810001DFF\r
+:1003800098C0000EC814004999000004C81C00075A\r
+:1003900084000375CC000053C818001594C00003F6\r
+:1003A000189401E805540006201000017D15000393\r
+:1003B000800000A87D9180069940FFF8C81C0007C6\r
+:1003C000CDC00040CC000040800000E6CC00006EB4\r
+:1003D000C00E8080CC00006704D08080CC00006814\r
+:1003E000CD0003F1CD0003F2CD0003F3CD0003F403\r
+:1003F000CD0003F6CD0003F7CD0003F88000000523\r
+:10040000CD0003F9CC800040D44000407C40800007\r
+:10041000A00000000428000180000109D800044069\r
+:10042000D8000340CC000040CC800040D4400040C5\r
+:100430007C408000A000000004280001D80003C018\r
+:1004400080000116CC00004080000115D800044057\r
+:10045000D8000340CC000040C80C0029C810002A76\r
+:10046000CC800040CC400040511000207CD0C02700\r
+:10047000105000027D0D002055140020CD000043D7\r
+:10048000CD400043D0400043CC0000407C40800081\r
+:10049000A000000004280001D80003C0CC000040E8\r
+:1004A000CC800040D44000407C408000A000000090\r
+:1004B000042800011C8C0002C810001D98C0001107\r
+:1004C000C814004999000004C81C00078400037583\r
+:1004D000CC000053C80C002FCC800040CC40004022\r
+:1004E000CC400040CC4000407CC4C000CCC00040A8\r
+:1004F000D44000407C408000A0000000042800019F\r
+:100500009940FFF5C81C0007CDC00040CC0000405A\r
+:1005100080000135CC00006E7C40C000C810004750\r
+:100520009900000BC814004499400004C818000941\r
+:10053000CD800040CC0000408000015FCC800040B6\r
+:100540007C40C000C81000479500FFF7C814004564\r
+:1005500099400004C818000ACD800040CC0000403B\r
+:100560008000015FD80008407C40C000C8100047F0\r
+:100570009900FFFC00000000CC800040CCC000408F\r
+:10058000D44000407C408000A0000000042800010E\r
+:10059000C8100046D8000740CD0000408400017616\r
+:1005A000CD000040C80C004394C0000AC8140048A5\r
+:1005B0008000016F04100003C8100046D80007C077\r
+:1005C000CD00004084000176CD000040C8140048F2\r
+:1005D0009D400000CC00006AC82800161EA800013B\r
+:1005E0009A800003C029000188000000C02C015639\r
+:1005F000CE80005CD80008C0CEC00040880000005B\r
+:10060000CC0000401C8C0002C810001E94C00008E2\r
+:10061000C814001C9900000AC81C00088400037557\r
+:10062000CC00005480000190CC8000409940000430\r
+:10063000C81C000684000375CC000052CC8000402A\r
+:1006400080000000D4400040CC400027CC4000286F\r
+:100650008000036FCC00006BC0320003C037FFFF87\r
+:100660008000019B7CB080077C434000C8200028AC\r
+:10067000C81C0027C8180026CF43A29E7C4140001A\r
+:10068000522000207DE1C0277D58C0037CDCC020C3\r
+:1006900054D00020800001B0CC8000407C4180001C\r
+:1006A000CC800040800001ADCD800040C019FFFF2C\r
+:1006B000CC800040CD83A29E7C40C0007C410000E5\r
+:1006C0007C414000CCC3A1FACD03A1F9CD43A29D4A\r
+:1006D000CCC00040CD000040CD400040CC400040A8\r
+:1006E0007C408000A0000000042800017C40C00085\r
+:1006F0001CD00001CCC3A29F95000003D04000266F\r
+:10070000D0800026CC80004080000000CCC000409B\r
+:100710007C40C000CC800040CCC3A2A2800000007E\r
+:10072000CCC00040C81C004C7C40C00029E0000048\r
+:1007300014D4001F7D614006CC800040954000032A\r
+:100740007C410000CCC000591518001FCCC00040EF\r
+:1007500095800003CD000040CD00005A8000036F5B\r
+:10076000CC00007FC820001F7C410000D82002443C\r
+:10077000CE2000447C4140007C418000CDA0004957\r
+:10078000CD200041CD600041CDA0004115100008F2\r
+:10079000115400187D53C007CFC0002F0620000160\r
+:1007A000CE0000588000036FCC00007FC820001FDF\r
+:1007B000CA0C001794C000057C410000D82002C676\r
+:1007C000800001DDCE200046CC000048800001F30F\r
+:1007D00000000000C820001F7C4180000A200001AA\r
+:1007E000CA14001ACA1800177D59800795800005A1\r
+:1007F000CE000058CCA0004680000000CD6000462E\r
+:10080000CCA0004480000000CD6000448000036F55\r
+:10081000CC40006AC80C03FA98C0000BD04003FA21\r
+:10082000C8180042C81C0043C810001DC814001C92\r
+:10083000111000019980FF587D15000799C0FF60D5\r
+:1008400000000000D00003FA800000007C40C000DF\r
+:10085000CC80004080000000D44000407C40C000BC\r
+:100860007C4100007C4380007C43C000041C0002EB\r
+:10087000CF800042CFC00042CDC00042041C000423\r
+:10088000CCC00042CD000042CDC00042041C00009C\r
+:10089000042000017C024000C8140003C8180003B3\r
+:1008A000519800207D594027C8280003C82C000318\r
+:1008B000C8300003C834000352EC00207EAE80270D\r
+:1008C000537400207F3700277F2B40217E76402005\r
+:1008D00056A8003F5730003F7EB280067E2A0006B1\r
+:1008E00099C0FFF209DC00019680FFE153F400207B\r
+:1008F0007F7B40277D65402055580020CC00005B61\r
+:10090000CD760000CDB60000C82000419A0000005E\r
+:10091000C8200041800000017C4080007C40C00075\r
+:100920007C410000CCC003FECD0003FFCCC00042E0\r
+:10093000CD0000421514001F191800F0275C0001BB\r
+:100940007D760006998000057D5E4006CC00004261\r
+:100950008000036FCC00004D15980001152C000895\r
+:10096000998000311EEC0001960000041530000C47\r
+:100970008000036FCC00004204140004CD4000420C\r
+:100980001F3000012028000104380004043C00004E\r
+:10099000C8140003C8180003C81C0003C8200003C3\r
+:1009A0007D5D400D7DA1C00D7D5D40071610001FCF\r
+:1009B000159C001F7D1D00067D1740067E92800657\r
+:1009C0009B4000120BB800049BC0FFF20BFC00011F\r
+:1009D000C80C03FE9A800009C81003FF9B0000F8B2\r
+:1009E000CC00004D04140004CCC00042CD000042F5\r
+:1009F00080000261CD40004296C000F1CC00004D65\r
+:100A00008000036FCC00004E9AC00003CC00004D64\r
+:100A1000CC00004E9780FD7BE38300008000000047\r
+:100A2000DC0301FF96400004CC00004E8000036F01\r
+:100A3000CC000042D2000042C8080003C80C0003EA\r
+:100A4000C8100003C8140003C8180003C81C000322\r
+:100A5000C8240003C828000315FC001F16B0001F9F\r
+:100A60007FF3C00614F0001F7FF3C0061570001F4F\r
+:100A70007FF3C0067D88800197C0000D7DCCC0014A\r
+:100A80007E5100017E9540017C90800C7CD4C00C8E\r
+:100A90009AC000037C8F400624B400019B4000C82C\r
+:100AA000CC00004D8000036FCC00004EC80C03FE4C\r
+:100AB000C81003FFCCC000428000028DCD00004270\r
+:100AC0007C40C0007C4100007C42C0007C430000B0\r
+:100AD000C03B001F7C4340007FB78006C03E100033\r
+:100AE0009780FD487D3D00077F3F00071914003BBC\r
+:100AF000CC00005B95400013C81400403158000240\r
+:100B00009580FFFFC8140040CC000063211C8000CA\r
+:100B1000CCC12185CDC121861514001FCEC12187EE\r
+:100B2000CF0121889540FD37CF412189C81400406D\r
+:100B30009940FFFFC8140040800000017C40800005\r
+:100B4000CC800040CCC00040CD000040CEC0004072\r
+:100B5000CF00004080000000CF400040D08003E084\r
+:100B6000CC80004084000372CC400040C80C03E0FD\r
+:100B700098C00000C80C03E07C408000A00000008A\r
+:100B80007E8280067C40C000840002EA14D0001FF0\r
+:100B90009900FD1CD04003E084000372CC00007F6C\r
+:100BA000800002DCC80C03E0CC800040CCC00040D8\r
+:100BB00088000000D4400040041403E00418001F23\r
+:100BC000CC140000055400019980FFFE0998000133\r
+:100BD000CC800040CC400040CC400040CC400040A5\r
+:100BE0007C40C000CCC00021CCC00040D4400040BC\r
+:100BF000C037FFFF80000000CF4003FD7C40C000F5\r
+:100C000014DC001D99C00007CC80004018DC003CBB\r
+:100C100099C0006BCCC000408000036FCC00006A1C\r
+:100C200018D8003CCD800066CC00006A8000036FBD\r
+:100C3000CCC000407C40C0005050002084000372B3\r
+:100C4000CC00005D7CD0C027C820001FC8D60000A3\r
+:100C5000994000087C438000E3830000CFA0004F50\r
+:100C600084000372CC00005E80000000D440007F4E\r
+:100C70008000036FCC00005E84000372CC00005D36\r
+:100C8000C820001F7C40C000C036FF00C8100021F3\r
+:100C9000C0303FFF7CF540067D5180067D81800A93\r
+:100CA000998000087CF38006E3830000CFA0004F0A\r
+:100CB00084000372CC00005E80000000D440007FFE\r
+:100CC0008000036FCC00005E840003727C40C00093\r
+:100CD0001CDC010095C000191CDC00107C410000E8\r
+:100CE00099C00004505400208000033EC91D00003C\r
+:100CF0007D150027C91E00007C4200007C42400098\r
+:100D00007C4180007DE5C0067DE280119A80FCBDBB\r
+:100D100041AC00059AC000000AEC00011CDC001088\r
+:100D200099C000040000000080000341C91D0000BC\r
+:100D300080000341C91E0000CC800040CCC00040B0\r
+:100D400080000000D4400040D8000340CC000040A8\r
+:100D5000CC800040D44000407C408000A0000000D7\r
+:100D600004280001D80003C0CC000040CC80004023\r
+:100D7000D44000407C408000A00000000428000116\r
+:100D80007C40C0001CD00006291000069900000617\r
+:100D9000C814001C99400004CC0000528400037564\r
+:100DA000C81C0006CC800040CCC000408000000081\r
+:100DB000D440004080000000D440007FCC00007F81\r
+:100DC00080000000CC00007FCC00007F8800000085\r
+:100DD000CC00007FCDC0004088000000CC00004067\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003035200040359000501D944\r
+:101010000006010800070114000801260009010F5D\r
+:10102000000A0106000B0112000C0146000D0150E0\r
+:10103000000E0164000F016E0010036D0011000A24\r
+:1010400000120018001300200016002200240035B2\r
+:101050000025006A00260192001701F5001802031E\r
+:10106000001A02050022030D0023031E002701A71A\r
+:10107000001F021700200247002801C9002901961D\r
+:10108000002A01BB002B01AB002C0031002F01C452\r
+:10109000003201EB003403600035019A003800662D\r
+:1010A00000390214003C0332003F01D9004102B074\r
+:1010B000004202D7004302E1004402EE004A02FF70\r
+:1010C000005503540056035B006000A6006100CC8D\r
+:1010D000006200F4006300DE006400DE006500DEF4\r
+:1010E000006600DE006700DE006801010069010A99\r
+:1010F000006A015A006B0128006C0128006D01286C\r
+:10110000006E0128006F01280070012D0073011688\r
+:101110000074011600750181000000050000000543\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/SUMO_me.bin.ihex b/firmware/radeon/SUMO_me.bin.ihex
new file mode 100644 (file)
index 0000000..cb9feb5
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC4000407C40C000DB\r
+:10016000CD41225DCC400045CC40004ACD01225C0F\r
+:10017000CC41A1FC7C408000A0000000CC80004D60\r
+:1001800080000000CC4122577C418000CC400045DB\r
+:10019000CC40004ACC41225CCC41A1FC7C40800098\r
+:1001A000A0000000CC80004DCC0000458000006520\r
+:1001B000CC00004AC00E0001CC000045CC00004A33\r
+:1001C000CC41225CCC41A1FCD44DA1FD7C408000FF\r
+:1001D000A0000000CC80004D80000000CC41225DDA\r
+:1001E000CC000045CC00004A084C00017C410000D6\r
+:1001F0007C4140001D58FFFF195C03F0156000159D\r
+:10020000CD81A102CDC12256CE01225C94C0000551\r
+:1002100021240020CE41A1FC8000007C08CC0001FC\r
+:10022000CD01A1FCCC01A1027C408000A000000017\r
+:10023000CC80004D7C4080007C40C000C02A000281\r
+:100240007C4100007D2900071C9400011C980006D9\r
+:100250001C9C030015DC00087C4200007C4240002E\r
+:100260009540000FC02E000405F022587F2F000794\r
+:10027000CC310000C8280004CCC12169CD01216A1D\r
+:10028000CE81216B29B40002CC01216C9740000E75\r
+:1002900029B40000800000BCC834000E29B400025C\r
+:1002A0009740000929B40000C02E000405F0225830\r
+:1002B0007F2F0007CC310000C8280004800000BC5C\r
+:1002C000C834000E974000047E028000800000BC0D\r
+:1002D000C834000E29B400049740FF4A0000000013\r
+:1002E000CE01216DCE41216EC8280003C834000E16\r
+:1002F0009B400004C83C000E8400035CCC00004D11\r
+:1003000029F40000974000070430A2B6840000DE04\r
+:10031000CE81A2B7CF81A2C480000000CFC1A2D1FC\r
+:1003200029F40001974000070430A2BA840000DEDF\r
+:10033000CE81A2BBCF81A2C580000000CFC1A2D2D6\r
+:1003400029F40002974000070430A2BE840000DEBA\r
+:10035000CE81A2BFCF81A2C680000000CFC1A2D3B0\r
+:100360000430A2C2840000DECE81A2C3CF81A2C726\r
+:1003700080000000CFC1A2D4C02E00047F2F000750\r
+:10038000CC310000C82C0004C03000067EF34023AE\r
+:10039000C03000207F6B8020880000007FB3C02425\r
+:1003A000CC00004280000000CC40001F7C40C00018\r
+:1003B0007C4100001914003D994000130414002EE4\r
+:1003C000840004A10418002984000265C81C0013DD\r
+:1003D0000414002A840004A10418002DCD41A2A415\r
+:1003E000C81C001395C00000C81C0013CCC121001C\r
+:1003F000CD012101CCC12102CD0121038000049E49\r
+:10040000CD81A2A41D18100095800005C81C001302\r
+:1004100029E400409640FFFFC81C0013CCC12175A1\r
+:10042000CD012176C820001496000000C8200014D9\r
+:10043000162800019A800004CC00004F8000049E22\r
+:10044000CC00007F80000108CCC121757C40C00039\r
+:100450007C410000CC000045CC00004A40D40003A1\r
+:10046000CD41225CCD01A1FCC01E00017C420000F8\r
+:1004700008CC00010624000106280002CE1DA1FDC3\r
+:10048000CE5DA1FD98C0FFFACE9DA1FD7C4080000D\r
+:10049000A0000000CC80004D7C40C0001CD00001BA\r
+:1004A00014CC00017C414000950000067C41800096\r
+:1004B000CD41216DCD81216E80000134C81C000327\r
+:1004C000C02200047E160007CC210000C81C0004D6\r
+:1004D0007C42400098C000047C4280008000000004\r
+:1004E000CDE50000CE412169CE81216ACDC1216BCD\r
+:1004F00080000000CC01216C7C40C0007C410000E9\r
+:100500007C4140007C4180007C41C00018A41FE871\r
+:100510002A68003C9680000A7C0200007C420000B1\r
+:100520003A300003CC0000589B0000034220000535\r
+:1005300004200040800001507C0240007E02400008\r
+:100540009A4000000A6400011CEC00109AC0000AE6\r
+:10055000CC00004DC02A0004C82C00207E928007E9\r
+:10056000CC000041CC290000CEC0001E80000160FC\r
+:10057000C8300004CD01216DCD41216EC83000038B\r
+:100580007F1F00061CF40007137800019740002A23\r
+:1005900007B801659F800000000000008000017521\r
+:1005A0007F1B800E800001797F1B800F8000017D02\r
+:1005B0007F1B800C800001817F1B800D80000185E6\r
+:1005C0007F1B8011800001897F1B80108000018EBD\r
+:1005D00014A400089B80001914A400088000019E48\r
+:1005E0001E6400FF9B80001514A400088000019E7B\r
+:1005F0001E6400FF9B80001114A400088000019E6F\r
+:100600001E6400FF9B80000D14A400088000019E62\r
+:100610001E6400FF9B80000914A400088000019E56\r
+:100620001E6400FF9B80000514A400088000019E4A\r
+:100630001E6400FF14A400081E6400FF2A68003C2A\r
+:100640009A80FE7014EC00087C4340007C438000DC\r
+:100650007C43C00096C00007CC00004DCF4121690B\r
+:10066000CF81216ACFC1216B80000000CC01216CB9\r
+:1006700080000000CFF50000CC000059840004A1E8\r
+:100680002A68003C9A800004C828001780000000F7\r
+:10069000D440007F9680FFAB7E024000840002972A\r
+:1006A000C00E0002CC000041800001ACCCC1304A39\r
+:1006B00094000000C83C001C7C40C0007C4100004D\r
+:1006C000C01E000115240012C02200029640000541\r
+:1006D000C0260004C027FFFB7D250006C0260000C1\r
+:1006E0007DD280067E12C0067D2500077C41400039\r
+:1006F0007C418000CCC121699A80000CCD01216A27\r
+:10070000CD41216B96C0FE3FCD81216C840004A1B8\r
+:10071000CC00007FC830001A97000000C830001AD3\r
+:10072000800000017C408000840004A1CC00007F98\r
+:10073000C8140015C8180016CD41216B96C0FE31B3\r
+:10074000CD81216C800001C3CC00007F7C40C000C3\r
+:100750007C40800014940010115400051C88FFFF99\r
+:10076000108800057C40C00014D000101CCCFFFF96\r
+:10077000C01A000405981BA4CC190000C818000476\r
+:100780001D980FFF7D1900109900FE1E7D8D001031\r
+:100790009900FE1CCC000058CC000059840004A134\r
+:1007A000CC812174C80C001794C0FFFFCC00005905\r
+:1007B000800000017C408000CC0003E5C82C0020B4\r
+:1007C000C00E20240410300020CC226B0414300111\r
+:1007D000CC000041D0110000CCD50000CEC0001EDE\r
+:1007E000C80C000998C00000C80C00097C4100003A\r
+:1007F0007C414000CC0003E7CC0003E8CC0003E9D7\r
+:10080000CC400043CC400044D440007F8000000036\r
+:100810007C80C0007C40C00018D001E81128000195\r
+:100820009500001006A8020A9E800000000000004B\r
+:1008300080000222C012080080000230C81400119B\r
+:1008400080000237C81400128000023ECCC1A2A46E\r
+:10085000800002471CE8003F8000026F7CC1800BD3\r
+:100860001CD0003F29280006292C00167EAE8007E8\r
+:10087000C81C00139A80003D0414002E8000000064\r
+:10088000CCC1A2A4C01208007C4140007D0CC0076E\r
+:10089000C012000815580003155C000C7C420000D3\r
+:1008A0007DD1C006122000147E1E40077E4E8007B8\r
+:1008B000CE81A2A480000000CD81A1FEC814001149\r
+:1008C0000410211895400000C8140011D4510000F4\r
+:1008D00080000000CCC1A2A4C8140012041021069C\r
+:1008E00095400000C8140012D451000080000000A0\r
+:1008F000CCC1A2A4CCC1A2A404100001CD00001957\r
+:10090000840004A1CC00007FC810001B99000000E7\r
+:10091000C810001B800000017C4080002AA0000459\r
+:100920002AA400147E2600070414002E9600000856\r
+:100930000418002984000265C81C00130414002A4E\r
+:10094000840004A1040C002DCD41A2A404102100B8\r
+:10095000C81C001395C00000C81C0013D45100002F\r
+:100960008000049ECCC1A2A4840004A10418002924\r
+:1009700084000265C81C00130414002A840004A12A\r
+:100980000418002D84000265C81C001380000001BB\r
+:100990007C40800095C00000C81C0013CD41A2A47B\r
+:1009A000CC012100CC012101CD812102CD81210387\r
+:1009B000CD81A2A488000000CC00004D1D9800014C\r
+:1009C0007C4100007C414000998000097C4200008D\r
+:1009D000C83C003211980010C81C000B3BFC000101\r
+:1009E00097C0FFFFC83C003280000281C83C003342\r
+:1009F00011980010C81C000A3BFC000197C0FFFFC3\r
+:100A0000C83C00331568001D7D5940079A800004DA\r
+:100A100011E4000A7E260007CDC00066CD012158F2\r
+:100A2000CD412159CE01215ACCC1A2A49A800213F2\r
+:100A300005100004042C000112F0001D7D71400718\r
+:100A400012E000102220000CCD012158CD41215987\r
+:100A5000CE01215A8000049ECCC1A2A4043C000512\r
+:100A6000CFC1A2A4C036000288000000CF412010F0\r
+:100A70007C40C00014D0001D9900000814D4001C54\r
+:100A80009540FD60C026000422642154CC2500005E\r
+:100A900080000000C82800048000049ECD40006152\r
+:100AA000840004A11C7400011C7800029B40000318\r
+:100AB000C80C00298400035BC814002B9B80000332\r
+:100AC0000410001084000372CCC1A250CD01A050CC\r
+:100AD0008400030C04180400840004A1CC0000630B\r
+:100AE000C83C002D8400031AC8100029C81C002F20\r
+:100AF0001DDC0001C824002795C00009C83400315E\r
+:100B0000C8380030C83C002D537400207FB78027C0\r
+:100B100047B80550CC000062CFFA00009A400000B0\r
+:100B2000C8240027C82800233AA800029A80FFFFA3\r
+:100B3000C8280023C0300001C82800249A80000083\r
+:100B4000C8280024CF00005B50D8000814DC00182F\r
+:100B5000C03E100021DC80007DFDC007CD812180DA\r
+:100B6000CDC1218151200008152400187E7E400748\r
+:100B7000CE012182CE412183CD4121847C40800061\r
+:100B8000A0000000CC80004D840004A11C74000172\r
+:100B90001C7800029B400003C80C002A8400035B01\r
+:100BA000C814002C9B800003041000108400037202\r
+:100BB000CCC1A260CD01A0608400030C04180980A0\r
+:100BC000840004A1CC000064C83C002E8400031AF9\r
+:100BD000C810002AC81C002F1DDC0001C8240028F2\r
+:100BE00095C00009C8340031C8380030C83C002E18\r
+:100BF000537400207FB7802747B80554CC000062AB\r
+:100C0000CFFA00009A400000C8240028C82800231A\r
+:100C10003AA800029A80FFFFC8280023C8280025B0\r
+:100C20009A800000C8280025800002D1C030000250\r
+:100C30000598C00010DC000814E00018CDD90000B1\r
+:100C4000C81C0022C82400221DDC0FFFCDD90001E2\r
+:100C50007E624007CE590002D8185103D8185104BB\r
+:100C600088000000D81851071BF800F0C0360800B3\r
+:100C700097800003C030008088000000C02A000474\r
+:100C8000CF41217CCF01217DCD01217E22A8217F72\r
+:100C9000042400089A4000000A640001CC290000E6\r
+:100CA000C82000041638001F9B80FFFB04240008A6\r
+:100CB0008800000000000000C80C002494C000243C\r
+:100CC00038D400019940FFFDC81000237D0D0001BC\r
+:100CD0009900FFFBC80C00248000033FC80C0025CE\r
+:100CE00094C0001B38D400019940FFFDC8100023B8\r
+:100CF0007D0D00019900FFFBC80C0025840004A1B4\r
+:100D0000CC00007FC83C03FB9BC00000C83C03FB39\r
+:100D1000D04003FCC03E0004D20121F823FC21F99D\r
+:100D2000840004A1CC3D0000C83800041BB4003E80\r
+:100D30001FB000047F02C00B1EE800047EB640070F\r
+:100D40009A40FFF6C03E0004D00003FC7C41000046\r
+:100D5000800000017C4080008400035B7C40C00078\r
+:100D60007C408000A0000000CC80004DC83C000EFC\r
+:100D700097C00003D30003E688000000043C00266F\r
+:100D8000CFC1A2A4C83C03E60BFC0001CFC003E620\r
+:100D90009BC0FFFBCC00004D043C0005CFC1A2A4CA\r
+:100DA000CC01A1F4840004A1CC000047880000001D\r
+:100DB000CC00007F840003727C40C0007C40800037\r
+:100DC000A0000000CC80004D043C0022CFC1A2A4B2\r
+:100DD000840004A1CC00004888000000CC00007F03\r
+:100DE0008400037D7C40C0007C408000A0000000A7\r
+:100DF000CC80004D043C0023CFC1A2A4CC01A1F3C0\r
+:100E0000840004A1CC00004988000000CC00007FD1\r
+:100E1000800000007C40C000800000007C40C000DA\r
+:100E2000C01200017C51400780000000D455000032\r
+:100E3000CC400065C838002DC83C002EC035E0000D\r
+:100E4000C03200047FB780067FF7C00623B81000C9\r
+:100E500023FC1000CF812154CFC12155CC31215525\r
+:100E6000C82C0004C81C0025C82400247DE5C00748\r
+:100E700099C0FFFEC81C0025800000017C40800056\r
+:100E80007C40C0007C41000019280030968000089A\r
+:100E9000C8280027C82400289A400000C82400273A\r
+:100EA0009A400000C8240028CC0003E07C414000A8\r
+:100EB0007C418000151C001FCCC000C7CD0000C8BD\r
+:100EC00095C00003C01C8000CDC12010E18300004C\r
+:100ED000055C2000CC00004D80000000DC1F4100BC\r
+:100EE0007C40C0007C4100007C4140007C4180008F\r
+:100EF000CCC000C9CD0000CAE1830000055CA000A1\r
+:100F000080000000DC1F41007C40C0007C410000EC\r
+:100F10007C4140007C418000CCC000CBCD0000CCA7\r
+:100F2000E1830000055CE94080000000DC1F410017\r
+:100F30007C40C0007C4100007C4140007C4180003E\r
+:100F4000CCC000CDCD0000CEE1830000055CE88080\r
+:100F500080000000DC1F41007C40C0007C4100009C\r
+:100F60007C4140007C418000CCC000CFCD0000D04F\r
+:100F7000E1830000055CC00080000000DC1F410030\r
+:100F80007C40C0007C4100007C4140007C418000EE\r
+:100F9000CCC000D1CD0000D2E1830000055CF000A0\r
+:100FA00080000000DC1F41007C40C0007C4100004C\r
+:100FB0007C4140007C418000CCC000D3CD0000D4F7\r
+:100FC000E1830000055CF3FC80000000DC1F4100B1\r
+:100FD000D44320007C408000A0000000CC80004D65\r
+:100FE000D443A0007C408000A0000000CC80004DD5\r
+:100FF000D443E9407C408000A0000000CC80004D3C\r
+:10100000D443E8807C408000A0000000CC80004DEC\r
+:10101000D443C0007C408000A0000000CC80004D84\r
+:10102000D443F0007C408000A0000000CC80004D44\r
+:10103000D443F3FC7C408000A0000000CC80004D35\r
+:10104000041CA000CC43A0007C40C000D81FC100FD\r
+:101050007C408000A0000000CC80004D041CC0003B\r
+:10106000CC43C0007C40C000D81FC1007C40800041\r
+:10107000A0000000CC80004D7C40C0007C410000FE\r
+:1010800094C000037C4140007C418000CC03F3FC11\r
+:10109000CC43F3FCCC43F3FC7C408000A000000078\r
+:1010A000CC80004DC01E0010C80C002950D0000894\r
+:1010B00010540002800004357D158020C01E0020E1\r
+:1010C000C80C002A50D00008085404001154000233\r
+:1010D0007D518020CDC00062D45A00007C40800049\r
+:1010E000A0000000CC80004D7C40C0001CD000035C\r
+:1010F000112800019500000A06A8043F9E80000008\r
+:101100007C4180008000044D7C41C000800004537D\r
+:101110007C41C000800004597C41C0007C418000BB\r
+:101120007C41C00014D400100554A00080000000D1\r
+:10113000CD950000C02200040598A0007DA1800785\r
+:10114000CC19000080000449C8180004C022000423\r
+:10115000CD8125D6222025D7CC210000800004494E\r
+:10116000C8180004CD81216DCDC1216E80000449D5\r
+:10117000C81800037C40C00080000000CC4C03E095\r
+:101180001C8CFFFFD44D00007C408000A0000000BC\r
+:10119000CC80004DC8140023315800049580FFFF17\r
+:1011A000C8140023CC00005BCC412180204C80007F\r
+:1011B000CCC1218114D0001FCC412182CC4121839C\r
+:1011C0009500FB90CC412184C81400239940FFFF77\r
+:1011D000C8140023800000017C408000C016000479\r
+:1011E00021542140CC550000C818000480000000A4\r
+:1011F000CC0003E07C40C00018D00038C01600804E\r
+:1012000095000003C02A00047CD4C007CCC1217C17\r
+:10121000CC41217DCC41217E7C41800014FC001F0B\r
+:101220001D98FFFF39B0000322A0217F9B0000031F\r
+:10123000419C0005041C004099C0000009DC00012D\r
+:10124000CC210000C8240004166C001F419C00053E\r
+:101250009AC0FFFACC80004D9BC0FB6A00000000E2\r
+:1012600080000000CC0003E0C00E0100CC00004173\r
+:10127000CCC1304AC83C007FCC00007F8000000019\r
+:10128000CC00007FCC00007F88000000CC00007FF5\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001046000100003001200050015001A1E\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700620028005400290063AF\r
+:10143000002A0060002B0063002C0057002D006A7A\r
+:10144000002E006D002F007600300078003200E999\r
+:101450000034008D0035006300380057003900EB80\r
+:10146000003A0113003B0126003C013E003D01AE65\r
+:10147000003E01D3003F00E80041046500420477CC\r
+:101480000043047D004401EE0045013E0046020594\r
+:101490000047020500480205004A029C004B0384F5\r
+:1014A000004C02A8004D02E2004E032E004F03370D\r
+:1014B00000510378005203560053036D0054038615\r
+:1014C00000570388006003A0006103B80062038C2A\r
+:1014D000006303C2006403CC006503D6006603E02A\r
+:1014E000006703EA006803F4006903F8006A04294E\r
+:1014F000006B03FC006C0400006D0404006E040823\r
+:10150000006F040C007004040071042F0072041EAC\r
+:1015100000730410007404170075043A007D045D24\r
+:10152000000F049A000F049A000F049A000F049A07\r
+:10153000000F049A000F049A000F049A000F049AF7\r
+:10154000000F049A000F049A000F049A000F049AE7\r
+:10155000000F049A000F049A000F049A000F049AD7\r
+:10156000000F049A000F049A000F049A000F049AC7\r
+:10157000000F049A000F049A000F049A000F049AB7\r
+:00000001FF\r
diff --git a/firmware/radeon/SUMO_pfp.bin.ihex b/firmware/radeon/SUMO_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..89ac7ea
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC4000298000036FCC40002AB5\r
+:100040009900000500000000CC40002B8000036FE9\r
+:10005000CC40002CCC40002D8000036FCC40002E03\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:100070008000036FCC0000528000036FCC0000545E\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C000042800017C40C0007C41400080000039D1\r
+:1000D0007C4180007C40C00004140001C01A000371\r
+:1000E0007C9880077C41C000C810002CC820002BE1\r
+:1000F000511000207D2100277CD0C0209540FFC1F9\r
+:1001000054D00020CCC00042CD000042D1000042BB\r
+:10011000C8200003C8240003C82800039600FFB9C4\r
+:10012000C82C00039640FFB7C830001D9B00000498\r
+:10013000CC000055D80003C0CC000040C8300016E9\r
+:10014000C0360004C838000D1B3000277F7B4007F5\r
+:10015000CF400040CC000040CE000040CE400040E8\r
+:10016000CE80004097000003CEC00040D080005CED\r
+:1001700009540001CC800040CC000040CC0000407D\r
+:10018000CC000040CDC000409540FF9E7CD8C020F0\r
+:100190008000004154D000207C40C0007C414000E1\r
+:1001A0008000006E7C4180007C40C000041400018F\r
+:1001B000C01A00037C9880077C41C000C810002C46\r
+:1001C000C820002B511000207D2100277CD0C020AA\r
+:1001D0009540FF8C54D00020CCC00042CD0000429E\r
+:1001E000D1400042C8200003C8240003C8280003EF\r
+:1001F000C82C00039600FF83C83000039640FF819F\r
+:10020000C83403FD7EB78011978000037F6B4001E7\r
+:100210007C034006CF43A29ECC00006CCCC0006D96\r
+:10022000CD00006DC834001D9B400004CC0000557B\r
+:10023000D80003C0CC000040C8340016C03A000506\r
+:10024000C83C000D1B7400277FBF8007CF80004093\r
+:10025000D0400040CE000040CE400040CE80004064\r
+:10026000CEC0004097400003CF000040D080005C2B\r
+:1002700009540001CC800040CC000040CC0000407C\r
+:10028000CC000040CDC000409540FF5E7CD8C0202F\r
+:100290008000007654D00020C81800151D98000179\r
+:1002A000D000006F7C424000958002C37C428000F9\r
+:1002B000C81C0020C037C0007C40C0007C4100004A\r
+:1002C0007CB48006C03600031AB801E897800007A6\r
+:1002D000D04003E084000372CC00007FC83803E004\r
+:1002E0009B800000C83803E099C00000C81C0020B3\r
+:1002F0007CB4800710D400027D654000CD400043EF\r
+:10030000CE800043CD000043CC800040CE40004072\r
+:10031000CE800040CCC00040E03A00009780FF391A\r
+:10032000CD0000407C40C000800000BD7C4100004A\r
+:100330001C8C000298C00009C810001C9900000421\r
+:10034000C81C000684000375CC000052C8180015B4\r
+:10035000800000A81D980002C810001E9900FFFC34\r
+:10036000C81C000884000375CC000054C818001590\r
+:10037000800000A81D9800021C8C0002C810001DFF\r
+:1003800098C0000EC814004999000004C81C00075A\r
+:1003900084000375CC000053C818001594C00003F6\r
+:1003A000189401E805540006201000017D15000393\r
+:1003B000800000A87D9180069940FFF8C81C0007C6\r
+:1003C000CDC00040CC000040800000E6CC00006EB4\r
+:1003D000C00E8080CC00006704D08080CC00006814\r
+:1003E000CD0003F1CD0003F2CD0003F3CD0003F403\r
+:1003F000CD0003F6CD0003F7CD0003F88000000523\r
+:10040000CD0003F9CC800040D44000407C40800007\r
+:10041000A00000000428000180000109D800044069\r
+:10042000D8000340CC000040CC800040D4400040C5\r
+:100430007C408000A000000004280001D80003C018\r
+:1004400080000116CC00004080000115D800044057\r
+:10045000D8000340CC000040C80C0029C810002A76\r
+:10046000CC800040CC400040511000207CD0C02700\r
+:10047000105000027D0D002055140020CD000043D7\r
+:10048000CD400043D0400043CC0000407C40800081\r
+:10049000A000000004280001D80003C0CC000040E8\r
+:1004A000CC800040D44000407C408000A000000090\r
+:1004B000042800011C8C0002C810001D98C0001107\r
+:1004C000C814004999000004C81C00078400037583\r
+:1004D000CC000053C80C002FCC800040CC40004022\r
+:1004E000CC400040CC4000407CC4C000CCC00040A8\r
+:1004F000D44000407C408000A0000000042800019F\r
+:100500009940FFF5C81C0007CDC00040CC0000405A\r
+:1005100080000135CC00006E7C40C000C810004750\r
+:100520009900000BC814004499400004C818000941\r
+:10053000CD800040CC0000408000015FCC800040B6\r
+:100540007C40C000C81000479500FFF7C814004564\r
+:1005500099400004C818000ACD800040CC0000403B\r
+:100560008000015FD80008407C40C000C8100047F0\r
+:100570009900FFFC00000000CC800040CCC000408F\r
+:10058000D44000407C408000A0000000042800010E\r
+:10059000C8100046D8000740CD0000408400017616\r
+:1005A000CD000040C80C004394C0000AC8140048A5\r
+:1005B0008000016F04100003C8100046D80007C077\r
+:1005C000CD00004084000176CD000040C8140048F2\r
+:1005D0009D400000CC00006AC82800161EA800013B\r
+:1005E0009A800003C029000188000000C02C015639\r
+:1005F000CE80005CD80008C0CEC00040880000005B\r
+:10060000CC0000401C8C0002C810001E94C00008E2\r
+:10061000C814001C9900000AC81C00088400037557\r
+:10062000CC00005480000190CC8000409940000430\r
+:10063000C81C000684000375CC000052CC8000402A\r
+:1006400080000000D4400040CC400027CC4000286F\r
+:100650008000036FCC00006BC0320003C037FFFF87\r
+:100660008000019B7CB080077C434000C8200028AC\r
+:10067000C81C0027C8180026CF43A29E7C4140001A\r
+:10068000522000207DE1C0277D58C0037CDCC020C3\r
+:1006900054D00020800001B0CC8000407C4180001C\r
+:1006A000CC800040800001ADCD800040C019FFFF2C\r
+:1006B000CC800040CD83A29E7C40C0007C410000E5\r
+:1006C0007C414000CCC3A1FACD03A1F9CD43A29D4A\r
+:1006D000CCC00040CD000040CD400040CC400040A8\r
+:1006E0007C408000A0000000042800017C40C00085\r
+:1006F0001CD00001CCC3A29F95000003D04000266F\r
+:10070000D0800026CC80004080000000CCC000409B\r
+:100710007C40C000CC800040CCC3A2A2800000007E\r
+:10072000CCC00040C81C004C7C40C00029E0000048\r
+:1007300014D4001F7D614006CC800040954000032A\r
+:100740007C410000CCC000591518001FCCC00040EF\r
+:1007500095800003CD000040CD00005A8000036F5B\r
+:10076000CC00007FC820001F7C410000D82002443C\r
+:10077000CE2000447C4140007C418000CDA0004957\r
+:10078000CD200041CD600041CDA0004115100008F2\r
+:10079000115400187D53C007CFC0002F0620000160\r
+:1007A000CE0000588000036FCC00007FC820001FDF\r
+:1007B000CA0C001794C000057C410000D82002C676\r
+:1007C000800001DDCE200046CC000048800001F30F\r
+:1007D00000000000C820001F7C4180000A200001AA\r
+:1007E000CA14001ACA1800177D59800795800005A1\r
+:1007F000CE000058CCA0004680000000CD6000462E\r
+:10080000CCA0004480000000CD6000448000036F55\r
+:10081000CC40006AC80C03FA98C0000BD04003FA21\r
+:10082000C8180042C81C0043C810001DC814001C92\r
+:10083000111000019980FF587D15000799C0FF60D5\r
+:1008400000000000D00003FA800000007C40C000DF\r
+:10085000CC80004080000000D44000407C40C000BC\r
+:100860007C4100007C4380007C43C000041C0002EB\r
+:10087000CF800042CFC00042CDC00042041C00081F\r
+:10088000CCC00042CD000042CDC00042041C00019B\r
+:10089000042000017C024000C8140003C8180003B3\r
+:1008A000519800207D594027C8280003C82C000318\r
+:1008B000C8300003C834000352EC00207EAE80270D\r
+:1008C000537400207F3700277F2B40217E76402005\r
+:1008D00056A8003F5730003F7EB280067E2A0006B1\r
+:1008E00099C0FFF209DC00019680FFE153F400207B\r
+:1008F0007F7B40277D65402055580020CC00005B61\r
+:10090000CD760000CDB60000C82000419A0000005E\r
+:10091000C8200041800000017C4080007C40C00075\r
+:100920007C410000CCC003FECD0003FFCCC00042E0\r
+:10093000CD0000421514001F191800F0275C0001BB\r
+:100940007D760006998000057D5E4006CC00004261\r
+:100950008000036FCC00004D15980001152C000895\r
+:10096000998000311EEC0001960000041530000C47\r
+:100970008000036FCC00004204140008CD40004208\r
+:100980001F3000012028000104380008043C000149\r
+:10099000C8140003C8180003C81C0003C8200003C3\r
+:1009A0007D5D400D7DA1C00D7D5D40071610001FCF\r
+:1009B000159C001F7D1D00067D1740067E92800657\r
+:1009C0009B4000120BB800049BC0FFF20BFC00011F\r
+:1009D000C80C03FE9A800009C81003FF9B0000F8B2\r
+:1009E000CC00004D04140008CCC00042CD000042F1\r
+:1009F00080000261CD40004296C000F1CC00004D65\r
+:100A00008000036FCC00004E9AC00003CC00004D64\r
+:100A1000CC00004E9780FD7BE38300008000000047\r
+:100A2000DC0301FF96400004CC00004E8000036F01\r
+:100A3000CC000042D2000042C8080003C80C0003EA\r
+:100A4000C8100003C8140003C8180003C81C000322\r
+:100A5000C8240003C828000315FC001F16B0001F9F\r
+:100A60007FF3C00614F0001F7FF3C0061570001F4F\r
+:100A70007FF3C0067D88800197C0000D7DCCC0014A\r
+:100A80007E5100017E9540017C90800C7CD4C00C8E\r
+:100A90009AC000037C8F400624B400019B4000C82C\r
+:100AA000CC00004D8000036FCC00004EC80C03FE4C\r
+:100AB000C81003FFCCC000428000028DCD00004270\r
+:100AC0007C40C0007C4100007C42C0007C430000B0\r
+:100AD000C03B001F7C4340007FB78006C03E100033\r
+:100AE0009780FD487D3D00077F3F00071914003BBC\r
+:100AF000CC00005B95400013C81400403158000240\r
+:100B00009580FFFFC8140040CC000063211C8000CA\r
+:100B1000CCC12185CDC121861514001FCEC12187EE\r
+:100B2000CF0121889540FD37CF412189C81400406D\r
+:100B30009940FFFFC8140040800000017C40800005\r
+:100B4000CC800040CCC00040CD000040CEC0004072\r
+:100B5000CF00004080000000CF400040D08003E084\r
+:100B6000CC80004084000372CC400040C80C03E0FD\r
+:100B700098C00000C80C03E07C408000A00000008A\r
+:100B80007E8280067C40C000840002EA14D0001FF0\r
+:100B90009900FD1CD04003E084000372CC00007F6C\r
+:100BA000800002DCC80C03E0CC800040CCC00040D8\r
+:100BB00088000000D4400040041403E00418001F23\r
+:100BC000CC140000055400019980FFFE0998000133\r
+:100BD000CC800040CC400040CC400040CC400040A5\r
+:100BE0007C40C000CCC00021CCC00040D4400040BC\r
+:100BF000C037FFFF80000000CF4003FD7C40C000F5\r
+:100C000014DC001D99C00007CC80004018DC003CBB\r
+:100C100099C0006BCCC000408000036FCC00006A1C\r
+:100C200018D8003CCD800066CC00006A8000036FBD\r
+:100C3000CCC000407C40C0005050002084000372B3\r
+:100C4000CC00005D7CD0C027C820001FC8D60000A3\r
+:100C5000994000087C438000E3830000CFA0004F50\r
+:100C600084000372CC00005E80000000D440007F4E\r
+:100C70008000036FCC00005E84000372CC00005D36\r
+:100C8000C820001F7C40C000C036FF00C8100021F3\r
+:100C9000C0303FFF7CF540067D5180067D81800A93\r
+:100CA000998000087CF38006E3830000CFA0004F0A\r
+:100CB00084000372CC00005E80000000D440007FFE\r
+:100CC0008000036FCC00005E840003727C40C00093\r
+:100CD0001CDC010095C000191CDC00107C410000E8\r
+:100CE00099C00004505400208000033EC91D00003C\r
+:100CF0007D150027C91E00007C4200007C42400098\r
+:100D00007C4180007DE5C0067DE280119A80FCBDBB\r
+:100D100041AC00059AC000000AEC00011CDC001088\r
+:100D200099C000040000000080000341C91D0000BC\r
+:100D300080000341C91E0000CC800040CCC00040B0\r
+:100D400080000000D4400040D8000340CC000040A8\r
+:100D5000CC800040D44000407C408000A0000000D7\r
+:100D600004280001D80003C0CC000040CC80004023\r
+:100D7000D44000407C408000A00000000428000116\r
+:100D80007C40C0001CD00006291000069900000617\r
+:100D9000C814001C99400004CC0000528400037564\r
+:100DA000C81C0006CC800040CCC000408000000081\r
+:100DB000D440004080000000D440007FCC00007F81\r
+:100DC00080000000CC00007FCC00007F8800000085\r
+:100DD000CC00007FCDC0004088000000CC00004067\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003035200040359000501D944\r
+:101010000006010800070114000801260009010F5D\r
+:10102000000A0106000B0112000C0146000D0150E0\r
+:10103000000E0164000F016E0010036D0011000A24\r
+:1010400000120018001300200016002200240035B2\r
+:101050000025006A00260192001701F5001802031E\r
+:10106000001A02050022030D0023031E002701A71A\r
+:10107000001F021700200247002801C9002901961D\r
+:10108000002A01BB002B01AB002C0031002F01C452\r
+:10109000003201EB003403600035019A003800662D\r
+:1010A00000390214003C0332003F01D9004102B074\r
+:1010B000004202D7004302E1004402EE004A02FF70\r
+:1010C000005503540056035B006000A6006100CC8D\r
+:1010D000006200F4006300DE006400DE006500DEF4\r
+:1010E000006600DE006700DE006801010069010A99\r
+:1010F000006A015A006B0128006C0128006D01286C\r
+:10110000006E0128006F01280070012D0073011688\r
+:101110000074011600750181000000050000000543\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
diff --git a/firmware/radeon/SUMO_rlc.bin b/firmware/radeon/SUMO_rlc.bin
new file mode 100644 (file)
index 0000000..a776273
Binary files /dev/null and b/firmware/radeon/SUMO_rlc.bin differ
diff --git a/firmware/radeon/SUMO_rlc.bin.ihex b/firmware/radeon/SUMO_rlc.bin.ihex
new file mode 100644 (file)
index 0000000..5c17ed9
--- /dev/null
@@ -0,0 +1,193 @@
+:100000002038001023B80000CF800012CC00020579\r
+:1000100004180001CD80000ECD800203CC00020246\r
+:10002000CD800201CC00000BCC000208CC00020BFA\r
+:10003000CC000209CC00020CCC000207CC00020666\r
+:10004000CD800200C80C00401CE000802A20008007\r
+:100050001CE401002A640100960000060000000074\r
+:100060009A400004000000008400013000000000FD\r
+:100070008000005C00000000CC00000ECC00000EF0\r
+:10008000C8100202202801C3201C0000C810020270\r
+:10009000C80802057F8B8007C808020194800030E1\r
+:1000A000000000008000006F00000000C9CC0203C7\r
+:1000B00094C0001700000000840000BB200C000169\r
+:1000C000840000CF2038000097800011200C000D24\r
+:1000D000C0302009CCF10000C030200AC03418180C\r
+:1000E0001374000823741818CB0D00007CF4C006AC\r
+:1000F000C808001A98800006201C000194C0FFFB6D\r
+:1001000000000000800000537DC1C006840000E9AB\r
+:1001100011B8001F840000CF20380001840000BB0C\r
+:10012000200C0000C03001C0CB3900002038000096\r
+:1001300095C0FFD3CF8000037DC1C006840000E9D5\r
+:10014000203800008000001FCF800003203800010D\r
+:10015000CF800003C8100202CC000201C808001AB8\r
+:100160009480001700000000CD80000E0000000009\r
+:10017000840000E911B8001F840000CD203800027F\r
+:10018000CC310000C8080200988000040000000084\r
+:100190008400020800000000840000CF2038000125\r
+:1001A000CD800201840000BB200C0000840000E927\r
+:1001B000203800008000001F00000000C8380056F2\r
+:1001C0009B80007C201C0000C83800579B80007971\r
+:1001D000201C0001C83800471FB8000197800003A9\r
+:1001E000C0380010CF800047201C0000C808020162\r
+:1001F0009480001200000000C82800009680000FC4\r
+:1002000020080001CD80000ECC8000001C1C0000E6\r
+:100210002A8801BB9480000400000000800000E4F4\r
+:10022000000000002A8801BC9880004900000000FE\r
+:100230009500002700000000C828000296800006F4\r
+:1002400020080001CD80000ECC800002800000B3A9\r
+:1002500000000000C8280001968000070000000090\r
+:1002600020080001CD80000ECC800001800000B38A\r
+:1002700000000000C82800039680000D0000000068\r
+:10028000CD80000E2A8C01E598C0FF89200800016E\r
+:100290002A8C01E47CE0C00698C000F02008000130\r
+:1002A000CC800003800000B300000000C8280004D8\r
+:1002B0009680FF730000000020080001CD80000E32\r
+:1002C000CC800004800000B300000000840000B770\r
+:1002D000000000008000001F000000001EA800FFBA\r
+:1002E000CE80000C8800000000000000C0300390A9\r
+:1002F000CB390000C00BFFFE7F8B800610CC0010B6\r
+:100300007F8F8007CFB1000088000000CB3900004C\r
+:10031000CFB10000CD80000ECB39000017B800042B\r
+:100320001FB8000F9780FFFD00000000880000004C\r
+:1003300000000000800000C4C03001C1C0302003B4\r
+:10034000CFB1000088000000CB390000C838020699\r
+:100350009B800006000000009A400004000000009E\r
+:100360008400024D00000000C9F802039B800004D5\r
+:10037000000000008000001F00000000CC1C0203F1\r
+:10038000840000E911B8001F8000001F0000000079\r
+:10039000CD9C0203840000E9203800009500FF3A5C\r
+:1003A00000000000C03001C088000000CFB1000094\r
+:1003B00099C0000BC830004023300002CF0000403D\r
+:1003C0008400010120380003C83000401F3003FDC5\r
+:1003D000CF0000408000006FCC000056C8300040C5\r
+:1003E00023300040CF00004084000112203800017B\r
+:1003F000C83000401F3003BFCF0000408000006FB6\r
+:10040000CC0000568400011D00000000C030200810\r
+:10041000840001252038FFFFC0302008CC310000C7\r
+:10042000CB390000C030039884000125203801003A\r
+:10043000C0300398CC310000CB090000C03021B699\r
+:1004400088000000CC3100008400011D0000000085\r
+:1004500020380001C03003988400012513B800142F\r
+:10046000CC000057C0300398CC3100008800000059\r
+:10047000CB090000CF9C0016CD80000EC9F00018FB\r
+:100480007F38800C9480FFFE000000008800000090\r
+:1004900000000000CFB10000CB3900002008001F91\r
+:1004A0009880000008880001CC1C0016C9F0001BD1\r
+:1004B0009700FFFF0000000088000000000000001F\r
+:1004C000C838004453B8000820080210C030FFFFAD\r
+:1004D000CB8E00007CF1400695400009CCC800009E\r
+:1004E00004880001CC08000004880001CC0800004A\r
+:1004F000048800018000013447B80004CC80020762\r
+:100500008800000000000000C030FFFFC88C000021\r
+:100510007CF100069500000F04880001C915000059\r
+:10052000CD48000014CC00107CF1000695000009B5\r
+:1005300004880001C9150000CD480000C82C001A2D\r
+:100540009AC000047C2DC00780000143048800018C\r
+:100550008800000000000000C030FFFFC88E0000CF\r
+:100560007CF100069500000F44880004C9150000C6\r
+:10057000CD4A000014CC00107CF100069500000963\r
+:1005800044880004C9150000CD4A0000C82C001A98\r
+:100590009AC000047C2DC0078000015744880004E5\r
+:1005A0008800000000000000C010200BC0140000F4\r
+:1005B000C016C000CD510000C9150000C030FFFFBB\r
+:1005C000C88C00007CF100069500000C0488000136\r
+:1005D000C8940000CD51000014CC00107CF100063E\r
+:1005E0009500000604880001C8940000CD51000069\r
+:1005F00080000170048800018800000000000000F5\r
+:10060000C010200BC0140000C016C000CD51000067\r
+:10061000C9150000C030FFFFC88E00007CF1000645\r
+:100620009500000C44880004C8960000CD510000DD\r
+:1006300014CC00107CF100069500000644880004EC\r
+:10064000C8960000CD510000800001864488000457\r
+:100650008800000000000000C9CC020394C00068BC\r
+:1006600020080000C00C21B6C8D10000C00A140048\r
+:100670007D0900069900006220080000840000CF78\r
+:10068000203800029780005E200800009A40000693\r
+:10069000000000008400014220080210800001AD2B\r
+:1006A00000000000C808004450880008840001567B\r
+:1006B0000000000099C0005220080000840000CF14\r
+:1006C000203800009780004E20080000CC00020077\r
+:1006D000CC000201C030218D200C0001CCF10000C3\r
+:1006E000C030218E20CC3FFFCCF10000C03021B6BD\r
+:1006F000C00A1400CCB10000C80800401C880200E9\r
+:100700009880003CC0300047CB1100001D0C040055\r
+:1007100094C0000700000000C80C001A94C0FFFB42\r
+:1007200000000000800001FF000000001D0C4000E0\r
+:1007300094C00030C0303DAFCB0D00001CCC000297\r
+:1007400094C0002CC0303D34CB0D000098C0002C6C\r
+:100750000000000000000000C80802080488000132\r
+:10076000CC800208C0303D35CC310000C0303D3176\r
+:10077000CDB10000C0303D34CB0D00001CC80001DD\r
+:10078000988000101CC8000298800007C80C001A4E\r
+:1007900094C0FFFA00000000C81002090510000113\r
+:1007A000CD000209C810020B05100001CD00020B9C\r
+:1007B000C0303D35CDB10000800001FF20080000B1\r
+:1007C00020080001CC800003C0300047C008200092\r
+:1007D000CB0D00007CC8C00698C0FFFE00000000E2\r
+:1007E000C0303D35CDB100008000001F000000008A\r
+:1007F000200800018000001FCC800003840000E975\r
+:1008000011B8001F840000CF20380001CC80000305\r
+:10081000840000E9203800008000001F0000000074\r
+:10082000840000E911B8001F840000CF20380002C6\r
+:10083000C0302008C008FFFECCB10000CB0D000086\r
+:10084000CC310000CB0D00009A40000600000000F3\r
+:100850008400016A200802108000021B00000000D2\r
+:10086000C80800448400018050880008C838004847\r
+:100870009780002AC83802069B8000040000000010\r
+:100880008400024D00000000C83800471FB8000176\r
+:1008900097800003C0380010CF800047C838004759\r
+:1008A0001FB800109B80FFFE00000000840002A71C\r
+:1008B00000000000840000CF203800019A400006AC\r
+:1008C000C838004884000284C83802078000023714\r
+:1008D000000000008400026A53B80008C030A1F490\r
+:1008E00023080400CC09000023080800CC090000FC\r
+:1008F00023080C00CC09000023081000CC090000DC\r
+:1009000023081400CC09000023081800CC090000BB\r
+:1009100023081C00CC090000C00C21B6CC0D00003F\r
+:10092000CD800200840000E920380000880000002B\r
+:1009300000000000C83800489B80000453B800083D\r
+:100940008800000000000000C808020704880001B9\r
+:10095000CB8E0000CCC8000047B80004048800011A\r
+:10096000CB8E0000CCC8000047B80004048800010A\r
+:10097000CB8E0000CCC8000047B8000404880001FA\r
+:10098000CB8E0000CCC8000047B8000404880001EA\r
+:10099000CB8E00001CD000019500FFF3CCC80000F6\r
+:1009A00088000000CCC00206CB8A0000C00C218168\r
+:1009B000CC8D0000C00C2183CC0D0000C0280004A9\r
+:1009C00047B80004CB8E00001CF400019B40000DD2\r
+:1009D00047B80004CB92000047B80004CB96000053\r
+:1009E000840002A00AA800019A80FFF6000000001F\r
+:1009F000840002A7C00821A080000270C028000463\r
+:100A0000840002A700000000880000000000000031\r
+:100A1000C838020707B80001CB880000C00C21814C\r
+:100A2000CC8D0000C00C2183CC0D0000C028000438\r
+:100A300007B80001CB8C00001CF400019B40000DA6\r
+:100A400007B80001CB90000007B80001CB9400006C\r
+:100A5000840002A00AA800019A80FFF600000000AE\r
+:100A6000840002A7C00821A08000028CC0280004D6\r
+:100A7000840002A7000000008800000000000000C1\r
+:100A8000C0082180CCC90000C0082182CD09000027\r
+:100A9000C008218488000000CD490000C00821A0C2\r
+:100AA000C88D000014CC00161CCC000198C0FFFDBE\r
+:100AB00000000000880000000000000000000000AE\r
+:100AC0000000000000000000000000000000000026\r
+:100AD0000000000000000000000000000000000016\r
+:100AE0000000000000000000000000000000000006\r
+:100AF00000000000000000000000000000000000F6\r
+:100B000000000000000000000000000000000000E5\r
+:100B100000000000000000000000000000000000D5\r
+:100B200000000000000000000000000000000000C5\r
+:100B300000000000000000000000000000000000B5\r
+:100B400000000000000000000000000000000000A5\r
+:100B50000000000000000000000000000000000095\r
+:100B60000000000000000000000000000000000085\r
+:100B70000000000000000000000000000000000075\r
+:100B80000000000000000000000000000000000065\r
+:100B90000000000000000000000000000000000055\r
+:100BA0000000000000000000000000000000000045\r
+:100BB0000000000000000000000000000000000035\r
+:100BC0000000000000000000000000000000000025\r
+:100BD0000000000000000000000000000000000015\r
+:100BE0000000000000000000000000000000000005\r
+:100BF00000000000000000000000000000000000F5\r
+:00000001FF\r
diff --git a/firmware/radeon/TURKS_mc.bin.ihex b/firmware/radeon/TURKS_mc.bin.ihex
new file mode 100644 (file)
index 0000000..2e96009
--- /dev/null
@@ -0,0 +1,1507 @@
+:100000000003E8E00002BE01000002140003FF004C\r
+:100010000003FF000002A00E0001C01D0003E80065\r
+:100020000003E8100003E8200003E8300003601834\r
+:100030000003601C00036020000360280002B0FF82\r
+:100040000002B1FF0002B2FF0002B3FF00036138FB\r
+:100050000003496C0003FF000003AF0A0002B40470\r
+:1000600000026FF40000FA3B0002B40F00024F14CC\r
+:100070000000FA17000340240002B4400002B50F4C\r
+:1000800000034AA6000244410003F0020002499521\r
+:1000900000036AA600022DA8000349D400003243E1\r
+:1000A0000000221800003A150002B51000009A4323\r
+:1000B000000245530003F0080002A07E0003F04652\r
+:1000C0000002A0630003F0440000F20F000234BFFE\r
+:1000D0000003F4000001C0250003E8000000820FC7\r
+:1000E000000340240002B4400002B5F000034AA619\r
+:1000F000000244410003F0020002699500036AA671\r
+:10010000000340000003FF000003F8010003C440A7\r
+:100110000003C4510002C645000200000003401065\r
+:100120000003FF000003FF000003E8200003E830A5\r
+:10013000000360100003F8030002336C000232A8D1\r
+:10014000000348080002B49F00024004000368084E\r
+:10015000000348210002B3C1000247730003682175\r
+:1001600000036A89000348250002B3C100024773F7\r
+:100170000003682500036A8D000348C0000348C6D9\r
+:100180000000823100008A300000C22F0000CA2E19\r
+:100190000003E8100003E890000368C0000368C68D\r
+:1001A00000034AA40003E8400003FF0000024224C9\r
+:1001B00000036AA400034800000348050002BB3F97\r
+:1001C0000002BCBF0002BFEF0000923300008A347F\r
+:1001D000000082380000BA360000AA3A0002411B33\r
+:1001E0000002BBFB0002422B0002400C000368002F\r
+:1001F0000002455F0003680500034810000349DD65\r
+:100200000002BBF10002BC0200008A370000AA39DC\r
+:100210000002411B0002611C000368100002455BE4\r
+:100220000002655C000369DD0003400D0003FF0070\r
+:100230000003FF000003A14C00008A0D0002B3027E\r
+:10024000000243340003A33000009A0C0002B30400\r
+:10025000000243340003A33200009A0B0002B008EE\r
+:10026000000082410002B0090000824200034829D8\r
+:10027000000349700002BF070002400F0003800026\r
+:100280000003000E00038406000385560003A556F4\r
+:100290000002655400026440000349E80003682935\r
+:1002A0000003682D0003C1040003C115000369E8C1\r
+:1002B000000369EC0003E8000003E8D00002304FBF\r
+:1002C000000368E40003C1DE0002304F000369044C\r
+:1002D0000003402C0003FF000002B40200024404AB\r
+:1002E0000000A216000349D60002B5100002445BCC\r
+:1002F0000003A4460000A2180002A04E0003F00371\r
+:100300000002346A0003F4000001C0C50003F400D9\r
+:100310000001D3720003400E0000F2400003E8F039\r
+:100320000003A0B6000349D50000FA110002B10F86\r
+:10033000000242170002A5200003F0010000FA406D\r
+:100340000002431B0002A5230003F0010000F2118C\r
+:10035000000340000003402E0002B6100002B40C5F\r
+:1003600000002A40000242240003A222000243347B\r
+:1003700000026C23000246680003F0030002A05E46\r
+:100380000003F0010003E8C00000E2100003400891\r
+:100390000002B40000007A110002A0240003F04122\r
+:1003A0000002B2080002A0FE0003F0410002B20405\r
+:1003B0000002B43F000242240000922800034A9445\r
+:1003C0000003FF000003606C000340000003FF0017\r
+:1003D0000002B440000244040003F0030003E800FC\r
+:1003E0000000823F000222FA000340000003FF00E9\r
+:1003F0000002B440000244140003F0020000F23F87\r
+:10040000000222FA000340000003FF000002B44093\r
+:10041000000244140003F00100022E6E00034A940F\r
+:100420000003FF0000036070000340000003FF00B2\r
+:100430000002B402000244240003F0030003E800B9\r
+:100440000000823F00022331000340000003FF0050\r
+:100450000002B402000244340003F0020000F23F44\r
+:100460000002233100034A940003FF0000036134BB\r
+:100470000002336C000340000003FF000003FF0094\r
+:100480000002440E0003F0030003E8000000823F76\r
+:100490000002245A0002336C000340000003FF00F6\r
+:1004A0000003FF000002441E0003F0020000F23FC0\r
+:1004B0000002245A00022EA900034A940003FF0000\r
+:1004C000000360740002B0000000822B00034000B3\r
+:1004D0000003FF000002B402000244400003F003E6\r
+:1004E0000003E8000000823F0002261900034A943E\r
+:1004F0000003FF0000036078000340000003FF00DA\r
+:100500000002B404000244400003F0030003E800CA\r
+:100510000000823F0002289C00034A940003FF0071\r
+:100520000003607C000340000003FF000002B410E1\r
+:10053000000244400003F00C0003E8000000823F8A\r
+:100540000002296C0000020D0003FF000003FF0001\r
+:100550000002A40E0003F0040000F20E0002296C59\r
+:100560000003E8000000820E00034A940003FF002D\r
+:10057000000360AC000340000003FF000002B42051\r
+:10058000000244400003F0030003E8000000823F43\r
+:1005900000022B8400034A940003FF00000360B0B4\r
+:1005A0000003E8000000823F0002B0FF0002B1FF3C\r
+:1005B0000003C12000036860000368680003400076\r
+:1005C0000003FF000002B410000244400003F042A8\r
+:1005D0000003F4000002018F0003400D00034026D9\r
+:1005E0000002B1400002B2100002B3080002411440\r
+:1005F0000003A11A000242240003A2240002622187\r
+:10060000000243380003A330000262230000922B53\r
+:100610000002A41E0003F0090003493D0002B2805D\r
+:100620000003C022000244420002296C0003493D3D\r
+:100630000003FF000002B2800002644200000210CA\r
+:100640000003FF000002B401000244040003F004B0\r
+:100650000003E8000000823F0003C1FE00022C46B8\r
+:10066000000002100003FF000002B4020002440474\r
+:100670000003F0040003E8000000823F0003E8F0FC\r
+:1006800000022C46000340000003FF000003FF00AF\r
+:100690000002442E0003F0030003E8000000823F44\r
+:1006A00000023577000340000003FF000002B41091\r
+:1006B000000244240003F0030003E8000000823F2E\r
+:1006C000000236A90003F80300034A940003FF0068\r
+:1006D000000360B40002B0000000822B0003400061\r
+:1006E0000003FF000002B402000244410003F002D4\r
+:1006F0000000F23F0002261900034A940003FF00A5\r
+:10070000000360B8000340000003FF000002B404CF\r
+:10071000000244410003F0020000F23F0002289C66\r
+:1007200000034A940003FF00000360BC0003400084\r
+:100730000003FF000002B410000244410003F00B6C\r
+:100740000000F23F0002296C0000020D0003FF00D0\r
+:100750000003FF000002A40E0003F0040000F20EEC\r
+:100760000002296C0003E8000000820E00034A9496\r
+:100770000003FF00000360EC000340000003FF00E3\r
+:100780000002B420000244410003F0020000F23FE6\r
+:1007900000022B8400034A940003FF00000360F072\r
+:1007A0000000F23F0002B0FF0002B1FF0003C120D1\r
+:1007B0000003686000036868000340000003FF0056\r
+:1007C0000002B410000244410003F0420003F400B0\r
+:1007D0000002020E0003400D000340260002B1405B\r
+:1007E0000002B2100002B308000241140003A11A73\r
+:1007F000000242240003A2240002622100024338C6\r
+:100800000003A330000262230000922B0002A41E0A\r
+:100810000003F0090003493D0002B2800003C0223A\r
+:10082000000244420002296C0003493D0003FF001E\r
+:100830000002B28000026442000002100003FF00C8\r
+:100840000002B404000244040003F0030000F23F7D\r
+:100850000003C1FE00022C46000002100003FF004E\r
+:100860000002B408000244040003F0030000F23F59\r
+:100870000003E8F000022C46000340000003FF00E4\r
+:100880000003FF000002443E0003F0020000F23FBC\r
+:1008900000023577000340000003FF000002B4109F\r
+:1008A000000244340003F0020000F23F000236A9C7\r
+:1008B00000034A940003FF00000360F40003F80300\r
+:1008C000000002180003FF000003FF000002A00E5A\r
+:1008D0000003F0420003F4000002026C0003402C0D\r
+:1008E0000003FF000002B420000240400002A00408\r
+:1008F0000003F0480003E8000000823F00023208D5\r
+:100900000002324D0000F23F000232080002324D78\r
+:10091000000232E4000340000003FF000002B408BC\r
+:10092000000244040003F00C000348080003FF0029\r
+:100930000002B44000026004000368080003499804\r
+:100940000002B4FD00024114000369980003E8307E\r
+:100950000003C12E00036830000232F80003E800F3\r
+:100960000003E8100003E8300002B203000368301F\r
+:10097000000340000003FF000002B5080002451517\r
+:100980000003F001000234D700034A940003FF0083\r
+:10099000000360F8000002400003FF000003FF00B6\r
+:1009A0000002A10E0003F0020003E8000000821420\r
+:1009B00000022EA9000348000003480500000A3485\r
+:1009C000000002380000123300002A3A00003A36D4\r
+:1009D0000003FF00000368000003680500034810DF\r
+:1009E000000349DD00000A3700002A390003FF0038\r
+:1009F00000036810000369DD000349710002B201C1\r
+:100A00000003E8300003C1060003C117000368308B\r
+:100A10000003496C0002B5160002A0510001C29FFC\r
+:100A20000002B0CF0002B1050002B2010002B30023\r
+:100A300000036830000232F80002B0B400036830EE\r
+:100A4000000232F80002B0BC00036830000232F845\r
+:100A50000002B0B800036830000232F80002B0CBE8\r
+:100A600000036830000232F80002B08C00036830E6\r
+:100A7000000232F80002B0D100036830000232F800\r
+:100A80000003E8000003E8100002B2030002B30014\r
+:100A900000036830000002180003FF000003FF009D\r
+:100AA0000002A00E0003F0420003F4000001C000A9\r
+:100AB000000001F4000340120003401500000A1B6F\r
+:100AC0000002A00E0003F0020003F4000001C2CFF8\r
+:100AD0000002C11E00008A1B00026BBA0002655BA7\r
+:100AE0000002C66E0003F0410002C77E00036015DD\r
+:100AF0000002B20F000244420002A5140003F007F6\r
+:100B00000003E8A00003E8B0000360120003E8005F\r
+:100B1000000081F40003F4000001C04D0003402CEC\r
+:100B20000003FF000002B420000240400002A004C5\r
+:100B30000003F0420003F4000001C2E40003E800F7\r
+:100B40000000823F000232080002324D0000F23FF6\r
+:100B5000000232080002324D000232E4000340106D\r
+:100B60000003FF000003FF000003A006000380064F\r
+:100B70000003C1F000022E7B0003C1F000022E7BB7\r
+:100B80000003C1F000022E7B0003C1F000022E7BA7\r
+:100B9000000340200003FF000003FF000002C00E1E\r
+:100BA0000003F0450002C11E0003F0430002C22E04\r
+:100BB0000003F0410002C33E000360200002336CDA\r
+:100BC000000349480002B43F0002B58000024334EC\r
+:100BD000000263350003694800024334000369489A\r
+:100BE0000003F4000001C0000003400400006A3F5D\r
+:100BF0000003E8800003E8900003E8A00003E8B0E9\r
+:100C00000002B510000244150003F0060002A0DE49\r
+:100C10000003F003000364AA0003F4000003F041A2\r
+:100C2000000364EA0003F8010002B508000244056D\r
+:100C30000002031C000061F80002A0DE0003F003C4\r
+:100C40000003E8400003F4000003F041000384EADD\r
+:100C50000003D8400003DCC0000079F70003F8036C\r
+:100C60000003D49E0003FB0000030FFE00020318E4\r
+:100C70000003F801000385E4000244150002032F7D\r
+:100C8000000021F90002A0DE0003F003000061F182\r
+:100C90000003F4000003F041000061F00002BF080F\r
+:100CA0000003DC400003D8C00003F8030003D49E17\r
+:100CB0000003FB0000030FFE0002032B0003F803F8\r
+:100CC0000003EC000000021400000A4000006A3F2C\r
+:100CD0000003FF00000240010002A00E0003F0012B\r
+:100CE0000003EC00000349380002A0DE0003F041DD\r
+:100CF00000034A5C0002B8FE000242280002A0DEA7\r
+:100D00000003F003000369380003F4000003F0411E\r
+:100D100000036A5C000349D00002B40400026114BD\r
+:100D20000002B2010002B3120002A0DE0003F04193\r
+:100D30000002B31100036830000349710002B8EFEC\r
+:100D40000002B9040003C1060002617900024338C1\r
+:100D500000036830000348090002B8FD000244485F\r
+:100D60000003680900022E7F000349A00002B411AD\r
+:100D70000003C1240002B10F000369A000034A442C\r
+:100D80000002B4FE0002611E00036A440002411426\r
+:100D900000036A440002A0DE0003F0030003426186\r
+:100DA0000003F4000003F0410003425D0003FF0074\r
+:100DB0000003FF000003E860000369A50003686BFF\r
+:100DC0000002BA0C0002B8C00003DC810003D8A105\r
+:100DD0000002B0F80002B1070003E8200003E83089\r
+:100DE0000003FE000003D41F0003686B0003E8F05B\r
+:100DF000000223FF000223E20002241C0002A1FEE5\r
+:100E00000003F0410003627A000342780003FF0010\r
+:100E10000003FF000002A0800001C3930002A09124\r
+:100E20000001C3930002A0A20001C3930002A0B37B\r
+:100E30000001C3930002CFFE0002BC0C0002A1FC23\r
+:100E40000003F0420003F4000001C37D0000FA0437\r
+:100E50000003E8F0000223E2000223FF0002241C4A\r
+:100E6000000342780003FF000003FF000002A0809F\r
+:100E70000001C3A90002A0910001C3A90002A0A221\r
+:100E80000001C3A90002A0B30001C3A90002CFFE64\r
+:100E90000002BC0C0002A1FC0003F0420003F400BD\r
+:100EA0000001C396000062040000FA030003FF0083\r
+:100EB0000002A5CF0001C3B90002A5FC0001C3B424\r
+:100EC0000003E8F00003E8C00003F4000001C3BC25\r
+:100ED00000030CCF0003ACC00003E8F00003F400F3\r
+:100EE0000001C3BC00030FFC0003AFF00003E8C027\r
+:100EF000000223FF0003C1FC000223E20003493883\r
+:100F00000002A0DE0003F04100034A5C0003FF0082\r
+:100F10000002622E0002A0DE0003F0030003693825\r
+:100F20000003F4000003F04100036A5C000349D0B1\r
+:100F30000002B4FB000241140002B2010002B3122D\r
+:100F40000002A0DE0003F0410002B311000368308C\r
+:100F5000000349710002B8EF0002B9FB0003C106AB\r
+:100F60000002417900024338000368300003480959\r
+:100F70000002B8FD00024448000368090002B018EE\r
+:100F8000000224400003EC00000344B90002A0DE8C\r
+:100F90000003F041000344F90003C10F0003C11F27\r
+:100FA0000003C12F0003C13F0003C14F0003C15F15\r
+:100FB0000002A0DE0003F005000364B0000364B487\r
+:100FC000000364B90003F4000003F043000364F07D\r
+:100FD000000364F4000364F9000348C80002B4F39A\r
+:100FE0000002B5040002400400026005000368C866\r
+:100FF00000024004000368C80003EC00000344B989\r
+:101000000002A0DE0003F041000344F90003C10F19\r
+:101010000003C11F0003C12F0003C13F0003C16FC4\r
+:101020000003C17F0002A0DE0003F005000364ACF2\r
+:10103000000364BC000364B90003F4000003F04340\r
+:10104000000364EC000364FC000364F9000348C877\r
+:101050000002B4F30002B50400024004000260057F\r
+:10106000000368C800024004000368C80003EC00E5\r
+:101070000002B01000022440000232F8000232F8F0\r
+:10108000000232F8000232F8000232F800034A1C73\r
+:101090000002244C0003C18C00034A200002244CAF\r
+:1010A00000038CC60002688C00034A240002244C12\r
+:1010B0000003C19C00034A280002244C00038CC694\r
+:1010C0000002699C00034A2C0002244C0003C1ACBE\r
+:1010D00000034A300002244C00038CC600026AACB4\r
+:1010E00000034A340002244C0003C1BC00034A3808\r
+:1010F0000002244C00038CC600026BBC0003EC0011\r
+:101100000003686B0002B9080002B8C00003DC806D\r
+:101110000003D8900003E8100003E8200003E83043\r
+:101120000003FE000003D41E0003686B0003EC0004\r
+:101130000003E8C00003873C0003A7760003862C69\r
+:101140000003A6680003851C0003A55A0003840C55\r
+:101150000003A44C00026CC700026CC600026CC500\r
+:1011600000026CC40003EC000000220F00034024C6\r
+:101170000003FF000002444E0003A0060002A10E7F\r
+:101180000003F00100008207000349A4000349A105\r
+:1011900000006A3F00038BEA0003C0AB000245A5D4\r
+:1011A0000002A0DE0003F003000243A30003F400EA\r
+:1011B0000003F041000263B3000369A4000369A1C6\r
+:1011C0000002B2FF0002B1FF0002B07F00036860BE\r
+:1011D0000003E8000003E8200003E8300002A0DE7E\r
+:1011E0000003F00300000A090003F4000003F041CB\r
+:1011F00000000A080002B8C00003686B0003D800B2\r
+:101200000003DC800003D41E0002BF0200022E7B1C\r
+:10121000000380E000008204000082030003E80075\r
+:1012200000008202000082010000F2000003485426\r
+:101230000002A0DE0003F003000384E80003F400D2\r
+:101240000003F041000384EA0002622400036854B2\r
+:1012500000034998000388E50003C13E0002A0DEB8\r
+:101260000003F001000383300003C12E0002600878\r
+:101270000003683000034975000388E600026068D7\r
+:101280000003C1170003C12E0003C13E0002A0DE0F\r
+:101290000003F0010003833000036830000348546A\r
+:1012A0000002A0DE0003F003000384E80003F40062\r
+:1012B0000003F041000384EA0003C044000242241A\r
+:1012C000000368540002BF0200022E7B00000218D7\r
+:1012D0000003FF000003FF000002A00E0003F00265\r
+:1012E0000003F400000204D7000230610003E8703C\r
+:1012F000000384E60002464B0002A0640003F04FA6\r
+:10130000000349D20003E86000038AB20003AAAADE\r
+:10131000000384A60002644A0003C1540002A0DE58\r
+:101320000003F003000368E50003F4000003F0414C\r
+:10133000000369050003F4000001C5820002BF0834\r
+:1013400000024FF90003AFF400038BB20003ABBC03\r
+:10135000000225A60003F400000205820003400CF1\r
+:101360000003FF000002BF0800024FF00003F0423C\r
+:101370000003F4000001C4F40002BF000002BB013E\r
+:10138000000225A6000002110003FF000003FF0079\r
+:101390000002A00E0003F0420003F4000001C58229\r
+:1013A0000002B1020002B0110002C4400002C550A8\r
+:1013B0000002A0DE0003F003000368E50003F40070\r
+:1013C0000003F041000369050003011E000204E967\r
+:1013D0000000F2020000F2010002A0DE0003F003B0\r
+:1013E00000007A060003F4000003F04100007A05D3\r
+:1013F00000038DE20003DCD00003D8F0000389E68F\r
+:101400000002699E0000F1F2000042070003E8D0EC\r
+:1014100000038FE00003C1A800038CED0000E1F69B\r
+:101420000000E23E00022FCA0002B701000042079E\r
+:101430000003E8A00000D1F20002A07E0003F0014A\r
+:101440000003A88000030FDF0003C1D90003C1A877\r
+:1014500000038CED0000E1F60000E23E00022FCA1E\r
+:101460000002300B0003C1040003C12600036270B8\r
+:101470000002BF0100034011000388E00002A0FE4B\r
+:101480000003F004000244480003F0020003F400EB\r
+:10149000000205680002B701000042070003FF00D8\r
+:1014A0000002A07E0003F0010003A8800003E8D042\r
+:1014B00000038FE00003C1A800038CED0000E1F6FB\r
+:1014C0000000E23E00022FCA0002300B000342700F\r
+:1014D00000038CEB00038CEA0003E8F00002C84034\r
+:1014E0000003A88000002A160002CA620003AAA016\r
+:1014F0000002A65E0002054500006A3F0000F216E9\r
+:101500000003C1580003C17A000362710003F400B4\r
+:10151000000204FF0002A15E0003F00E00006A3F1B\r
+:101520000003C1910003C1B30002A0DE0003F00379\r
+:101530000003612E0003F4000003F0410003613258\r
+:101540000002C0810003A8000002C2A30003AA2079\r
+:10155000000385500000AA16000381E00003008408\r
+:101560000003F0240002A1840003F0010002C44142\r
+:101570000003044E0003C154000302A60003F0243C\r
+:101580000002A1A60003F0010002C6610003066E7E\r
+:101590000003C1760003D45E00026002000205571A\r
+:1015A00000006A3F0002BF0200022E7B0003497167\r
+:1015B000000381E40003C1060003A26C0002A02E18\r
+:1015C00000020582000261710003C12E0003C13ECA\r
+:1015D0000002A0DE0003F0010003833000038660F8\r
+:1015E0000003F0470003683000038FED00022E7BFC\r
+:1015F00000038FED00022E7B00038FED00022E7B97\r
+:1016000000038FED00022E7B000349750003C12EFD\r
+:101610000003C1060003C1170003C13E0002A0DEA3\r
+:101620000003F00100038330000368300003499891\r
+:101630000003FF000003C13E0002A0DE0003F00132\r
+:10164000000383300003C12E0003683000000A0F3E\r
+:10165000000001F40003FF000002411E0003F0013E\r
+:101660000003EC000002A50E0003F0480003401147\r
+:101670000002A0DE0003F0030002666E0003F40027\r
+:101680000003F0410002677E000360110003E800E0\r
+:10169000000081F40003EC00000232F800034A402D\r
+:1016A0000000420000004A04000052030002BC3364\r
+:1016B0000002440C0002451C000264450002462C56\r
+:1016C0000002473C00026667000264460002A14E29\r
+:1016D0000003F0010002B4010002A08E0003F00537\r
+:1016E0000002A4490003F0430002A44B0003F041B0\r
+:1016F0000000F2020000A2040002BCCC0002440C74\r
+:101700000002451C0002462C0002473C00026445D2\r
+:1017100000026446000264470002A14E0003F0018B\r
+:101720000002B4010002A08E0003F0050002A44AEA\r
+:101730000003F0430002A44B0003F0410000F2015B\r
+:101740000000A2030003E8400000A20000034329B8\r
+:101750000002A0DE0003F041000343690000020222\r
+:10176000000012010002B10F0002B3070002A5FE43\r
+:10177000000205FC0002A00E0003F0060002BC0FF0\r
+:101780000002A4410003F0010002BC090003C14CA7\r
+:101790000003C15C0002A02E0003F0060002BC0F93\r
+:1017A0000002A4610003F0010002BC090003C16C47\r
+:1017B0000003C17C0002A0DE0003F00300036329E4\r
+:1017C0000003F4000003F0410003636900024C02CF\r
+:1017D0000002A0CE0003F0060002CFFE0002BC090A\r
+:1017E0000002A5FC0003F0020003F4000001C5A6FE\r
+:1017F000000348E50002A0DE0003F04100034905B4\r
+:101800000002B8110002A00E0003F0010002C4485B\r
+:10181000000249410002A4930003F0010000F2021B\r
+:101820000002A02E0003F0010002C5580002495139\r
+:101830000002A4930003F0010000F2010002A0DE08\r
+:101840000003F003000368E50003F4000003F04127\r
+:1018500000036905000240020002A00E000205A676\r
+:101860000003EC0000006A3F0003E8000002303B88\r
+:10187000000349980002B80F0002B5F50002B30159\r
+:101880000002A0DE0003F001000383300003C12E3C\r
+:101890000002600800024115000368300002BF002A\r
+:1018A00000022E7B0000F1FF0003E800000081FE33\r
+:1018B0000003400C0003402D0002B8100002B908DC\r
+:1018C00000024A180003AAA600024B490003ABB469\r
+:1018D0000002B30400026FAB0003F0410002B30248\r
+:1018E00000024FAB0003F0010002B3060003402DDD\r
+:1018F00000000A110002B040000240400003F04125\r
+:101900000003E8300002411E0003F0010003E8304C\r
+:10191000000099FD00022E7F0002BC010002A0DE43\r
+:101920000003F0090003482100038CC6000386660B\r
+:101930000003A6660002666C0003682100036A8942\r
+:101940000003F4000003F0470003482500038CC6A1\r
+:10195000000386660003A6660002666C0003682525\r
+:1019600000036A8D0002B0010003E8100003E820C4\r
+:101970000003E83000036A600002BF03000231D5B3\r
+:1019800000034808000384EA000081F500026004B7\r
+:10199000000368080002BF6400022E7B00006A3F5B\r
+:1019A0000003FF000003FF000002A0DE0003F003BD\r
+:1019B0000002BB000003F4000003F0410002BB4042\r
+:1019C0000000D9EF0003C10E0003C11E0003811601\r
+:1019D0000002611E000382E600036A440003C11E88\r
+:1019E000000381160003E82000036A440003E800B6\r
+:1019F0000003C0000003C1100002B2FD00036860D4\r
+:101A000000034A600002BFF70002B1130002400F5A\r
+:101A10000002600E00036A600000320C00003A0B06\r
+:101A20000002BC080002BFFE0003866A00026226B4\r
+:101A30000002A47E0003F0010002B3040002400F84\r
+:101A40000002600C00036A6000038FE100022E7B3D\r
+:101A50000003686B0003FF000003FE000000623D0E\r
+:101A600000005A3C0003FF000003D8C10003DCB1B2\r
+:101A700000038FE300022E7B0003D01F00038CEFD6\r
+:101A800000038FE400026FFE0002400100024223C7\r
+:101A90000002400200024CC00003FB010003D01F03\r
+:101AA00000030FFE000206A20002A0DE0003F00306\r
+:101AB000000348210003F4000003F041000348251F\r
+:101AC0000003C0CC000206CE00038CE60002C66C08\r
+:101AD0000003F0410002C77E0002A0DE0003F00414\r
+:101AE0000003682100036A890003F4000003F04248\r
+:101AF0000003682500036A8D0002A57E0003F00242\r
+:101B00000003F4000001C671000340110002B00898\r
+:101B10000000F1F40002A0DE0003F00300026660A2\r
+:101B20000003F4000003F04100026770000360113D\r
+:101B30000003F40000020883000380E10003810633\r
+:101B40000002611E000382E700036A44000381066D\r
+:101B50000003E82000036A440002B0010003E8101B\r
+:101B60000003E8200003E83000036A600003402C13\r
+:101B700000005A2B0002B4040003E8F000024440C5\r
+:101B80000003F0010002BF010002A4BE0003F00147\r
+:101B90000002BF04000231D50000F2270000F22548\r
+:101BA0000002B0FF0002B1BF0003C1200003686063\r
+:101BB0000002B0010003E8100003E8200003E83051\r
+:101BC00000036A6000000A3B0000120C00001A0BC0\r
+:101BD0000002B0020002A0DE0003F0410002B004E7\r
+:101BE0000003822A0002A43E0003F0010002B304B5\r
+:101BF00000038116000260010002B13300036A6035\r
+:101C00000003400A0002B0010002B1020002B2006B\r
+:101C10000002B3010002A02B0003F0020003E82041\r
+:101C20000003C13B00036A680003C10E00001242BA\r
+:101C3000000240090003F0010003E8200002B01395\r
+:101C40000002B102000382260003E83000036A703C\r
+:101C50000003402D00006211000012280002BF4066\r
+:101C600000024F4F0003F0030002A0CE0003F0017A\r
+:101C70000002B2080002B0210002B1020002B3016A\r
+:101C800000036A7400000A2B0002B0010003FF0089\r
+:101C90000002A41E0003F0050002B1040002B2001D\r
+:101CA0000002B3020003F4040003F0030002B102D7\r
+:101CB0000002B20F0002B30100036A7800034A7CFD\r
+:101CC0000003FF000002B0010002B1020002B304F1\r
+:101CD00000036A7C000001FE0003FF000003FF0018\r
+:101CE0000002C00E000081FE000231D00000022779\r
+:101CF0000003400A0003400D0002A00E0003F0059F\r
+:101D00000002B00100024005000380060003F40455\r
+:101D10000003F0030002B004000240090003800247\r
+:101D20000002B103000268010000022B0003FF0063\r
+:101D30000003FF000002A40E0003F00B00001228B5\r
+:101D40000002B0230002B1030002B30100036A7471\r
+:101D500000034A7C0003FF000002B0010002B1044E\r
+:101D60000002B30400036A7C00034A640002B480EA\r
+:101D7000000011EF00024004000260080003A222EC\r
+:101D80000002B30100036A6400023095000230A231\r
+:101D9000000001FF0003FF000003FF000002A00E8F\r
+:101DA0000003F04E0003402C0002BC040003DCC022\r
+:101DB00000038FEA0002A0DE0003F0010003E8F058\r
+:101DC0000003D8F00002BC090002BF3F00024B1F15\r
+:101DD00000022F0B0003E8F00000F9FF000001FEF5\r
+:101DE0000003FF000003FF000002C00E000081FEA0\r
+:101DF0000003402500001A100002B2040002422035\r
+:101E00000002A0DE0003F0410003A3320002B90289\r
+:101E100000024993000262290002B980000249953C\r
+:101E2000000262290002B9860003E8800002A029AE\r
+:101E30000003F0410003C18E0000C1DA000009FD7B\r
+:101E40000003402E0003FF000002A001000207A2D1\r
+:101E50000002B001000241080003F005000002404A\r
+:101E60000003FF000003FF000002A00E000207A213\r
+:101E700000034A7400007A280003FF000003FF00FB\r
+:101E80000003C12F00036A74000231D00000022752\r
+:101E90000003400A0003400D0002A00E0003F005FD\r
+:101EA0000002B00400024005000380020003F404B5\r
+:101EB0000003F0020002B01000024009000079DACD\r
+:101EC0000002B1430003FF000002A0FE0003F04146\r
+:101ED0000002B123000268010000022B0003FF0092\r
+:101EE0000003FF000002A00E000207D40000122829\r
+:101EF0000002B0430002B1040002B30100036A749F\r
+:101F000000034A7C0003FF000002B0010002B1059B\r
+:101F10000002B30400036A7C00034A640002B48038\r
+:101F2000000011EF00024004000260080002B82027\r
+:101F3000000260080002B8BF000240080003A222AD\r
+:101F40000003C13E00036A640003F4040003F008C8\r
+:101F500000034A640002B480000011EF0002400454\r
+:101F6000000260080003A2220003C13E00036A646D\r
+:101F700000023095000230A2000042100002B002C0\r
+:101F80000002A0DE0003F0410003800200024008CE\r
+:101F90000003F0020003F4000001C7F50003400E47\r
+:101FA0000002B0100003FF00000241090002A0106F\r
+:101FB000000207F5000002270003FF000003FF00F6\r
+:101FC0000002C00E000082270002B1020002A4013C\r
+:101FD00000020735000041EF000001F90003FF0097\r
+:101FE0000003FF000003D8800003DC0000007A42F9\r
+:101FF0000002B0010003DC010002B0000003D801C0\r
+:10200000000049DA0003FF000003FF000002A09E69\r
+:102010000003F0460003E8F00002B1240002C8818A\r
+:102020000003D8800002C0010003D8810002308C78\r
+:10203000000001FE0003FF000003FF000002C00ECD\r
+:10204000000081FE000079DA000231D00002A0FE1B\r
+:102050000003F0450002B00F0003C1100003C120CF\r
+:102060000003C13000036A800003400A0002B04050\r
+:102070000003FF00000240090003A0020002B103B8\r
+:10208000000268010000022B0003FF000003FF00B4\r
+:102090000002A40E0003F00B000012280002B0435F\r
+:1020A0000002B1050002B30100036A7400034A7C18\r
+:1020B0000003FF000002B0010002B1060002B304F9\r
+:1020C00000036A7C00034A640002B480000011EF40\r
+:1020D00000024004000260080003A2220002B301D3\r
+:1020E00000036A6400023095000230A2000340251C\r
+:1020F000000042100002B020000240050003F0483A\r
+:102100000002B0020002A0DE0003F04100038002E2\r
+:10211000000240080003F0020003F4000001C8655B\r
+:10212000000011FE0002B0800002B3030002A023F1\r
+:102130000003F043000240050003F0010002319665\r
+:102140000003402E0003FF000002B0080002410817\r
+:102150000002A010000208650002B08000024108E1\r
+:102160000003F005000002400003FF000003FF0031\r
+:102170000002A00E00020865000002250003FF0017\r
+:102180000003FF000003E81000008A250002A40EEF\r
+:1021900000020777000001EF000041F90003FF0093\r
+:1021A0000003FF000003D8000003DC8000007A4237\r
+:1021B0000002B0000003D8010002B0010003DC01FE\r
+:1021C0000003400D0002BD200003FF0000024DD5BA\r
+:1021D0000002A6DE0003F00300022F2B0003F4042C\r
+:1021E0000003F00A0002B07F0002B1FF0002B2FF5C\r
+:1021F000000368600003686B000011E50002B3C0D3\r
+:102200000003E8D00003604C00022F660002B0011A\r
+:102210000003E8100003E8200003E83000036A60D0\r
+:1022200000034A640002B4800002400400036A64B0\r
+:10223000000021F50003FF00000348080003FF0031\r
+:102240000003C104000368080003EC000003E80079\r
+:102250000003E8100002A0DE0003F0030003691C85\r
+:102260000003F4040003F001000369340003EC00F0\r
+:1022700000006A3F0003FF000003FF000002A0DE31\r
+:102280000003F0030002BB620003F4000003F0410E\r
+:102290000002BB680003FF000003FF000000D9FC40\r
+:1022A0000002328E0003E8000002303B0002BB0255\r
+:1022B0000000DA3E000348010002B0BF00024440C3\r
+:1022C00000036801000349980002B40F0002B5FD45\r
+:1022D00000026004000241150003C12E0003C13E4C\r
+:1022E0000002A0DE0003F001000383300003683029\r
+:1022F000000348080002B440000081F500026004B9\r
+:10230000000368080003E8000002B1600003E82051\r
+:102310000003E830000369A00003E8000002B110E8\r
+:102320000003E8200003E83000036A440002B00123\r
+:102330000003E8100003E8200003E83000036A60AF\r
+:102340000002BF02000231D50003E8000003C00014\r
+:102350000003C1100002B2FD0003686000000A3BE8\r
+:102360000000120C00001A0B0002B00A0002A0DEEE\r
+:102370000003F0410002B00C00038116000260016E\r
+:102380000003822A0002B10C000262210002A43E76\r
+:102390000003F0010002B3040002B11600036A60FA\r
+:1023A00000038FE100022E7B0003686B0003FF0037\r
+:1023B0000003FE00000231FE00034A600000320C00\r
+:1023C00000003A0B0002B4F60002B5030003866A6F\r
+:1023D000000262260002A47E0003F0010002B7049E\r
+:1023E00000026337000301150002400400036A6025\r
+:1023F0000003400A0002B0010002B1020002B21262\r
+:102400000003E83000036A680002B0800000124256\r
+:10241000000240080003F0010003E8200002B013AE\r
+:102420000002B102000382260003E83000036A7054\r
+:102430000002B0210002B1020002B2010002B301A9\r
+:1024400000036A740002B0010002B1020002B20F80\r
+:102450000002B30100036A7800034A7C0003FF0016\r
+:102460000002B0020002B1020002B30400036A7C61\r
+:102470000002B0FF0002B1BF0003C120000368608A\r
+:102480000003E87000034A640002B48000024004C4\r
+:102490000003E8200003E83000036A6400034A6494\r
+:1024A0000002B480000011FC000240040002B403EA\r
+:1024B000000260040002B31000036A640002309559\r
+:1024C00000034A640002B40800024440000267743A\r
+:1024D0000002A57E0002095C0003E8000002303B18\r
+:1024E0000002A0DE0003F003000348220003F40012\r
+:1024F0000003F041000348260003FF0000038CE6C0\r
+:102500000002CAAC0003F0410002CBBE0002A0DE14\r
+:102510000003F0040003682200036A8A0003F40049\r
+:102520000003F0420003682600036A8E0003E8708F\r
+:102530000002A6BE0003F0020003F4000001C9215E\r
+:10254000000340120000F1F40002BF040002A0DE0C\r
+:102550000003F00300026AAF0003F4000003F0413F\r
+:1025600000026BBF000360120003F4000001C95CAD\r
+:102570000002B0010003E8100003E8200003E83087\r
+:1025800000036A6000034A640002B4800002400451\r
+:1025900000036A64000021F50003FF0000034808FF\r
+:1025A0000003FF000003C104000368080003EC00FF\r
+:1025B00000006A3F0000F1FF0003E8000000821302\r
+:1025C000000340080003402D0002B8400002B90893\r
+:1025D00000024A080003AAAA00024B490003ABB458\r
+:1025E0000002B30400026FAB0003F0410002B3022B\r
+:1025F00000024FAB0003F0010002B3060003402DC0\r
+:1026000000000A110002B040000240400003F04107\r
+:102610000003E8300002411E0003F0010003E8302F\r
+:1026200000009A12000021F40003E8500003FF00AC\r
+:102630000000A2190000A9F400006A3F0003FF0097\r
+:102640000003FF000002A0DE0003F003000059F1C8\r
+:102650000003F4000003F043000059F00003FF0002\r
+:102660000003FF000000D9EF00034800000384EAE4\r
+:102670000003C0440003FF000002400400036800A0\r
+:10268000000348040003C07E0003FF000003FF00B6\r
+:1026900000024337000368040003402C00005A2B5B\r
+:1026A0000002B4040003E8F0000244400003F0011B\r
+:1026B0000002BF0100024BBE0002A0BE0003F003F7\r
+:1026C000000230FD0003F4000001C9B50002BFCBD9\r
+:1026D000000233410000F2260000F2250002B0FFA4\r
+:1026E0000002B1BF0003C120000368600002B00116\r
+:1026F0000003E8100003E8200003E83000036A60EC\r
+:1027000000000A3B0000120C00001A0B0002B0028D\r
+:102710000002A0DE0003F0410002B00400038116B5\r
+:1027200000026001000340150003822A0002B1800C\r
+:10273000000262210002A43E0003F0010002B30483\r
+:102740000002B6F0000244460002B1080002611423\r
+:1027500000036A600003400A0002B0010002B102F7\r
+:102760000002B2000002B3010002A02B0003F0023D\r
+:102770000003E8200003C13B00036A680002B001C7\r
+:1027800000001241000240090003F0010003E820AC\r
+:102790000002B0130002B102000382260003E830F9\r
+:1027A00000036A700003402D00006211000012282F\r
+:1027B0000002BF4000024F4F0003F0030002A0CE12\r
+:1027C0000003F0010002B2080002B0210002B102D1\r
+:1027D0000002B30100036A7400000A2B0002B0017A\r
+:1027E0000003FF00000241100002A41E0003F005D8\r
+:1027F0000002B1040002B2000002B3020003F404BC\r
+:102800000003F0030002B1020002B20F0002B301A4\r
+:1028100000036A7800034A7C0003FF000002B00155\r
+:102820000002B1020002B30400036A7C00000A2B1C\r
+:102830000003FF000003FF000002411E0002A41E6F\r
+:1028400000020A54000002130003FF000003FF000F\r
+:102850000002C00E00008213000231D000000226E8\r
+:102860000003400A0003400D0002A00E0003F00523\r
+:102870000002B00200024005000380040003F404DB\r
+:102880000003F0030002B0080002400900038000CA\r
+:102890000002B103000268010000022B0003FF00E8\r
+:1028A0000003FF000002400E0002A40E0003F00B24\r
+:1028B000000012280002B0230002B1030002B3019D\r
+:1028C00000036A7400034A7C0003FF000002B001A9\r
+:1028D0000002B1040002B30400036A7C00034A64EE\r
+:1028E0000002B480000011EF000240040002600802\r
+:1028F0000003A2220002B30100036A6400023095C3\r
+:10290000000230A2000001FF0003FF000003FF00EF\r
+:102910000002A00E0003F04E0003402C0002BC0495\r
+:102920000003DCC00002BFC00002A0DE0003F00113\r
+:102930000002BF800003D8F000038CE40002BF3F18\r
+:1029400000024B1F00022F0B0003E8F00000F9FF0C\r
+:10295000000002130003FF000003FF000002C00E8E\r
+:102960000000821300005A2B00007A250002B808EC\r
+:1029700000024ABE0002A0AE0001CA780003AAB05D\r
+:1029800000024AAE0003F04300022D680003F40089\r
+:102990000001CA7400034A700002BA880002B970CC\r
+:1029A0000002A0F80003F0430003C12A0003F40072\r
+:1029B0000001CA720003ABB200024BBE0002A0BE0F\r
+:1029C0000003F0410003C12900036A700002330BC9\r
+:1029D0000002B0FF0002B1BF0003C1200003686025\r
+:1029E00000000A12000002130003402E0003FF0043\r
+:1029F0000002A00100020A8C0002B001000241089E\r
+:102A00000003F005000002400003FF000003FF0088\r
+:102A10000002A00E00020A8C00034A7400007A280B\r
+:102A20000003FF000003FF000003C12F00036A74CE\r
+:102A3000000231D0000002260003400A0003400DCE\r
+:102A40000002A00E0003F0050002B00800024005DD\r
+:102A5000000380000003F4040003F0030002B02030\r
+:102A6000000240090003A0000002B1430002680117\r
+:102A70000000022B0003FF000003FF000002400ED5\r
+:102A80000002A00E00020ABC000012280002B0439F\r
+:102A90000002B1040002B30100036A7400034A7C1F\r
+:102AA0000003FF000002B0010002B1050002B30400\r
+:102AB00000036A7C00034A640002B480000011EF46\r
+:102AC00000024004000260080002B8200002600812\r
+:102AD0000002B8BF000240080003A2220002B104B5\r
+:102AE0000003C13E00036A640003F4040003F0081D\r
+:102AF00000034A640002B480000011EF00024004A9\r
+:102B0000000260080003A2220002B30100036A640D\r
+:102B100000023095000230A200005A2B0002BA01D8\r
+:102B20000003FF0000024BBA0002A0BA0003F0420B\r
+:102B30000003F4000001CAE5000042100002B001E9\r
+:102B40000002A0DE0003F041000380020002400802\r
+:102B50000003F0020003F4000001CAE50003400A8C\r
+:102B60000003FF000002B040000241080002A01074\r
+:102B700000020AE5000002260003FF000003FF0038\r
+:102B80000002C00E000082260002B1020002A40171\r
+:102B900000020A11000001EF000041F90003FF00EC\r
+:102BA0000003FF000003D8000003DC8000007A412E\r
+:102BB0000002B0000003D8010002B0010003DC01F4\r
+:102BC0000002308C000002130003FF000003FF002E\r
+:102BD0000002C00E00008213000231D00003400A40\r
+:102BE0000002B0800003FF00000240090003A004BF\r
+:102BF0000002B103000268010000022B0003FF0085\r
+:102C00000003FF000002400E0002A40E0003F00BC0\r
+:102C1000000012280002B0430002B1050002B30117\r
+:102C200000036A7400034A7C0003FF000002B00145\r
+:102C30000002B1060002B30400036A7C00034A6488\r
+:102C40000002B480000011EF00024004000260089E\r
+:102C50000003A2220002B3010002B10000036A6473\r
+:102C600000023095000230A200005A2B0002BA0385\r
+:102C70000002B9010003FF00000248BA0002A48963\r
+:102C80000001CB570002B9040003FF00000248BA5C\r
+:102C90000002A08A0001CB39000002250002B20820\r
+:102CA0000002B3000003FF000002A4020001CB57A2\r
+:102CB0000002A00E0003F04300009A250003F40078\r
+:102CC0000001CA5400024BB90002A0B90001CB5761\r
+:102CD000000092250003F4000001CA540003F40030\r
+:102CE0000001CB57000042100002B0010002A0DE3C\r
+:102CF0000003F04100038002000240080003F002DC\r
+:102D00000003F4000001CB570003402E0003FF0036\r
+:102D10000002B008000241080002A01000020B5798\r
+:102D20000002B080000241080003F00500000240EC\r
+:102D30000003FF000003FF000002A00E00020B577B\r
+:102D4000000002250003FF000003FF000003E8105D\r
+:102D500000008A250002A40E00020A5400005A2B2B\r
+:102D60000003FF0000034A700003FF0000024BBE97\r
+:102D70000002A0BE0003F0420002B28000036A70AD\r
+:102D8000000061F9000059EF0003FF000003DCC000\r
+:102D90000003D8B000007A410002B0000003D8015F\r
+:102DA0000002B0010003DC010003400D0002BD4041\r
+:102DB0000003FF0000024DD50002A6DE0003F00371\r
+:102DC00000022F2B0003F4040003F00A0002B07F7E\r
+:102DD0000002B1FF0002B2FF000368600003686BED\r
+:102DE000000011E50002B3C00003E8D00003604C0E\r
+:102DF00000022F660002B0010003E8100003E82083\r
+:102E00000003E83000036A60000231D00003EC00E8\r
+:102E100000006A3F0003FF000003FF000002A0DE85\r
+:102E20000003F0030002BB530003F4000003F04171\r
+:102E30000002BB5B0003FF000003FF000000D9FCA1\r
+:102E4000000340100002BB0F000348290002A0DE6F\r
+:102E50000003F0410003482D0002BF040002400BB4\r
+:102E60000003AB0200030FFB00038CF600026CCFE3\r
+:102E700000038FF6000349E80002A34C0003F004AE\r
+:102E80000003044C0003055F0003F4000003F04559\r
+:102E9000000384E6000385560003A556000265542E\r
+:102EA0000002644E0003C1040003C1150002A0DE4D\r
+:102EB0000003F00400036829000369E80003F4003C\r
+:102EC0000003F0420003682D000369EC0003E800F2\r
+:102ED0000002304F000348010002B0BF000244402E\r
+:102EE000000368010003E8000002B1400003E8208D\r
+:102EF0000003E83000036A440002B0010003E81058\r
+:102F00000003E8200003E83000036A600002BF020B\r
+:102F1000000231D500000A3B0000120C00001A0B21\r
+:102F20000002B0020002A0DE0003F0410002B00483\r
+:102F300000038116000260010003822A0002B184AE\r
+:102F4000000262210002A43E0003F0010002B3046B\r
+:102F50000002B11800036A600003400A0002B001D9\r
+:102F60000002B1020002B2120003E83000036A68F6\r
+:102F70000002B08000001241000240080003F0018E\r
+:102F80000003E8200002B0130002B1020003822611\r
+:102F90000003E83000036A700002B0210002B102B1\r
+:102FA0000002B2010002B30100036A740002B00122\r
+:102FB0000002B1020002B20F0002B30100036A78FE\r
+:102FC00000034A7C0003FF000002B0020002B102CD\r
+:102FD0000002B30400036A7C0003E8000003C000A1\r
+:102FE0000002B1BF0003C120000368600003E87065\r
+:102FF00000034A640002B4800002400400036A64D3\r
+:1030000000034A640002B480000011FC0002400486\r
+:103010000002B403000260040002B31000036A64FB\r
+:103020000002309500034A640002B40800024440E4\r
+:10303000000267740002A57E00020C3C0003E80059\r
+:103040000002304F0002A0DE0003F0040003482A13\r
+:10305000000349E80003F4000003F0420003482E97\r
+:10306000000349EC0002BC110002BF100002C99F1E\r
+:103070000002C88C0003C1080003C1190002A0DED1\r
+:103080000003F0040003682A000369E80003F40069\r
+:103090000003F0420003682E000369EC0002BB014C\r
+:1030A0000000DA3E0003E87000038BE500038BB6F6\r
+:1030B0000002A58B0003F0020003F4000001CBFC2A\r
+:1030C000000340120000F1F40002BF200002A0DE65\r
+:1030D0000003F00300026AAF0003F4000003F041B4\r
+:1030E00000026BBF000360120003F4000001CC3C3F\r
+:1030F0000002B0010003E8100003E8200003E830FC\r
+:1031000000036A6000034A640002B48000024004C5\r
+:1031100000036A640003EC0000006A3F0003E8005B\r
+:10312000000081D90002B008000081FB0002A0DE8F\r
+:103130000003F003000059F10003F4000003F04124\r
+:10314000000059F00002B07F0002A1FE0003F04130\r
+:1031500000024BB00000D9EF0002B0FF0002B1BF87\r
+:103160000003C120000368600002B0010003E81002\r
+:103170000003E8200003E83000036A6000000A3B17\r
+:103180000000120C00001A0B0002B0020002A0DEC8\r
+:103190000003F0410002B004000381160002600148\r
+:1031A0000003822A0002B180000262210002A43ED4\r
+:1031B0000003F0010002B304000340150002B1084F\r
+:1031C0000002B6F0000244460002611400036A6087\r
+:1031D0000002B0010002B1020002B2000002B3021C\r
+:1031E00000036A68000011FB0002B0130002B10284\r
+:1031F000000382260003E83000036A7000001228F2\r
+:103200000002B0210002B1020002B30100036A749F\r
+:103210000002B0010002B1020002B20F0002B301CD\r
+:1032200000036A7800034A7C0003FF000002B0013B\r
+:103230000002B1020002B30400036A7C0002BC0475\r
+:103240000003DCC0000079EF000061FB0002BB1846\r
+:103250000003D8F000022F0B000001D90003402525\r
+:103260000002BF100002C00E000081D900024F5FB3\r
+:103270000003F00300022D680003F4000001CCA954\r
+:103280000002BF080002A00E0003F0010003C1FE0F\r
+:103290000002330B00034A800002A0FE0003F0414D\r
+:1032A00000036A84000061EF0002B0800003E8F0D0\r
+:1032B0000002A1C00003F0410003C1FE00022D1B6B\r
+:1032C000000231D0000011EF0003E8100002B0232B\r
+:1032D0000003A2220002B30100036A6400023095D9\r
+:1032E000000061D9000001EF000009F90003402649\r
+:1032F0000002B2100003D8000003DC10000079FBCC\r
+:103300000002B0000003D8010002B0010003DC019C\r
+:10331000000242290003F0450003AFF00002A0CEF6\r
+:103320000003F0020003FB000003FB010003D09E3A\r
+:103330000003FB000002A52E0003F0010003FB00C8\r
+:103340000003D49F0003FB010002A52E0003F0013F\r
+:103350000003FB0100030FFE00020CCB000001D9AB\r
+:103360000003FF000003FF000002C00E000081D92F\r
+:10337000000061EF0002B0800003C1FE0002A1C0A6\r
+:103380000003F0410003E8F000022D1B000231D0E1\r
+:10339000000011EF0002B0030003E8100003A222B6\r
+:1033A0000002B30100036A6400023095000230A2FB\r
+:1033B00000034025000001D90002B1030002B20859\r
+:1033C0000002B310000243350003F0020002422560\r
+:1033D0000003F0020002A5010001CC96000061F993\r
+:1033E000000059EF0003FF000003DCC00003D8B069\r
+:1033F0000002B0000003D8010002B0010003DC01AC\r
+:10340000000079FB0003400D0002BD400003FF00F7\r
+:1034100000024DD50002A6DE0003F00300022F2BB0\r
+:103420000003F4040003F00A0002B07F0002B1FFC1\r
+:103430000002B2FF000368600003686B000011E542\r
+:103440000002B3C00003E8D00003604C00022F6606\r
+:103450000002B0010003E8100003E8200003E83098\r
+:1034600000036A60000231D00003EC000002BC11CE\r
+:103470000002A0DE0003F004000348CC000348D1A2\r
+:103480000003F4000003F042000348EC000348F19D\r
+:1034900000022D530002A0DE0003F004000368CCFC\r
+:1034A000000368D10003F4000003F042000368EC5D\r
+:1034B000000368F10002A0DE0003F004000348D41A\r
+:1034C000000348D90003F4000003F042000348F46D\r
+:1034D000000348F900022D530002A0DE0003F004AF\r
+:1034E000000368D4000368D90003F4000003F0422D\r
+:1034F000000368F4000368F90002A0DE0003F00393\r
+:10350000000348DC0003F4000003F041000348FC22\r
+:103510000002A0FE0003F0040002C00C0002C11C67\r
+:103520000003F4000003F0420003000C0003011C40\r
+:103530000002A0DE0003F003000368DC0003F400D7\r
+:103540000003F041000368FC0003EC000002A0FE51\r
+:103550000003F00A0002C00C0002C11C0002C22CD1\r
+:103560000002C33C0002C44C0002C55C0002C66CF1\r
+:103570000002C77C0003F4000003F0480003000CC5\r
+:103580000003011C0003022C0003033C0003044C55\r
+:103590000003055C0003066C0003077C0003EC00DD\r
+:1035A0000002B07F0002B1FF0002B2FF00036860BA\r
+:1035B0000003686B000009E50003E8000003A003B6\r
+:1035C0000003DC000003D810000340310002BF03F9\r
+:1035D0000002BC020002A6FC0003F0410003C10788\r
+:1035E0000002A0FC0003F0410003C1060002A0FE9F\r
+:1035F0000003F0410003C1050002A1FE0003F041F9\r
+:103600000003C1040003C1100003C1200003C13046\r
+:103610000003FE000003D41E0003686B0003FB00E0\r
+:1036200000030FFE00020D75000340350002BF03CA\r
+:103630000003FF000002A6FC0003F0410003C107E5\r
+:103640000002A0FC0003F0410003C1060002A0FE3E\r
+:103650000003F0410003C1050002A1FE0003F04198\r
+:103660000003C1040003C1100003C1200003C130E6\r
+:103670000003FE000003D41E0003686B0003FB0080\r
+:1036800000030FFE00020D8D000340380003403D93\r
+:103690000003FF0000036A8400036A810003EC005A\r
+:1036A00000036150000361550003615A0003615F2C\r
+:1036B000000348540003FF000003E8300003A33375\r
+:1036C000000368540003686B000348550003E800DA\r
+:1036D0000003E8700002B2EF0002B1FF0002B0BFC9\r
+:1036E000000368600003686B0003497C0002B404B7\r
+:1036F000000261140003697C0003493C0003FF00E1\r
+:103700000002611E0003693C00034A940003413932\r
+:103710000003FF000003FF000002A6370003F007CC\r
+:103720000002A6260003F0050002A6150003F00320\r
+:103730000002A5040003F00100036138000360FCEF\r
+:103740000003FF000003FE000003FF0000034864C5\r
+:103750000002B410000242240002A0240003F0433F\r
+:1037600000022E150003F4000001CDD00002B0FFCE\r
+:103770000002B1FF0002B2FF0002B3FF00036A9033\r
+:103780000003493C0003C04E000241140003693CA1\r
+:10379000000348540002B53F00024353000368543D\r
+:1037A0000003E800000081F40000821A0000821B80\r
+:1037B0000003486400038CEA0000F21500024C0C80\r
+:1037C0000003F048000348340003FF0000038008B2\r
+:1037D0000003A00C0002A00E0003F80100020DF18E\r
+:1037E000000082150003F803000348550003E800B9\r
+:1037F00000038707000368550003493D0002BF101E\r
+:103800000002444F0003F0040002BFFF00022E7BC1\r
+:103810000002BF5000022E7B0003A7700003077E4A\r
+:1038200000020E070003C0200003C0100003C00008\r
+:10383000000368600003686B0003A0100003686069\r
+:1038400000034150000341550003415A0003415F0A\r
+:103850000003EC000003F803000349D00002B8089D\r
+:10386000000249380002A09800020E68000349D403\r
+:103870000002B410000243340002A03400020E44DF\r
+:10388000000348080002B808000260080003680846\r
+:10389000000348280002B820000263380003482DC6\r
+:1038A00000036828000369E8000267780003682DB8\r
+:1038B000000369ED000348C80002B8FB000242287B\r
+:1038C000000368C8000348980002B820000260089E\r
+:1038D000000348B10003689800026448000368B11F\r
+:1038E0000003C10E0003C11E0003C12E0003C13E30\r
+:1038F00000036330000363700003633400036374E8\r
+:1039000000036338000363780003F4000001CE680D\r
+:10391000000348080002B8F70002400800036808E6\r
+:10392000000348280002B8DF000243380003482D96\r
+:1039300000036828000369E8000247780003682D47\r
+:10394000000369ED000348C80002B80400026228C1\r
+:10395000000368C8000348980002B8DF000240086E\r
+:10396000000348B10003689800024448000368B1AE\r
+:103970000002B0030003C1100003C1200003C130E6\r
+:103980000003633000036370000363340003637457\r
+:103990000003C12E0003C13E0003633800036378B7\r
+:1039A0000003497C0002B4FB000241140003697C5F\r
+:1039B0000003686B0003EC00000348CA0002B00477\r
+:1039C0000002B1400003C12800026820000368CA59\r
+:1039D0000003C182000368CA00026821000368CAAC\r
+:1039E0000003C182000368CA0003EC000003F8036F\r
+:1039F00000030FFE00020E7C0003EC000003E80051\r
+:103A00000003C0100003C0200003A0100003686082\r
+:103A10000003686B0003C10E0003E8100003E820F8\r
+:103A20000003E8300003A4130003D8100003DC40B7\r
+:103A30000003FE000003D41E0003686B000369A4AA\r
+:103A40000003E8000003FE000003D41E0003686BBF\r
+:103A5000000369A40002A0DE0003F003000342603B\r
+:103A60000003F4000003F0410003425C00034259EC\r
+:103A70000002A0DE000369A40003F0030003426813\r
+:103A80000003F4000003F04100034264000369A155\r
+:103A90000003FE000003D41E0003686B0003686B84\r
+:103AA0000003EC000003E8000003C0200003C01086\r
+:103AB0000003A010000368600003686B0003425617\r
+:103AC0000003C10E0003E8100003E8200003E83003\r
+:103AD0000003A4130003D8100003DC400003D41E2D\r
+:103AE0000002BF0200022E7B0003686B000369A482\r
+:103AF000000369A20003E8000003FF000003D41ED6\r
+:103B00000002BF0200022E7B0003686B000369A461\r
+:103B10000003E8000003C0200003C0100003C00041\r
+:103B2000000368600003686B0003EC000003686B2F\r
+:103B30000002B07F0002B1FF0002B2FF0003686024\r
+:103B40000002B10C0003E8000003A0030003DC0046\r
+:103B50000003D8100003E8000003E8100003E82089\r
+:103B60000003E8300003FE000003D41E0003686B6E\r
+:103B70000003FB000003FB00000388E30003F803DD\r
+:103B80000003FE000003D41E0003686B0003FB006B\r
+:103B90000003088E00020EE00003EC00000021FA92\r
+:103BA0000003E8500003E8600003E8700002B90871\r
+:103BB0000002B8C00003DC810003D891000342502A\r
+:103BC0000003F8030003FF0000036A440003E82039\r
+:103BD0000003011E00036A440003FE000003D45FDB\r
+:103BE0000003686B0002B4190003FE000003D45FF9\r
+:103BF0000003686B000349A50003FF000003FF00FA\r
+:103C00000003C1040003C115000382E00002622624\r
+:103C10000003C137000369A40002B9080003099E2C\r
+:103C200000020F07000369A50003EC000002A1BE1B\r
+:103C30000003F00A0003D01E00030FBE0003F803C8\r
+:103C40000003000E0003011E0003022E0003033ECA\r
+:103C50000003D41E00030FFE00020F100003FB0040\r
+:103C600000030CCE00020F0B0003EC000002A1BE0B\r
+:103C70000003F00A0003D01E00030FBE0003F80388\r
+:103C80000002C00E0002C11E0002C22E0002C33E8E\r
+:103C90000003D41E00030FFE00020F200003FB00F0\r
+:103CA00000030CCE00020F1B0003EC000003D09EAB\r
+:103CB0000003D01F0002BC3F0002488C0002499C58\r
+:103CC00000024AAC00024BBC0002440C0002451C3E\r
+:103CD0000002462C0002473C0002BC200002C084C7\r
+:103CE0000003A0000002A3480003F0410002C00C42\r
+:103CF0000002C1950003A1100002A3590003F04186\r
+:103D00000002C11C0002C2A60003A2200002A36A96\r
+:103D10000003F0410002C22C0002C3B70003A3302D\r
+:103D20000002A37B0003F0410002C33C0003E8D083\r
+:103D300000038CE9000304800002E88D0003059174\r
+:103D40000002E99D000306A20002EAAD000307B3EA\r
+:103D50000002EBBD0003626E0002488C0002499C29\r
+:103D600000024AAC00024BBC0003D49E0003426E2A\r
+:103D700000026445000264460002644700020F4DE1\r
+:103D800000006A3F0003FB000003FB0100030FFE7D\r
+:103D900000020F2B0003EC000003D09E0003D01F95\r
+:103DA0000002BC3F0002488C0002499C00024AAC61\r
+:103DB00000024BBC0002440C0002451C0002462CD1\r
+:103DC0000002473C0002BC200002C0840003A000A7\r
+:103DD0000002A3480003F0410002C00C0002C1959C\r
+:103DE0000003A1100002A3590003F0410002C11C0E\r
+:103DF0000002C2A60003A2200002A36A0003F04151\r
+:103E00000002C22C0002C3B70003A3300002A37B50\r
+:103E10000003F0410002C33C0002BC070002A3DC27\r
+:103E20000003F04E0003704C0003504E0003FF00EF\r
+:103E30000003FF000003FE000003D41E0003686BB4\r
+:103E40000003FB000003704E0003504C0003FF0012\r
+:103E50000003FF000003F4040003F0080002BC08A4\r
+:103E60000002A4DC0003F00100036A840002BC0924\r
+:103E70000002A4DC0003F00100036A800002B0FF2E\r
+:103E80000002B1BF0002B2FF000368600003FB0044\r
+:103E90000003FB010002CDDE0002A6DF00020F6678\r
+:103EA00000034A640002B4800002400400036A6414\r
+:103EB0000002B0000002B1000002B2000002B30133\r
+:103EC00000036A740002B0310002B1060002B204BD\r
+:103ED0000002B30000036A7800034A7C0003FF007D\r
+:103EE0000002B0010002B1010002B30000036A7CCD\r
+:103EF00000034A640002B480000240040002B403DC\r
+:103F00000002600400036A640002309500034A6402\r
+:103F10000002B4800002400400036A6400006A3FAB\r
+:103F20000002336C0003EC00000059F60000623E12\r
+:103F30000003FF000002A1BE0003F0420000F1F404\r
+:103F40000003EC000002A1CE0003F04100030BBE11\r
+:103F500000030CCE0000D9F60000E23E00034A4008\r
+:103F600000005A160003FF000003FF000002A0BE7D\r
+:103F70000003F0420003A0000003A2200003D05E73\r
+:103F80000000620A000059F20003A2020002400988\r
+:103F9000000242290002A58E00020FF50003088EE0\r
+:103FA0000002A00D0003F00B000042070002C44F06\r
+:103FB0000003C1540002A0BE0003F0460003D45E1B\r
+:103FC0000002C44F0003C1540003D45E0002C44F7A\r
+:103FD0000003C1540002A5AE0002100500030AAEA2\r
+:103FE0000002A02D0003F00B000052070002C66F74\r
+:103FF0000003C1760002A0BE0003F0460003D45EB9\r
+:104000000002C66F0003C1760003D45E0002C66FD3\r
+:104010000003C1760003D45E00030CCE000210063C\r
+:1040200000026B8A00020FCA0003EC00000342701A\r
+:104030000000521600038FEC000388EA0003AAA0D8\r
+:104040000002A4AE0003F0060002A1480003F04104\r
+:104050000002C4480002A1680003F0410002C668E3\r
+:1040600000038AE00002A64F0003F0430003044867\r
+:1040700000030008000301180002A66F0003F043CC\r
+:1040800000030668000302280003033800030AAE99\r
+:10409000000210190003C1540003C1760003D45E6E\r
+:1040A000000362700003EC000003C1620003066EAF\r
+:1040B0000003DC100003D8000003D09E0003FF00C3\r
+:1040C0000003FF0000024885000268830003C198D6\r
+:1040D0000003C1A80003C1B80003D49E0003FB0085\r
+:1040E0000003066E0002102E0003EC000003C11056\r
+:1040F0000003C1200003C1300002A0DE0003F0086D\r
+:10410000000369080003690C0003691000036914C7\r
+:10411000000369180003691C0003F4000003F04663\r
+:104120000003692000036924000369280003692C47\r
+:1041300000036930000369340003EC000003C11080\r
+:104140000003C1200003C1300002A0DE0003F0071D\r
+:10415000000368CC000368D0000368D4000368D86B\r
+:10416000000368DC0003F4000003F045000368EC82\r
+:10417000000368F0000368F4000368F8000368FCBB\r
+:104180000003EC00000349D40003FF00000380E5B6\r
+:1041900000024103000349D20003FF000002400A6D\r
+:1041A000000349C20002A5100003F001000349C644\r
+:1041B0000003EC000002B07F0002B1FF0002B2FF7A\r
+:1041C000000368600003686B0003E8000003E81068\r
+:1041D0000003C12E0002B330000369A40003E8000D\r
+:1041E0000002B1300003E8200003E8300003E8409B\r
+:1041F0000003A5430003D8400003DC500003FE0089\r
+:104200000003D41E0003686B0003FB000003FB00E7\r
+:104210000002B0120003E8100003FE000003D41EE9\r
+:104220000003686B0003088E000210860003EC0098\r
+:104230000003D09E0003FB000003FF000003FF000B\r
+:104240000003D49F0003FB0100030FFE0002108C4B\r
+:104250000003EC000003F8010002BF0400034A64FD\r
+:104260000003FF000003FF000002410F000210974F\r
+:104270000003F8030003686B0003FF000003FF0066\r
+:104280000003FE000003EC0000034A640003FF008B\r
+:104290000002BF080002410F0002A01F000210C36D\r
+:1042A000000340120002B5100002A5250003F0042F\r
+:1042B0000002BF0200026AAF0003F4000001D0C098\r
+:1042C0000002C4550002A5240003F0040002BF024E\r
+:1042D00000026BBF0003F4000001D0C00002C4451F\r
+:1042E0000002A5240003F0040002BF1000026AAF20\r
+:1042F0000003F4000001D0C00002BF1000026BBF39\r
+:104300000000F1F400036012000230C40003EC006E\r
+:1043100000034A700003FF000003C1C20003402EE7\r
+:104320000002B00100036AA80003FF000003FF00C1\r
+:104330000003FF0000034AAC0002B40200036AA9B4\r
+:104340000003C0000003C0110003C0220003C033FB\r
+:1043500000034AAD0002BF900002A0CF0003F005A9\r
+:104360000003C0440002BF0F00024F4F0003F400DF\r
+:104370000003F0410003C0F40002A0DE0003F00BD4\r
+:10438000000340190003FF000003FF000002644027\r
+:104390000002655100026662000267730003601943\r
+:1043A00000026AAF0003F4000003F0490003401D5F\r
+:1043B0000003FF000003FF0000026440000265519B\r
+:1043C00000026662000267730003601D00026BBF9B\r
+:1043D0000003602E0003EC000002C44600036AA93B\r
+:1043E0000003FF000003FF000003FF0000034AACCE\r
+:1043F0000003EC000002B07F0002B1FF0002B2FF38\r
+:10440000000368600003686B000009E50002B0C0AB\r
+:104410000003DC000003D8100002A0FE0003F0043B\r
+:104420000003E8000003E8100003E8200003E83080\r
+:104430000002A0FE0003F0440002B0550003C110CA\r
+:104440000003C1200003C1300002A0FE0003F004FD\r
+:104450000002B4FF0003C1540003C1640003C1742F\r
+:104460000002A0FE0003F0440002B4AA0003C154FD\r
+:104470000003C1640003C1740002BC070002A3FE74\r
+:10448000000211790000420D0003FF000003FF004D\r
+:104490000002A08E0002113F0002A0DE0003F00324\r
+:1044A000000340420003F4040003F001000340460F\r
+:1044B0000000EA3F00006A0E0002A4DE0003F004E0\r
+:1044C0000003C0880003C0990003C0AA0003C0BB5A\r
+:1044D00000026008000261190002622A0002633BC8\r
+:1044E00000026448000265590002666A0002677BA8\r
+:1044F00000006A3F0003FF000003FF000003FE000E\r
+:104500000003D41E0003686B0003FB0000030CCE05\r
+:104510000003FE000003D45E0003686B0003FB0091\r
+:1045200000030CCE0002113F0000420D0000620E9D\r
+:104530000003FF000002A08E000211640003404A45\r
+:104540000002A4CE0003F0040003C0880003C09959\r
+:104550000003C0AA0003C0BB0002A4DE0003F002F7\r
+:104560000003C18A0003C19B0002BA0F00024AA8DF\r
+:1045700000038BA600026AAB0002BBF000024BB83E\r
+:104580000003A7B600026BB70003F4040003F003B6\r
+:104590000003E8600003E8A00003E8B00002B4F004\r
+:1045A0000002604A0003C1100003C1200003C130B3\r
+:1045B00000036A840002A0FE0003F0030002B4F0CE\r
+:1045C0000003F4040003F0010002B40F0002604B8A\r
+:1045D0000003C1100003C1200003C13000036A8042\r
+:1045E0000003EC000003FE000003D41E0003686B10\r
+:1045F0000003FB0000030CCE0002B9030002A0F987\r
+:104600000003F0440003E8400003E8500003E860C2\r
+:104610000003E8700003FE000003D45E0003686B33\r
+:104620000003FB0000030CCE000211850002B0F075\r
+:104630000002B1FF0002A0F90003F0420003E8000D\r
+:104640000003E8100003C1210003C13100036A84A4\r
+:1046500000036A800003EC000002B07F0002B1FF9B\r
+:104660000002B2FF000368600003686B000009E508\r
+:104670000002B0C00003DC000003D8100002B4FF49\r
+:104680000003C1640003C1740002BC070003FE0004\r
+:104690000002B5FF0003D45E0003686B0003FB005B\r
+:1046A00000030CCE0003FE000002B5EF0003D45E51\r
+:1046B0000003686B0003FB0000030CCE000211A393\r
+:1046C0000002B5FF00036A850002B0F00003C110CC\r
+:1046D0000003C1200003C13000036A8000034A6266\r
+:1046E000000231D00003E8F0000231DC00036A620E\r
+:1046F000000009E50002B0C00003DC000003D81090\r
+:104700000002B4FF0003C1540003C1640003C1747C\r
+:104710000002BC070003FE000003D45E0003686BC8\r
+:104720000003FB0000030CCE000211C50002B0FF25\r
+:104730000002B1BF0003C120000368600003EC0069\r
+:1047400000034A640002B4800002400400036A646B\r
+:104750000003EC000002B0040002A0F00003F0032C\r
+:10476000000230FD0003F4040003F00100022D6894\r
+:104770000003E8000003C0000003C1100002B2FD06\r
+:104780000003686000000A3B0000320C00001A0BB6\r
+:104790000002B00A0002A0DE0003F0410002B00CEB\r
+:1047A00000038116000260010002B1160002A43E5F\r
+:1047B0000003F0010002B3040003866A0002B202A3\r
+:1047C0000002B4040002A3FE0003F0030002A0F400\r
+:1047D0000003F0010002B2040002622600036A60D6\r
+:1047E00000038FE100022E7B0003686B0003FF00D3\r
+:1047F0000003FE000003EC0000034A600003FF001A\r
+:104800000003E8300002600E00036A6000034A649F\r
+:104810000002B4F20002400400036A640003EC00EA\r
+:1048200000006A3F000340040003FF000002B804D8\r
+:10483000000245E00002A05E0003F0440002A0DE9A\r
+:104840000003F042000340240003FF00000061F871\r
+:104850000003FF000003FF000003DCC000038FEA39\r
+:104860000002A0DE0003F0010003E8F00003D8F02E\r
+:1048700000038CE40003C1B20003493D0002A0DE46\r
+:104880000003F041000349410003FF000002446EB1\r
+:104890000003F0010002BC07000240080003F043DF\r
+:1048A00000022F0B0003F4000003F04100022F1B55\r
+:1048B0000002446E0003F0090003E8C00003AB628D\r
+:1048C0000003A5600002455E0003F04300022F0BC9\r
+:1048D0000003F4000003F04100022F1B0003EC0072\r
+:1048E000000348C0000348C50003E8100003E85077\r
+:1048F0000002A0DE0003F008000368C000000231DF\r
+:1049000000000A300003FF000003FF00000368C03E\r
+:104910000003F4000003F046000368C50000222FE6\r
+:1049200000002A2E0003FF000003FF00000368C5FB\r
+:104930000003EC0000006A3F0003FF000003FF00DB\r
+:10494000000051F90002A0DE0003F003000059F15D\r
+:104950000003F4000003F041000059F00003FF00E1\r
+:104960000003DCA00003D8B0000340060003FF00F2\r
+:104970000003FF00000240E80003F0030002A0DE95\r
+:104980000003F041000340260003FF000003FF0086\r
+:10499000000349410002A00E0003F0430002A0DE24\r
+:1049A0000003F0410003C1450002454E0003F043FF\r
+:1049B00000038CE40003F4000003F04100038CE3E7\r
+:1049C000000389980003AA9C0002A0AE0003F00334\r
+:1049D00000022F0B0003F4000003F04100022F1B24\r
+:1049E000000340060003FF000003FF0000034941ED\r
+:1049F0000002408E0002A00E0003F0430002A0DE81\r
+:104A00000003F0410003C1450003E8C00003AB42CE\r
+:104A10000002454E0003F0070003A5400002455E7A\r
+:104A20000003F04300022F0B0003F4000003F041E9\r
+:104A300000022F1B0003EC000002A0DE0003F003C5\r
+:104A4000000348210003F4000003F041000348255F\r
+:104A50000003FF000002BB010003A26600038166A1\r
+:104A60000003A11600038776000260270003000BF5\r
+:104A70000003A70600038206000266210002A0DEF2\r
+:104A80000003F0040003682100036A890003F400B6\r
+:104A90000003F0420003682500036A8D0003EC0068\r
+:104AA00000038FED00022E7B0003E830000382E05C\r
+:104AB0000003E8100003E8000003683000038FEDF6\r
+:104AC00000022E7B0003E8F0000349700003E87049\r
+:104AD0000002B6010003C1510003C1400003683168\r
+:104AE0000002B8FC0003C1530003C1420002455854\r
+:104AF00000034974000232F8000368310003C15119\r
+:104B00000003C140000232F8000368310003C153C2\r
+:104B10000003C14200034998000232F800036831E3\r
+:104B20000003C1510003C140000232F800036831A4\r
+:104B30000003C1530003C1420003499C000232F844\r
+:104B4000000368310003C1510003C140000232F884\r
+:104B5000000368310003C1530003C142000348E869\r
+:104B6000000232F8000368310003C1510003C14064\r
+:104B70000002B710000232F8000368310003C1538D\r
+:104B80000003C142000232F8000368310003EC0068\r
+:104B90000003493D0002B008000240040003F00594\r
+:104BA00000034AA40003FF000003FF000002B20359\r
+:104BB00000036AA40002B004000241040002A01035\r
+:104BC0000003F046000348C0000348C50002B103DB\r
+:104BD0000002B503000368C0000368C50003EC00D1\r
+:104BE0000003FF000003FF000003FF000003EC00D0\r
+:104BF0000003614800036141000361460003627FD6\r
+:104C00000003C10E0003E8100003E8200003E830B1\r
+:104C1000000368E80003E8000003FF00000368E801\r
+:104C2000000341480003FF000003EC000002B07FD6\r
+:104C30000002B1FF0002B2FF000368600003686B6E\r
+:104C4000000009E50003E8000003A0030003DC0006\r
+:104C50000003D8100002BC030002B0F70002A0FE5F\r
+:104C60000003F0410002B07F0003C1100003C12027\r
+:104C70000003C1300002B4FF0003C1540003C1644B\r
+:104C80000003C1740003FE000003D41E0003686B20\r
+:104C90000003A0010003A1110003A2210003A3311E\r
+:104CA0000003FB000003FE000003D45E0003686BFA\r
+:104CB0000003FB0000030CCE000213210002B0FF32\r
+:104CC0000002BC080003C1100003C1200003C13072\r
+:104CD00000036A800002A4FE0001D33B0002A0FC96\r
+:104CE0000003F00200036A840003EC000002B0F746\r
+:104CF0000003A1010003A2110003A32100036A84A1\r
+:104D00000003EC000003493D0003FF000002B880EF\r
+:104D1000000264480003693D0002B0010002B102D4\r
+:104D20000002B23F0002422F0002B30000036A6893\r
+:104D30000002B0000002B1000002B2000002B302A3\r
+:104D400000036A740002B1010002B2080002B3005D\r
+:104D500000036A780002B0010002B20000036A7C1E\r
+:104D6000000011EF0002B0C00002400F0003A002DB\r
+:104D70000002600E0002B1000003A2220002B30193\r
+:104D800000036A640002B0FF0002B1BF0003C1204B\r
+:104D9000000368600003FF000003FF00000230957D\r
+:104DA0000002B87F000244480003693D0003EC00A4\r
+:104DB0000003E8000003E8100002B2030002B300A1\r
+:104DC000000368300003EC000003E8000000823FAD\r
+:104DD000000222FA0000F23F000222FA000233A889\r
+:104DE00000022E6E000349980002B4F7000241143D\r
+:104DF000000369980003C12E0003E8300003683007\r
+:104E000000000217000381E00003E8400002A00157\r
+:104E10000003F0010003C14E000234B20003480851\r
+:104E20000002B8FE00024118000368080003E80011\r
+:104E30000000823F0002245A0000F23F0002245A80\r
+:104E400000000217000381E00003FF000002A4102D\r
+:104E50000003F0020003C14E000234B2000234022B\r
+:104E60000003402C0002B8400002B9800002BBFFE2\r
+:104E700000034AA5000248180003F0010002BBCF5E\r
+:104E8000000249190003F0020002BA3F00024BBAC7\r
+:104E90000002455B00036AA50003F4000001C26C38\r
+:104EA000000349D10002B840000244780003844066\r
+:104EB0000003489C000385E20002600400026005D4\r
+:104EC0000003689C000368A0000368B4000368B88E\r
+:104ED00000034938000385E10003C0550002422564\r
+:104EE0000003693800036A5C0003A0E1000381E16C\r
+:104EF0000003E830000382E8000385E50002302A61\r
+:104F0000000343A6000380E80003FF000002488579\r
+:104F1000000268800003C1980003C1A80003C1B863\r
+:104F2000000363A6000363E60003E8000003E8D083\r
+:104F30000002303B0003C1DE0002303B0002306162\r
+:104F4000000384E20003C1C90003E800000381E11B\r
+:104F5000000383E40002C2310003022E0002C33EBC\r
+:104F6000000244490003F001000383E50003E85018\r
+:104F70000002302A000380EA0002302A000388E59C\r
+:104F8000000384E00002444C0003F002000388E4C4\r
+:104F90000002C88E0003C1980003C1A80003C1B875\r
+:104FA0000003632A0003636A00023061000381E2A8\r
+:104FB0000003A0E10003A396000382E40002C22ED6\r
+:104FC0000003E8500002302A0003A0E30002302A68\r
+:104FD00000023061000380E5000240A00003C11020\r
+:104FE0000003C1200003C130000364A8000364E88B\r
+:104FF000000380E0000282080002420200038224D3\r
+:10500000000091E30003EC000002306100034970EE\r
+:105010000002448E0003F0430002B5F30002422573\r
+:10502000000369700003E8700003C16E0003C15300\r
+:105030000003C142000368310002449E0003F006F1\r
+:105040000003499C0003A4E1000262240003C15351\r
+:105050000003C142000368310002448E0003F04D9A\r
+:105060000003499C000384E50003A5E70002400417\r
+:10507000000241150003A488000384400003854614\r
+:1050800000026005000261140003E8300003C12E35\r
+:1050900000036830000343A4000021E30002B50FC1\r
+:1050A0000003FF0000024005000260040003C1107D\r
+:1050B0000003C1200003C130000363A4000363E4C4\r
+:1050C000000381840003A01800038206000260022E\r
+:1050D0000003E8D00002304F0003C1DE0002304F71\r
+:1050E000000348900003A4BA0003A5E7000241159D\r
+:1050F0000002611400036890000368A8000368942C\r
+:10510000000368AC0003A0A60003C1100003C12087\r
+:105110000003C130000364240003646400038AB602\r
+:10512000000348210002B803000266680002B90FBC\r
+:105130000002BBFE000246690002666A0002477B6D\r
+:105140000003682100036A890003682500036A8D53\r
+:1051500000034808000348210002611E000368089C\r
+:10516000000348C80002B8400002B93F00026008CE\r
+:10517000000368C800024009000368C80002655EB9\r
+:105180000003682100036A890003682500036A8D13\r
+:105190000002455B0003682100036A89000368255B\r
+:1051A00000036A8D0003EC000003402C0002B840AD\r
+:1051B0000002B9800003E8B000034AA500024818C5\r
+:1051C0000003F0010002BB30000249190003F002A5\r
+:1051D0000002BAC000026BBA0002655B00036AA558\r
+:1051E0000003489C000348A10002BC7B0002400C65\r
+:1051F0000002444C0003689C000368A1000348B40B\r
+:10520000000348B90002400C0002444C000368B49B\r
+:10521000000368B900034890000384E20003A5E797\r
+:10522000000241150002611400036890000368A8A1\r
+:1052300000036894000368AC00034938000385E16B\r
+:10524000000262250003693800036A5C0003A0E1E4\r
+:10525000000381E1000383E8000382E8000385E5A1\r
+:105260000002302A0003E800000381E1000383E428\r
+:105270000002C2310003E8300003E8500002302A87\r
+:10528000000380EA0002302A000348080003482196\r
+:105290000003A8ED00024118000368080003A8EB12\r
+:1052A000000246680003C03E000245530003682127\r
+:1052B00000036A890003682500036A8D0003E84043\r
+:1052C000000234B20003EC00000349740003C16E15\r
+:1052D0000003E870000388480003C05E000385599E\r
+:1052E0000002422500026228000369740003C142E3\r
+:1052F0000003C153000368310003EC0000034808B9\r
+:105300000002B8FE00024118000368080003485478\r
+:105310000002BC600002622C00036854000349765E\r
+:105320000002BC10000264AC0003C15B0003C16E4C\r
+:105330000003E87000036831000232F800034854AB\r
+:105340000002BC9F0002422C000368540003C14AC3\r
+:1053500000036831000234540003EC000000F1DE69\r
+:105360000000F1DD0003C1FD0003C1CE00034804CD\r
+:105370000003C07E000243370003680400034808AE\r
+:105380000003FF00000384E80002600400036808D3\r
+:1053900000034998000385E20003C055000241154F\r
+:1053A000000384E5000260040003E8300003C12E1E\r
+:1053B000000368300003E8D000022ECB0003F801A0\r
+:1053C0000003400D0003FF000002B0010002400690\r
+:1053D0000002150B0002A0ED0003F0050002BB3E29\r
+:1053E00000024BB60003ABB00003F4040003F00D61\r
+:1053F0000002B0000002B2020003A36A00030BAE79\r
+:105400000002A0300003F00700030BBE0002A03E24\r
+:105410000003F00400030BBE0002A0320003F00101\r
+:1054200000030BBE0003F4040003F0010003E8B026\r
+:10543000000348190002B2E0000246620002666BF7\r
+:1054400000036819000349E50003FF0000024662FB\r
+:105450000002666B000369E50003C1AB00022E7F0A\r
+:1054600000022EE70002B40F00034A400003F801D7\r
+:105470000002A4400003F0060002A4410003F0046F\r
+:105480000002A4420003F0020002A043000215370C\r
+:105490000002CAAE0002B0200002A0A00003F0414A\r
+:1054A0000003E8A00002A0AB0002155F000348194A\r
+:1054B0000002B2E0000246620002666A0003681958\r
+:1054C000000349E50003FF00000246620002666A2D\r
+:1054D000000369E50003F404000215180000D1DFA1\r
+:1054E0000002A0DE0002153E0000D1E00002CDDE89\r
+:1054F0000003F404000214EF000041E00003FF0089\r
+:105500000003FF000002A0A8000215650002A1A888\r
+:105510000003F048000348210003038A000383309E\r
+:10552000000267730003682100036A890003F40422\r
+:1055300000021565000348190002B2E0000246624D\r
+:105540000002666800036819000349E50003FF00D4\r
+:105550000002466200026668000369E50003482510\r
+:10556000000303A80003833000026773000368256B\r
+:1055700000036A8D0003F404000215650003401166\r
+:105580000003E8C00000F1F40002B8800002677870\r
+:10559000000360110003C1DF00034998000385E2A6\r
+:1055A0000003C05500024115000369980003E8306C\r
+:1055B0000003C12E00036830000348080003FF0009\r
+:1055C000000384C800026004000368080003F803B5\r
+:1055D0000003EC000003FF000003FF0000006A3F2F\r
+:1055E0000003E80000008219000081DC0002B00125\r
+:1055F0000002B1110002B21000036A440002B110AF\r
+:105600000003E82000036A44000340240002A0DEF7\r
+:105610000003F0030002BB530003F4000003F04159\r
+:105620000002BB5B0000D9FC0002400E0003F04BFF\r
+:10563000000340100002BC040003DCC000038FEA3A\r
+:105640000002A0DE0003F0010003E8F00003D8F040\r
+:105650000002BC090003C1B100022F0B000340246B\r
+:105660000003FF000002BC020002400C0003F04BEC\r
+:10567000000340100002BC040003DCC00002BFC0F5\r
+:105680000002A0DE0003F0010002BF800003D8F09A\r
+:1056900000038CE40003C1B100022F0B0003499802\r
+:1056A000000388E50002B5FD0003C13E0002A0DE54\r
+:1056B0000003F001000383300003C12E00026008E4\r
+:1056C0000002411500036830000348080002B4409E\r
+:1056D000000081F50002600400036808000348012F\r
+:1056E0000002B0BF00024440000368010003E8006C\r
+:1056F0000002B1400003E8200003E83000036A44E0\r
+:105700000003402E0002B0010003E8100003E8206F\r
+:105710000003E83000036A6000022D680002B00157\r
+:105720000002B1020002B2060003E83000036A681A\r
+:10573000000012410002B0130002B10200038226F1\r
+:105740000003E83000036A700002B0210002B102D9\r
+:105750000002B2040002B30100036A740002B00147\r
+:105760000002B1020002B20F0002B30100036A7826\r
+:1057700000034A7C0003FF000002B0000002B100F9\r
+:105780000002B30400036A7C0002BF180002365115\r
+:105790000002367E0002BF00000231D500034A70CD\r
+:1057A0000003FF000003FF000002B29000036A70D4\r
+:1057B0000002BF13000236510002367E000340246F\r
+:1057C0000003FF000003FF000002400E0003F04B47\r
+:1057D000000340100002BC040003DCC000038FEA99\r
+:1057E0000002A0DE0003F0010003E8F00003D8F09F\r
+:1057F0000002BC0900038B1000022F1B0003402491\r
+:105800000003FF000002BC020002400C0003F04B4A\r
+:10581000000340100002BC040003DCC00002BFC053\r
+:105820000002A0DE0003F0010002BF800003D8F0F8\r
+:1058300000038CE400038B1000022F1B00034A704E\r
+:105840000003FF000003FF000002B28000036A7043\r
+:105850000002BF18000236510002367E0002BF006F\r
+:10586000000231D500034A700003FF000003FF006F\r
+:105870000002B29000036A700002BF1300023651AA\r
+:105880000002367E000340240003FF000003FF00F7\r
+:105890000002400E0003F04B000340100002BC0465\r
+:1058A0000003DCC000038FEA0002A0DE0003F00169\r
+:1058B0000003E8F00003D8F00002BC090003C1B106\r
+:1058C00000022F0B000340240003FF000002BC0273\r
+:1058D0000002400C0003F04B000340120002BC0425\r
+:1058E0000003DCC00002BFC00002A0DE0003F00124\r
+:1058F0000002BF800003D8F000038CE40003C1B9AC\r
+:1059000000022F0B0002B0010003E8100003E820A2\r
+:105910000003E83000036A6000034A640002B480B8\r
+:105920000002400400036A64000021F50003FF0048\r
+:10593000000348080003FF000003C10400036808D7\r
+:105940000003EC000003E8000003C0000002B1BF48\r
+:105950000003C120000368600002B0010003E810EA\r
+:105960000003E8200003E83000036A6000034A6493\r
+:105970000002B4800002400400036A6400000A3B95\r
+:105980000000120C00001A0B0002B0020002A0DEA0\r
+:105990000003F0410002B004000381160002600120\r
+:1059A0000003822A0002B184000262210002A43EA8\r
+:1059B0000003F0010002B3040003C11F00036A608A\r
+:1059C00000034A640002B480000011FC000240049D\r
+:1059D0000002B403000260040002B31000036A6412\r
+:1059E000000230950002BF0800024FF00003F001F2\r
+:1059F0000000F2190003EC00000002190003FF0090\r
+:105A00000003FF000002A50E0003F0010003EC00FC\r
+:105A10000003E80000008219000340120003FF00A9\r
+:105A20000003FF000002448E0002A04E0003F001BC\r
+:105A30000000F1F40002BF400002A0DE0003F0030A\r
+:105A400000026AAF0003F4000003F04100026BBFE4\r
+:105A500000036012000230C4000079DC0003FF0084\r
+:105A6000000340280002A0FE0003F0410003EC0008\r
+:105A70000002A0DE0003F0050002C00E0003F041AA\r
+:105A80000002C11E0003F4000003F0430002C22E16\r
+:105A90000003F0410002C33E000360280000F1DC77\r
+:105AA0000003EC000000021400000A4000006A3FFE\r
+:105AB0000003FF00000240010002A00E0003F001FD\r
+:105AC0000003EC000003489C000348A100034A4A7D\r
+:105AD0000002A0DE0003F043000348B4000348B90D\r
+:105AE00000034A4E0002BC100002622E0002666EE5\r
+:105AF0000002688C0002699C0002A0DE0003F00531\r
+:105B00000003689C000368A100036A4A0003F400D4\r
+:105B10000003F043000368B4000368B900036A4E51\r
+:105B20000003E8C00000E1DB0002B0100002B10099\r
+:105B30000002B2100002B300000362740002B080E1\r
+:105B40000003D8010002B0000003DC010002B01223\r
+:105B50000002B1020002B2120002B302000362743A\r
+:105B60000002B0100002B1120002B2100002B31223\r
+:105B700000036270000362440002B1020002B3023B\r
+:105B80000003624C000362480003402C0003FF0046\r
+:105B90000003FF000003E8200003E8300003602C4E\r
+:105BA0000003E8000003E810000061DB0003601858\r
+:105BB0000003601C0003C18C0003C19C0003C1AC46\r
+:105BC0000003C1BC0002377300023577000061DBBF\r
+:105BD0000003FF000002B0000003DC000002B04040\r
+:105BE00000038FC20002C00F0003D800000340185A\r
+:105BF0000002A0DE0003F0410003401C0003402D22\r
+:105C00000003FF000003D41E0003D45F0002BF00A6\r
+:105C10000003DCF00002BFC0000388C20002CFF81E\r
+:105C20000003D8F00003C4000003C4110003C42221\r
+:105C30000003C4330002B50F000244650003A566EB\r
+:105C40000002A0DE0003F0430002B50F000244751D\r
+:105C50000003A5760003A6420003844A0003A7526E\r
+:105C60000003855A0003C4440003C4660002C00157\r
+:105C70000002C0040002C2230002C2260003C415B1\r
+:105C80000003C4370003D41E0003427500034272B0\r
+:105C90000002BF100002A1040003F0460002A509A3\r
+:105CA0000003F0040003C18C0003C1900003C1ACE9\r
+:105CB0000003C1B00002A3090003F0420003C1AC1D\r
+:105CC0000003C1B000036272000342460002A12635\r
+:105CD0000003F0460002A5290003F0040003C18C74\r
+:105CE0000003C1920003C1AC0003C1B20002A329AA\r
+:105CF0000003F0420003C1AC0003C1B200036246DE\r
+:105D00000003424E0002A1150003F0460002A5194F\r
+:105D10000003F0040003C18C0003C1910003C1AC77\r
+:105D20000003C1B10002A3190003F0420003C1AC9B\r
+:105D30000003C1B10003624E0003424A0002A137D2\r
+:105D40000003F0460002A5390003F0040003C18CF3\r
+:105D50000003C1930003C1AC0003C1B30002A33927\r
+:105D60000003F0420003C1AC0003C1B30003624A68\r
+:105D7000000362740003FB010002B1100002CCCEEC\r
+:105D80000000E1DB0002A0C10001D6E20003427086\r
+:105D9000000342450003FF000002C8020003A88080\r
+:105DA0000002CA460003AAA00003424C0003424975\r
+:105DB0000003FF000002C9020003A9900002CB46C5\r
+:105DC0000003ABB0000237730003EC000003489CF3\r
+:105DD000000348A10002A0DE0003F042000348B423\r
+:105DE000000348B90003C1180003C15A0003899693\r
+:105DF00000038BB6000261190002655B0002A0DEA1\r
+:105E00000003F0040003689C000368A10003F40091\r
+:105E10000003F042000368B4000368B90003EC001B\r
+:00000001FF\r
diff --git a/firmware/radeon/TURKS_me.bin.ihex b/firmware/radeon/TURKS_me.bin.ihex
new file mode 100644 (file)
index 0000000..0058adc
--- /dev/null
@@ -0,0 +1,345 @@
+:100000007C408000A0000000CC80004D80000000FB\r
+:10001000D440007F1C8C000298C0000B7C41000083\r
+:10002000C80C000E98C00003043C0005CFC1A2A478\r
+:10003000CC000060CC01A1F4CC000047800000009F\r
+:10004000D0400060C80C001098C00003043C00239E\r
+:10005000CFC1A2A4CC000060CC01A1F3CC00004928\r
+:1000600080000000D0400060CC0000468400002DDD\r
+:10007000CC00004BCC412264CC412265CC412266AD\r
+:1000800080000000CC41A2DDCC4000468400002D61\r
+:10009000CC00004B0414226404182265041C226660\r
+:1000A000D8174100D81B4100D81F41008000000034\r
+:1000B000CC41A2DDC03A00040434226B0430225C3F\r
+:1000C0007F7B4007CC350000C83C0004880000005E\r
+:1000D000CFF100007C40C00094C0FFCACC00001FDC\r
+:1000E00080000000CC0000417C40C000C01600042D\r
+:1000F0001CD0FFFF7D150007CC11000018D8003E72\r
+:1001000014DC001FC820000495C000067C4240009B\r
+:10011000CC00004D7E568007CC290000C824000486\r
+:100120007E260006958000067C42C000CC00004D73\r
+:100130007ED70007CC310000C82C00047E2E0007BB\r
+:10014000CC00004D1D10FFFF80000000CE1100000C\r
+:100150007C40C00080000000CC400040CD41225DCA\r
+:10016000CC400045CC00004ACD01225CCC41A1FC32\r
+:100170007C408000A0000000CC80004D800000008A\r
+:10018000CC4122577C418000CC400045CC40004A05\r
+:10019000CC41225CCC41A1FC7C408000A00000004E\r
+:1001A000CC80004DCC00004580000064CC00004AAB\r
+:1001B000C00E0001CC000045CC00004ACC41225CBE\r
+:1001C000CC41A1FCD44DA1FD7C408000A0000000EA\r
+:1001D000CC80004D80000000CC41225DCC00004569\r
+:1001E000CC00004A084C00017C4100007C414000EA\r
+:1001F0001D58FFFF195C03F015600015CD81A102A9\r
+:10020000CDC12256CE01225C94C0000521240020DD\r
+:10021000CE41A1FC8000007B08CC0001CD01A1FCF7\r
+:10022000CC01A1027C408000A0000000CC80004DE9\r
+:100230007C4080007C40C000C02A00027C4100005D\r
+:100240007D2900071C9400011C9800061C9C0300DB\r
+:1002500015DC00087C4200007C4240009540000F05\r
+:10026000C02E000405F022587F2F0007CC3100007B\r
+:10027000C8280004CCC12169CD01216ACE81216B3F\r
+:1002800029B40002CC01216C9740000E29B4000073\r
+:10029000800000BBC834000E29B40002974000095A\r
+:1002A00029B40000C02E000405F022587F2F00075B\r
+:1002B000CC310000C8280004800000BBC834000E08\r
+:1002C000974000047E028000800000BBC834000E0E\r
+:1002D00029B400049740FF4B00000000CE01216DBF\r
+:1002E000CE41216EC8280003C834000E9B40000494\r
+:1002F000C83C000E84000343CC00004D29F40000EC\r
+:10030000974000070430A2B6840000DDCE81A2B77A\r
+:10031000CF81A2C480000000CFC1A2D129F4000186\r
+:10032000974000070430A2BA840000DDCE81A2BB52\r
+:10033000CF81A2C580000000CFC1A2D229F4000263\r
+:10034000974000070430A2BE840000DDCE81A2BF2A\r
+:10035000CF81A2C680000000CFC1A2D30430A2C2C8\r
+:10036000840000DDCE81A2C3CF81A2C7800000003F\r
+:10037000CFC1A2D4C02E00047F2F0007CC310000D3\r
+:10038000C82C0004C03000067EF34023C03000209B\r
+:100390007F6B8020880000007FB3C024CC00004227\r
+:1003A00080000000CC40001F7C40C0007C41000069\r
+:1003B0001914003D994000130414002E8400049D7C\r
+:1003C0000418002984000264C81C00130414002AC5\r
+:1003D0008400049D0418002DCD41A2A4C81C001364\r
+:1003E00095C00000C81C0013CCC12100CD01210123\r
+:1003F000CCC12102CD0121038000049ACD81A2A4A9\r
+:100400001D18100095800005C81C001329E4004049\r
+:100410009640FFFFC81C0013CCC12175CD01217689\r
+:10042000C820001496000000C820001416280001FF\r
+:100430009A800004CC00004F8000049ACC00007F1A\r
+:1004400080000107CCC121757C40C0007C410000C8\r
+:10045000CC000045CC00004A40D40003CD41225CD2\r
+:10046000CD01A1FCC01E00017C42000008CC0001AF\r
+:100470000624000106280002CE1DA1FDCE5DA1FDCF\r
+:1004800098C0FFFACE9DA1FD7C408000A000000036\r
+:10049000CC80004D7C40C0001CD0000114CC000179\r
+:1004A0007C414000950000067C418000CD41216DDB\r
+:1004B000CD81216E80000133C81C0003C0220004DE\r
+:1004C0007E160007CC210000C81C00047C424000BE\r
+:1004D00098C000047C42800080000000CDE5000050\r
+:1004E000CE412169CE81216ACDC1216B80000000FF\r
+:1004F000CC01216C7C40C0007C4100007C4140006C\r
+:100500007C4180007C41C00018A41FE82A68003CA0\r
+:100510009680000A7C0200007C4200003A30000312\r
+:10052000CC0000589B00000342200005042000403E\r
+:100530008000014F7C0240007E0240009A40000093\r
+:100540000A6400011CEC00109AC0000ACC00004DA7\r
+:10055000C02A0004C82C00207E928007CC000041F5\r
+:10056000CC290000CEC0001E8000015FC83000040E\r
+:10057000CD01216DCD41216EC83000037F1F0006E3\r
+:100580001CF40007137800019740002A07B80164A3\r
+:100590009F80000000000000800001747F1B800E1F\r
+:1005A000800001787F1B800F8000017C7F1B800C06\r
+:1005B000800001807F1B800D800001847F1B8011E3\r
+:1005C000800001887F1B80108000018D14A400082A\r
+:1005D0009B80001914A400088000019D1E6400FF88\r
+:1005E0009B80001514A400088000019D1E6400FF7C\r
+:1005F0009B80001114A400088000019D1E6400FF70\r
+:100600009B80000D14A400088000019D1E6400FF63\r
+:100610009B80000914A400088000019D1E6400FF57\r
+:100620009B80000514A400088000019D1E6400FF4B\r
+:1006300014A400081E6400FF2A68003C9A80FE7122\r
+:1006400014EC00087C4340007C4380007C43C000E5\r
+:1006500096C00007CC00004DCF412169CF81216AAF\r
+:10066000CFC1216B80000000CC01216C8000000014\r
+:10067000CFF50000CC0000598400049D2A68003C9E\r
+:100680009A800004C828001780000000D440007F32\r
+:100690009680FFAB7E02400084000296C00E0002EE\r
+:1006A000CC000041800001ABCCC1304A9400000076\r
+:1006B000C83C001C7C40C0007C410000C01E000102\r
+:1006C00015240012C022000296400005C026000436\r
+:1006D000C027FFFB7D250006C02600007DD28006D6\r
+:1006E0007E12C0067D2500077C4140007C418000D1\r
+:1006F000CCC121699A80000CCD01216ACD41216BCA\r
+:1007000096C0FE40CD81216C8400049DCC00007F0A\r
+:10071000C830001A97000000C830001A800000019D\r
+:100720007C4080008400049DCC00007FC81400152C\r
+:10073000C8180016CD41216B96C0FE32CD81216CC8\r
+:10074000800001C2CC00007F7C40C0007C40800063\r
+:1007500014940010115400051C88FFFF1088000538\r
+:100760007C40C00014D000101CCCFFFFC01A000455\r
+:1007700005981BA4CC190000C81800041D980FFF91\r
+:100780007D1900109900FE1F7D8D00109900FE1D3F\r
+:10079000CC000058CC0000598400049DCC81217409\r
+:1007A000C80C001794C0FFFFCC0000598000000166\r
+:1007B0007C408000CC0003E5C82C0020C00E204007\r
+:1007C0000410300020CC226B04143001CC00004116\r
+:1007D000D0110000CCD50000CEC0001EC80C00090E\r
+:1007E00098C00000C80C00097C4100007C4140001A\r
+:1007F000CC0003E7CC0003E8CC0003E9CC40004385\r
+:10080000CC400044D440007F800000007C80C000C9\r
+:100810007C40C00018D001E81128000195000010AC\r
+:1008200006A802099E80000000000000800002214E\r
+:10083000C01208008000022FC81400118000023688\r
+:10084000C81400128000023DCCC1A2A48000024660\r
+:100850001CE8003F8000026E7CC1800B1CD0003F72\r
+:1008600029280006292C00167EAE8007C81C00131C\r
+:100870009A80003D0414002E80000000CCC1A2A488\r
+:10088000C01208007C4140007D0CC007C012000867\r
+:1008900015580003155C000C7C4200007DD1C00699\r
+:1008A000122000147E1E40077E4E8007CE81A2A437\r
+:1008B00080000000CD81A1FEC81400110410211891\r
+:1008C00095400000C8140011D451000080000000C1\r
+:1008D000CCC1A2A4C8140012041021069540000047\r
+:1008E000C8140012D451000080000000CCC1A2A4A2\r
+:1008F000CCC1A2A404100001CD0000198400049D05\r
+:10090000CC00007FC810001B99000000C810001B1D\r
+:10091000800000017C4080002AA000042AA400146A\r
+:100920007E2600070414002E9600000804180029F3\r
+:1009300084000264C81C00130414002A8400049D6F\r
+:10094000040C002DCD41A2A404102100C81C0013EA\r
+:1009500095C00000C81C0013D45100008000049A08\r
+:10096000CCC1A2A48400049D041800298400026460\r
+:10097000C81C00130414002A8400049D0418002DD0\r
+:1009800084000264C81C0013800000017C408000C9\r
+:1009900095C00000C81C0013CD41A2A4CC012100C9\r
+:1009A000CC012101CD812102CD812103CD81A2A4E1\r
+:1009B00088000000CC00004D1D9800017C41000023\r
+:1009C0007C414000998000097C420000C83C003214\r
+:1009D00011980010C81C000B3BFC000197C0FFFFE2\r
+:1009E000C83C003280000280C83C003311980010DF\r
+:1009F000C81C000A3BFC000197C0FFFFC83C003345\r
+:100A00001568001D7D5940079A80000411E4000A12\r
+:100A10007E260007CDC00066CD012158CD41215969\r
+:100A2000CE01215ACCC1A2A49A8002100510000464\r
+:100A3000042C000112F0001D7D71400712E000102F\r
+:100A40002220000CCD012158CD412159CE01215A3F\r
+:100A50008000049ACCC1A2A4043C0005CFC1A2A48A\r
+:100A6000C036000288000000CF4120107C40C0004A\r
+:100A700014D0001D9900000814D4001C9540FD619D\r
+:100A8000C026000422642154CC2500008000000010\r
+:100A9000C82800048000049ACD4000618400049DB1\r
+:100AA0001C7400011C7800029B400003C80C002944\r
+:100AB00084000342C814002B9B8000030410001024\r
+:100AC00084000352CCC1A250CD01A0508400030F7A\r
+:100AD000041804008400049DCC000063C83C002D71\r
+:100AE0008400031DC8100029C81C002F1DDC000154\r
+:100AF000C824002795C00009C8340031C838003028\r
+:100B0000C83C002D537400207FB7802747B805509C\r
+:100B1000CC000062CFFA00009A400000C8240027F1\r
+:100B2000C82800233AA800029A80FFFFC8280023A3\r
+:100B3000C0300001C82800249A800000C828002482\r
+:100B4000CF00005B50D8000814DC0018C03E100035\r
+:100B500021DC80007DFDC007CD812180CDC12181B8\r
+:100B6000C01E002051200008152400187E7E40077A\r
+:100B70001330001E7E7240077D5D4007CE0121824A\r
+:100B8000CE412183CD4121847C408000A000000023\r
+:100B9000CC80004D8400049D1C7400011C78000270\r
+:100BA0009B400003C80C002A84000342C814002C98\r
+:100BB0009B8000030410001084000352CCC1A2608B\r
+:100BC000CD01A0608400030F041809808400049DF7\r
+:100BD000CC000064C83C002E8400031DC810002A0D\r
+:100BE000C81C002F1DDC0001C824002895C0000986\r
+:100BF000C8340031C8380030C83C002E537400207F\r
+:100C00007FB7802747B80554CC000062CFFA0000B8\r
+:100C10009A400000C8240028C82800233AA80002EF\r
+:100C20009A80FFFFC8280023C82800259A8000006A\r
+:100C3000C8280025800002D0C03000020598C000FE\r
+:100C400010DC000814E00018CDD90000C81C0022F8\r
+:100C5000C82400221DDC0FFFCDD900017E624007B1\r
+:100C6000CE590002D8185103D8185104880000004A\r
+:100C7000D81851071BF800F0C03608009780000311\r
+:100C8000C030008088000000C02A0004CF41217CD1\r
+:100C9000CF01217DCD01217E22A8217F04240008DF\r
+:100CA0009A4000000A640001CC290000C82000041A\r
+:100CB0001638001F9B80FFFB0424000888000000FA\r
+:100CC00000000000C82400247C4100009A4000007D\r
+:100CD000C8240024800000017C408000C824002536\r
+:100CE0007C4100009A400000C824002580000001DB\r
+:100CF0007C408000840003427C40C0007C40800037\r
+:100D0000A0000000CC80004DC83C000E97C000033E\r
+:100D1000D30003E688000000043C0005CFC1A2A474\r
+:100D2000CC01A1F48400049DCC00004788000000A1\r
+:100D3000CC00007F840003527C40C0007C408000D7\r
+:100D4000A0000000CC80004D043C0022CFC1A2A432\r
+:100D50008400049DCC00004888000000CC00007F87\r
+:100D60008400035D7C40C0007C408000A000000047\r
+:100D7000CC80004D043C0023CFC1A2A4CC01A1F340\r
+:100D80008400049DCC00004988000000CC00007F56\r
+:100D9000800000007C40C000800000007C40C0005B\r
+:100DA000C01200017C51400780000000D4550000B3\r
+:100DB000CC400065C838002DC83C002EC035E0008E\r
+:100DC000C03200047FB780067FF7C00623B810004A\r
+:100DD00023FC1000CF812154CFC12155CC312155A6\r
+:100DE000C82C0004C81C0025C82400247DE5C007C9\r
+:100DF00099C0FFFEC81C0025800000017C408000D7\r
+:100E00007C40C0007C41000019280030968000081A\r
+:100E1000C8280027C82400289A400000C8240027BA\r
+:100E20009A400000C8240028CC0003E07C41400028\r
+:100E30007C418000151C001FCCC000C7CD0000C83D\r
+:100E400095C00003C01C8000CDC12010E1830000CC\r
+:100E5000055C2000CC00004D80000000DC1F41003C\r
+:100E60007C40C0007C4100007C4140007C4180000F\r
+:100E7000CCC000C9CD0000CAE1830000055CA00021\r
+:100E800080000000DC1F41007C40C0007C4100006D\r
+:100E90007C4140007C418000CCC000CBCD0000CC28\r
+:100EA000E1830000055CE94080000000DC1F410098\r
+:100EB0007C40C0007C4100007C4140007C418000BF\r
+:100EC000CCC000CDCD0000CEE1830000055CE88001\r
+:100ED00080000000DC1F41007C40C0007C4100001D\r
+:100EE0007C4140007C418000CCC000CFCD0000D0D0\r
+:100EF000E1830000055CC00080000000DC1F4100B1\r
+:100F00007C40C0007C4100007C4140007C4180006E\r
+:100F1000CCC000D1CD0000D2E1830000055CF00020\r
+:100F200080000000DC1F41007C40C0007C410000CC\r
+:100F30007C4140007C418000CCC000D3CD0000D477\r
+:100F4000E1830000055CF3FC80000000DC1F410031\r
+:100F5000D44320007C408000A0000000CC80004DE5\r
+:100F6000D443A0007C408000A0000000CC80004D55\r
+:100F7000D443E9407C408000A0000000CC80004DBC\r
+:100F8000D443E8807C408000A0000000CC80004D6D\r
+:100F9000D443C0007C408000A0000000CC80004D05\r
+:100FA000D443F0007C408000A0000000CC80004DC5\r
+:100FB000D443F3FC7C408000A0000000CC80004DB6\r
+:100FC000041CA000CC43A0007C40C000D81FC1007E\r
+:100FD0007C408000A0000000CC80004D041CC000BC\r
+:100FE000CC43C0007C40C000D81FC1007C408000C2\r
+:100FF000A0000000CC80004D7C40C0007C4100007F\r
+:1010000094C000037C4140007C418000CC03F3FC91\r
+:10101000CC43F3FCCC43F3FC7C408000A0000000F8\r
+:10102000CC80004DC01E0010C80C002950D0000814\r
+:1010300010540002800004157D158020C01E002081\r
+:10104000C80C002A50D000080854040011540002B3\r
+:101050007D518020CDC00062D45A00007C408000C9\r
+:10106000A0000000CC80004D7C40C0001CD00003DC\r
+:10107000112800019500000A06A8041F9E800000A8\r
+:101080007C4180008000042D7C41C000800004333E\r
+:101090007C41C000800004397C41C0007C4180005C\r
+:1010A0007C41C00014D400100554A0008000000052\r
+:1010B000CD950000C02200040598A0007DA1800706\r
+:1010C000CC19000080000429C8180004C0220004C4\r
+:1010D000CD8125D6222025D7CC21000080000429EF\r
+:1010E000C8180004CD81216DCDC1216E8000042976\r
+:1010F000C81800037C40C00080000000CC4C03E016\r
+:101100001C8CFFFFD44D00007C408000A00000003C\r
+:10111000CC80004DC8140023315800049580FFFF97\r
+:10112000C8140023CC00005BCC412180204C8000FF\r
+:10113000CCC1218114D0001FCC412182CC4121831C\r
+:101140009500FBB0CC412184C81400239940FFFFD7\r
+:10115000C8140023800000017C408000C0160004F9\r
+:1011600021542140CC550000C81800048000000024\r
+:10117000CC0003E07C40C00018D00038C0160080CE\r
+:1011800095000003C02A00047CD4C007CCC1217C98\r
+:10119000CC41217DCC41217E7C41800014FC001F8C\r
+:1011A0001D98FFFF39B0000322A0217F9B000003A0\r
+:1011B000419C0005041C004099C0000009DC0001AE\r
+:1011C000CC210000C8240004166C001F419C0005BF\r
+:1011D0009AC0FFFACC80004D9BC0FB8A0000000043\r
+:1011E00080000000CC0003E07C40C0007C41000097\r
+:1011F0001518001F511400209980000B191C003194\r
+:10120000CD0000627D4D4027D456000095C0FB7D87\r
+:10121000C82000269A000000C82000268000000197\r
+:101220007C408000E03A0000C0260004CCC1216967\r
+:101230007D250007CD01216A0BB80002CC41216B4E\r
+:101240009B80FFFECC41216C99C0FD30CC00007F1B\r
+:10125000800000017C408000C00E0100CC000041F5\r
+:10126000CCC1304AC83C007FCC00007F8000000029\r
+:10127000CC00007FCC00007F88000000CC00007F05\r
+:10128000000000000000000000000000000000005E\r
+:10129000000000000000000000000000000000004E\r
+:1012A000000000000000000000000000000000003E\r
+:1012B000000000000000000000000000000000002E\r
+:1012C000000000000000000000000000000000001E\r
+:1012D000000000000000000000000000000000000E\r
+:1012E00000000000000000000000000000000000FE\r
+:1012F00000000000000000000000000000000000EE\r
+:1013000000000000000000000000000000000000DD\r
+:1013100000000000000000000000000000000000CD\r
+:1013200000000000000000000000000000000000BD\r
+:1013300000000000000000000000000000000000AD\r
+:10134000000000000000000000000000000000009D\r
+:10135000000000000000000000000000000000008D\r
+:10136000000000000000000000000000000000007D\r
+:10137000000000000000000000000000000000006D\r
+:10138000000000000000000000000000000000005D\r
+:10139000000000000000000000000000000000004D\r
+:1013A000000000000000000000000000000000003D\r
+:1013B000000000000000000000000000000000002D\r
+:1013C000000000000000000000000000000000001D\r
+:1013D000000000000000000000000000000000000D\r
+:1013E00000000000000000000000000000000000FD\r
+:1013F00000000000000000000000000000000000ED\r
+:101400000001044000100003001200050015001A3E\r
+:1014100000160022001700350021003A0024005772\r
+:1014200000250057002700610028005400290062B1\r
+:10143000002A005F002B0062002D0069002E006C66\r
+:10144000002F007500300077003200E80034008C77\r
+:1014500000350062003900EA003A0112003B012524\r
+:10146000003C013D003D01AD003E01D2003F00E7E0\r
+:1014700000410445004204570043045D004401ED6F\r
+:101480000045013D004602040047020400480204F2\r
+:10149000004A029B004B0364004C02A7004D02E58A\r
+:1014A000004E0331004F0337005103580052033DF3\r
+:1014B0000053034D00540366005703680060038027\r
+:1014C000006103980062036C006303A2006403AC34\r
+:1014D000006503B6006603C0006703CA006803D452\r
+:1014E000006903D8006A0409006B03DC006C03E0A8\r
+:1014F000006D03E4006E03E8006F03EC007003E48A\r
+:101500000071040F007203FE007303F0007403F710\r
+:101510000075041A007D043D007A047A000F0496D9\r
+:10152000000F0496000F0496000F0496000F049617\r
+:10153000000F0496000F0496000F0496000F049607\r
+:10154000000F0496000F0496000F0496000F0496F7\r
+:10155000000F0496000F0496000F0496000F0496E7\r
+:10156000000F0496000F0496000F0496000F0496D7\r
+:10157000000F0496000F0496000F0496000F0496C7\r
+:00000001FF\r
diff --git a/firmware/radeon/TURKS_pfp.bin.ihex b/firmware/radeon/TURKS_pfp.bin.ihex
new file mode 100644 (file)
index 0000000..ca31700
--- /dev/null
@@ -0,0 +1,281 @@
+:100000007C408000A0000000042800018000000067\r
+:10001000E0030000CC800040D44000407C408000E1\r
+:10002000A000000004280001104C000198C0000549\r
+:100030001C900002CC4000298000035FCC40002AC5\r
+:100040009900000500000000CC40002B8000035FF9\r
+:10005000CC40002CCC40002D8000035FCC40002E13\r
+:100060001C8C0002CC80004098C00004CC400040B2\r
+:100070008000035FCC0000528000035FCC0000547E\r
+:1000800080000000CC4003FDC810002EC80C002DDD\r
+:10009000511000207CD0C0277CC5002055140020C2\r
+:1000A000CD000043CD400043D0C00043CC80004091\r
+:1000B000CC000040CC4000407C408000A00000000C\r
+:1000C00004280001C810002CC80C002B511000207F\r
+:1000D0007CD0C0277CC5002055140020CD000042F4\r
+:1000E000CD400042D10000427C40C000C81800034F\r
+:1000F000C81C0003C82000039580FFC2C824000369\r
+:1001000095C0FFC0C828001D9A800004CC0000558F\r
+:10011000D80003C0CC000040C8280016C02E000440\r
+:10012000C830000D1AA800277EF2C007CEC00040DC\r
+:10013000CC000040CD800040CDC00040CE0000404B\r
+:1001400096800003CE400040D080005CCC80004010\r
+:10015000CC000040CCC000407C408000A0000000EB\r
+:1001600004280001C810002CC80C002B51100020DE\r
+:100170007CD0C0277CC5002055140020CD00004253\r
+:10018000CD400042D14000427C40C000C81800036E\r
+:10019000C81C0003C8200003C82400039580FF99F1\r
+:1001A000C828000395C0FF97C82C03FD7E2F0011BF\r
+:1001B000970000037EE2C0017C02C006CEC3A29E6F\r
+:1001C000CC00006CCD00006DCD40006DC830001D2E\r
+:1001D0009B000004CC000055D80003C0CC000040B8\r
+:1001E000C82C0016C0320005C834000D1AEC0027D8\r
+:1001F0007F370007CF000040D0400040CD80004056\r
+:10020000CDC00040CE000040CE40004096C000036C\r
+:10021000CE800040D080005CCC800040CC0000400C\r
+:10022000CCC000407C408000A000000004280001F9\r
+:10023000C81800151D9800017C424000958002CE30\r
+:100240007C428000C81C0020C037C0007C40C00039\r
+:100250007C4100007CB48006C03600031AB801E877\r
+:1002600097800007D04003E084000362CC00007F49\r
+:10027000C83803E09B800000C83803E099C0000044\r
+:10028000C81C00207CB4800710D400027D654000AB\r
+:10029000CD400043CE800043CD000043CC800040E1\r
+:1002A000CE400040CE800040CCC00040E03A00008C\r
+:1002B0009780FF54CD0000407C40C000800000A229\r
+:1002C0007C4100001C8C000298C00009C810001C72\r
+:1002D00099000004C81C000684000365CC0000528D\r
+:1002E000C81800158000008E1D980002C810001E5E\r
+:1002F0009900FFFCC81C000884000365CC00005472\r
+:10030000C81800158000008E1D9800021C8C000289\r
+:10031000C810001D98C0000EC814004999000004C0\r
+:10032000C81C000784000365CC000053C8180015E2\r
+:1003300094C00003189401E8055400062010000141\r
+:100340007D1500038000008E7D9180069940FFF8A6\r
+:10035000C81C0007CDC00040CC000040800000CB8E\r
+:10036000CC00006EC00E8080CC00006704D080807E\r
+:10037000CC000068CD0003F1CD0003F2CD0003F303\r
+:10038000CD0003F4CD0003F6CD0003F7CD0003F854\r
+:1003900080000005CD0003F9CC800040D44000402F\r
+:1003A0007C408000A000000004280001800000EED6\r
+:1003B000D8000440D8000340CC000040CC8000406E\r
+:1003C000D44000407C408000A000000004280001D0\r
+:1003D000D80003C0800000FBCC000040800000FA81\r
+:1003E000D8000440D8000340CC000040C80C0029CD\r
+:1003F000C810002ACC800040CC40004051100020A2\r
+:100400007CD0C027105000027D0D00205514002024\r
+:10041000CD000043CD400043D0400043CC0000401D\r
+:100420007C408000A000000004280001D80003C028\r
+:10043000CC000040CC800040D44000407C40800094\r
+:10044000A0000000042800011C8C0002C810001D40\r
+:1004500098C00011C814004999000004C81C000786\r
+:1004600084000365CC000053C80C002FCC800040F2\r
+:10047000CC400040CC400040CC4000407CC4C00098\r
+:10048000CCC00040D44000407C408000A000000070\r
+:10049000042800019940FFF5C81C0007CDC00040AA\r
+:1004A000CC0000408000011ACC00006E7C40C000EF\r
+:1004B000C81000479900000BC8140044994000047C\r
+:1004C000C8180009CD800040CC00004080000144E5\r
+:1004D000CC8000407C40C000C81000479500FFF76A\r
+:1004E000C814004599400004C818000ACD80004097\r
+:1004F000CC00004080000144D80008407C40C0008F\r
+:10050000C81000479900FFFC00000000CC800040AC\r
+:10051000CCC00040D44000407C408000A0000000DF\r
+:1005200004280001C8100046D8000740CD00004054\r
+:100530008400015BCD000040C80C004394C0000A59\r
+:10054000C81400488000015404100003C81000467D\r
+:10055000D80007C0CD0000408400015BCD00004002\r
+:10056000C81400489D400000CC00006AC82800164E\r
+:100570001EA800019A800003C02900018800000025\r
+:10058000C02C0156CE80005CD80008C0CEC0004010\r
+:1005900088000000CC0000401C8C0002C810001E27\r
+:1005A00094C00008C814001C9900000AC81C000868\r
+:1005B00084000365CC00005480000175CC800040AD\r
+:1005C00099400004C81C000684000365CC0000525A\r
+:1005D000CC80004080000000D4400040CC40002788\r
+:1005E000CC4000288000035FCC00006BC0320003C9\r
+:1005F000C037FFFF800001807CB080077C43400053\r
+:10060000C8200028C81C0027C8180026CF43A29E77\r
+:100610007C414000522000207DE1C0277D58C0036E\r
+:100620007CDCC02054D0002080000195CC800040AC\r
+:100630007C418000CC80004080000192CD80004051\r
+:10064000C019FFFFCC800040CD83A29E7C40C0003B\r
+:100650007C4100007C414000CCC3A1FACD03A1F94C\r
+:10066000CD43A29DCCC00040CD000040CD40004015\r
+:10067000CC4000407C408000A00000000428000125\r
+:100680007C40C0001CD00001CCC3A29F9500000399\r
+:10069000D0400026D0800026CC80004080000000A2\r
+:1006A000CCC000407C40C000CC800040CCC3A2A2A3\r
+:1006B00080000000CCC000407C40C00014D4001F6B\r
+:1006C000CC800040954000037C410000CCC0005924\r
+:1006D0001518001FCCC0004095800003CD000040DD\r
+:1006E000CD00005A8000035FCC00007FC820001FAF\r
+:1006F0007C410000D8200244CE2000447C414000D0\r
+:100700007C418000CDA00049CD200041CD6000415A\r
+:10071000CDA0004115100008115400187D53C007EA\r
+:10072000CFC0002F06200001CE0000588000035FDC\r
+:10073000CC00007FC820001FCA0C001794C0000521\r
+:100740007C410000D82002C6800001BFCE200046B8\r
+:10075000CC000048800001D500000000C820001F28\r
+:100760007C4180000A200001CA14001ACA18001730\r
+:100770007D59800795800005CE000058CCA000462A\r
+:1007800080000000CD600046CCA000448000000046\r
+:10079000CD6000448000035FCC40006AC80C03FABF\r
+:1007A00098C0000BD04003FAC8180042C81C004390\r
+:1007B000C810001DC814001C111000019980FF5BB7\r
+:1007C0007D15000799C0FF6300000000D00003FA08\r
+:1007D000800000007C40C000CC8000408000000011\r
+:1007E000D44000407C40C0007C4100007C4380003D\r
+:1007F0007C43C000041C0002CF800042CFC00042F6\r
+:10080000CDC00042041C0008CCC00042CD00004214\r
+:10081000CDC00042041C0001042000017C02400005\r
+:10082000C8140003C8180003519800207D594027C0\r
+:10083000C8280003C82C0003C8300003C8340003D4\r
+:1008400052EC00207EAE8027537400207F370027B3\r
+:100850007F2B40217E76402056A8003F5730003F36\r
+:100860007EB280067E2A000699C0FFF209DC0001F4\r
+:100870009680FFE153F400207F7B40277D65402078\r
+:1008800055580020CC00005BCD760000CDB60000AE\r
+:10089000C82000419A000000C820004180000001EB\r
+:1008A0007C4080007C40C0007C410000CCC003FE46\r
+:1008B000CD0003FFCCC00042CD0000421514001F44\r
+:1008C000191800F0275C00017D760006998000056C\r
+:1008D0007D5E4006CC0000428000035FCC00004DEE\r
+:1008E00015980001152C0008998000311EEC0001BC\r
+:1008F000960000041530000C8000035FCC0000421D\r
+:1009000004140008CD4000421F30000120280001DF\r
+:1009100004380008043C0001C8140003C818000390\r
+:10092000C81C0003C82000037D5D400D7DA1C00DE3\r
+:100930007D5D40071610001F159C001F7D1D0006E1\r
+:100940007D1740067E9280069B4000120BB8000483\r
+:100950009BC0FFF20BFC0001C80C03FE9A8000094B\r
+:10096000C81003FF9B000106CC00004D04140008D2\r
+:10097000CCC00042CD00004280000243CD40004286\r
+:1009800096C000FFCC00004D8000035FCC00004EFD\r
+:100990009AC00003CC00004DCC00004E9780FD991A\r
+:1009A000E383000080000000DC0301FF96400004A8\r
+:1009B000CC00004E8000035FCC000042D200004219\r
+:1009C000C8080003C80C0003C8100003C8140003C3\r
+:1009D000C8180003C81C0003C8240003C82800036B\r
+:1009E00015FC001F16B0001F7FF3C00614F0001F97\r
+:1009F0007FF3C0061570001F7FF3C0067D8880015D\r
+:100A000097C0000D7DCCC0017E5100017E95400154\r
+:100A10007C90800C7CD4C00C9AC000037C8F400674\r
+:100A200024B400019B4000D6CC00004D8000035F41\r
+:100A3000CC00004EC80C03FEC81003FFCCC000421F\r
+:100A40008000026FCD0000427C40C0007C4100006D\r
+:100A50007C42C0007C430000C03B001F7C43400040\r
+:100A60007FB78006C03E10009780FD667D3D000781\r
+:100A70007F3F00071914003BCC00005B954000133A\r
+:100A8000C8140040315800029580FFFFC814004090\r
+:100A9000CC000063211C8000CCC12185CDC1218602\r
+:100AA0001514001FCEC12187CF0121889540FD5527\r
+:100AB000CF412189C81400409940FFFFC81400406D\r
+:100AC000800000017C408000CC800040CCC0004011\r
+:100AD000CD000040CEC00040CF00004080000000AC\r
+:100AE000CF400040D08003E0CC800040840003620F\r
+:100AF000CC400040C80C03E098C00000C80C03E0E4\r
+:100B00007C408000A00000007E8280067C40C00007\r
+:100B1000840002CC14D0001F9900FD3AD04003E0BD\r
+:100B200084000362CC00007F800002BEC80C03E09A\r
+:100B3000CC800040CCC0004088000000D440004081\r
+:100B4000CC800040CC400040CC400040CC40004035\r
+:100B50007C40C000CCC00021CCC00040D44000404C\r
+:100B6000C037FFFFD00003FBD00003FCD00003FA26\r
+:100B700080000000CF4003FD7C40C00014DC001D5D\r
+:100B800099C00007CC80004018DC003C99C0007C74\r
+:100B9000CCC000408000035FCC00006A18D8003C45\r
+:100BA000CD800066CC00006A8000035FCCC00040AE\r
+:100BB0007C40C0005050002084000362CC00005DE7\r
+:100BC0007CD0C027C820001FC8D60000994000086C\r
+:100BD0007C438000E3830000CFA0004F84000362C9\r
+:100BE000CC00005E80000000D440007F8000035FE6\r
+:100BF000CC00005E84000362CC00005DC820001FB2\r
+:100C00007C40C000C036FF00C8100021C0303FFF4C\r
+:100C10007CF540067D5180067D81800A9980000820\r
+:100C20007CF38006E3830000CFA0004F84000362C2\r
+:100C3000CC00005E80000000D440007F8000035F95\r
+:100C4000CC00005E840003627C40C00014DC00081D\r
+:100C500095C000191CDC00107C41000099C0000404\r
+:100C6000505400208000031DC91D00007D15002781\r
+:100C7000C91E00007C4200007C4240007C41800094\r
+:100C80007DE5C0067DE280119A80FCDE41AC000566\r
+:100C90009AC000000AEC00011CDC001099C000049E\r
+:100CA0000000000080000320C91D00008000032018\r
+:100CB000C91E0000CC800040CCC000408000000075\r
+:100CC000D4400040D8000340CC000040CC8000401D\r
+:100CD000D44000407C408000A000000004280001B7\r
+:100CE000D80003C0CC000040CC800040D44000407D\r
+:100CF0007C408000A0000000042800017C40C0006F\r
+:100D00001CD000062910000699000006C814001C1B\r
+:100D100099400004CC00005284000365C81C000602\r
+:100D2000CC800040CCC0004080000000D440004097\r
+:100D30007C40C0007C4100001518001FCD00005B06\r
+:100D4000998000045114002080000000D44D000060\r
+:100D50007D4D4027191C0031D456000095C0FCA9D8\r
+:100D6000C82000419A000000C82000418000000116\r
+:100D70007C40800080000000D440007FCC00007FD9\r
+:100D800080000000CC00007FCC00007F88000000C5\r
+:100D9000CC00007FCDC0004088000000CC000040A7\r
+:100DA0000000000000000000000000000000000043\r
+:100DB0000000000000000000000000000000000033\r
+:100DC0000000000000000000000000000000000023\r
+:100DD0000000000000000000000000000000000013\r
+:100DE0000000000000000000000000000000000003\r
+:100DF00000000000000000000000000000000000F3\r
+:100E000000000000000000000000000000000000E2\r
+:100E100000000000000000000000000000000000D2\r
+:100E200000000000000000000000000000000000C2\r
+:100E300000000000000000000000000000000000B2\r
+:100E400000000000000000000000000000000000A2\r
+:100E50000000000000000000000000000000000092\r
+:100E60000000000000000000000000000000000082\r
+:100E70000000000000000000000000000000000072\r
+:100E80000000000000000000000000000000000062\r
+:100E90000000000000000000000000000000000052\r
+:100EA0000000000000000000000000000000000042\r
+:100EB0000000000000000000000000000000000032\r
+:100EC0000000000000000000000000000000000022\r
+:100ED0000000000000000000000000000000000012\r
+:100EE0000000000000000000000000000000000002\r
+:100EF00000000000000000000000000000000000F2\r
+:100F000000000000000000000000000000000000E1\r
+:100F100000000000000000000000000000000000D1\r
+:100F200000000000000000000000000000000000C1\r
+:100F300000000000000000000000000000000000B1\r
+:100F400000000000000000000000000000000000A1\r
+:100F50000000000000000000000000000000000091\r
+:100F60000000000000000000000000000000000081\r
+:100F70000000000000000000000000000000000071\r
+:100F80000000000000000000000000000000000061\r
+:100F90000000000000000000000000000000000051\r
+:100FA0000000000000000000000000000000000041\r
+:100FB0000000000000000000000000000000000031\r
+:100FC0000000000000000000000000000000000021\r
+:100FD0000000000000000000000000000000000011\r
+:100FE0000000000000000000000000000000000001\r
+:100FF00000000000000000000000000000000000F1\r
+:10100000000200030003033100040338000501BBA4\r
+:10101000000600ED000700F90008010B000900F4CC\r
+:10102000000A00EB000B00F7000C012B000D01354E\r
+:10103000000E0149000F01530010035D0011000A6A\r
+:1010400000120018001300200016002200240031B6\r
+:101050000025005900260177001701D7001801E587\r
+:10106000001A01E7002202EC002302FD0027018C98\r
+:10107000001F01F900200229002801AE0029017B90\r
+:10108000002A01A0002B0190002F01A9003201CD00\r
+:101090000034033F0035017F003901F6003C0311A5\r
+:1010A000003F01BB00410292004202B9004302C36B\r
+:1010B000004402D0004A02DE005503330056033AD2\r
+:1010C0000060008C006100B1006200D9006300C3C1\r
+:1010D000006400C3006500C3006600C3006700C36E\r
+:1010E000006800E6006900EF006A013F006B010D37\r
+:1010F000006C010D006D010D006E010D006F010D02\r
+:1011000000700112007300FB007400FB00750166A3\r
+:10111000007B034C000000050000000500000005F6\r
+:1011200000000005000000050000000500000005AB\r
+:10113000000000050000000500000005000000059B\r
+:10114000000000050000000500000005000000058B\r
+:10115000000000050000000500000005000000057B\r
+:10116000000000050000000500000005000000056B\r
+:10117000000000050000000500000005000000055B\r
+:00000001FF\r
index d038968..6ae85f6 100644 (file)
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -56,6 +56,8 @@
 #include <linux/oom.h>
 #include <linux/compat.h>
 
+#include <trace/events/fs.h>
+
 #include <asm/uaccess.h>
 #include <asm/mmu_context.h>
 #include <asm/tlb.h>
@@ -785,6 +787,8 @@ struct file *open_exec(const char *name)
 
        fsnotify_open(file);
 
+       trace_open_exec(name);
+
        err = deny_write_access(file);
        if (err)
                goto exit;
@@ -2029,7 +2033,7 @@ static void wait_for_dump_helpers(struct file *file)
        pipe->readers++;
        pipe->writers--;
 
-       while ((pipe->readers > 1) && (!signal_pending(current))) {
+       while ((pipe->readers > 1) && (!fatal_signal_pending(current))) {
                wake_up_interruptible_sync(&pipe->wait);
                kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
                pipe_wait(pipe);
index 5720854..18387ac 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -33,6 +33,9 @@
 
 #include "internal.h"
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/fs.h>
+
 int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
        struct file *filp)
 {
@@ -987,6 +990,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
                        } else {
                                fsnotify_open(f);
                                fd_install(fd, f);
+                               trace_do_sys_open(tmp, flags, mode);
                        }
                }
                putname(tmp);
index c1c7293..4d7e8c8 100644 (file)
@@ -16,6 +16,7 @@ proc-y        += devices.o
 proc-y += interrupts.o
 proc-y += loadavg.o
 proc-y += meminfo.o
+proc-y += breakme.o
 proc-y += stat.o
 proc-y += uptime.o
 proc-y += version.o
diff --git a/fs/proc/breakme.c b/fs/proc/breakme.c
new file mode 100644 (file)
index 0000000..8194361
--- /dev/null
@@ -0,0 +1,73 @@
+#include <linux/cpumask.h>
+#include <linux/fs.h>
+#include <linux/gfp.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/kernel_stat.h>
+#include <linux/proc_fs.h>
+#include <linux/sched.h>
+#include <linux/seq_file.h>
+#include <linux/slab.h>
+#include <linux/time.h>
+#include <linux/irqnr.h>
+#include <asm/cputime.h>
+#include <asm/uaccess.h>
+
+#define MAX_BREAKME_WRITE 64
+static ssize_t write_breakme(struct file *file, const char __user *buf,
+                                  size_t count, loff_t *ppos)
+{
+       char kbuf[MAX_BREAKME_WRITE + 1];
+       DEFINE_SPINLOCK(lock_me_up);
+
+       if (count) {
+               if (count > MAX_BREAKME_WRITE)
+                       return -EINVAL;
+               if (copy_from_user(&kbuf, buf, count))
+                       return -EFAULT;
+               kbuf[min(count, sizeof(kbuf))-1] = '\0';
+
+               /* Null pointer dereference */
+               if (!strcmp(kbuf, "nullptr"))
+                       *(unsigned long *)0 = 0;
+               /* BUG() */
+               else if (!strcmp(kbuf, "bug"))
+                       BUG();
+               /* hung_task stuck in unkillable D state */
+               else if (!strcmp(kbuf, "hungtask"))
+                       schedule_timeout_uninterruptible(MAX_SCHEDULE_TIMEOUT);
+               /* Panic */
+               else if (!strcmp(kbuf, "panic"))
+                       panic("Testing panic");
+               /* Set up a deadlock (call this twice) */
+               else if (!strcmp(kbuf, "deadlock"))
+                       spin_lock(&lock_me_up);
+               /* lockup */
+               else if (!strcmp(kbuf, "softlockup")) {
+                       while (1)
+                               ;
+               }
+               /* lockup with interrupts enabled */
+               else if (!strcmp(kbuf, "irqlockup")) {
+                       spin_lock(&lock_me_up);
+                       while (1)
+                               ;
+               }
+               /* lockup with interrupts disabled */
+               else if (!strcmp(kbuf, "nmiwatchdog")) {
+                       spin_lock_irq(&lock_me_up);
+                       while (1)
+                               ;
+               }
+       }
+       return count;
+}
+
+static struct file_operations proc_breakme_operations = {
+       .write          = write_breakme,
+};
+
+void __init proc_breakme_init(void)
+{
+       proc_create("breakme", S_IWUSR, NULL, &proc_breakme_operations);
+}
index eed44bf..a8c15c2 100644 (file)
@@ -172,6 +172,7 @@ void __init proc_root_init(void)
 
        proc_symlink("mounts", NULL, "self/mounts");
 
+       proc_breakme_init();
        proc_net_init();
 
 #ifdef CONFIG_SYSVIPC
index 4a08a66..48b1532 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef DRM_FIXED_H
 #define DRM_FIXED_H
 
+#include <asm/div64.h>
+
 typedef union dfixed {
        u32 full;
 } fixed20_12;
@@ -37,6 +39,7 @@ typedef union dfixed {
 #define dfixed_init(A) { .full = dfixed_const((A)) }
 #define dfixed_init_half(A) { .full = dfixed_const_half((A)) }
 #define dfixed_trunc(A) ((A).full >> 12)
+#define dfixed_frac(A) ((A).full & ((1 << 12) - 1))
 
 static inline u32 dfixed_floor(fixed20_12 A)
 {
diff --git a/include/linux/chromeos_platform.h b/include/linux/chromeos_platform.h
new file mode 100644 (file)
index 0000000..3d22906
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _LINUX_CHROMEOS_PLATFORM_H
+#define _LINUX_CHROMEOS_PLATFORM_H
+
+#include <linux/errno.h>
+#include <linux/types.h>
+
+extern int chromeos_platform_read_nvram(u8 *nvram_buffer, int buf_size);
+extern int chromeos_platform_write_nvram(u8 *nvram_buffer, int buf_size);
+
+#ifdef CONFIG_CHROMEOS
+/*
+ * ChromeOS platform support code. Glue layer between higher level functions
+ * and per-platform firmware interfaces.
+ */
+
+/*
+ * Set the taint bit telling firmware that the currently running side needs
+ * recovery (or reinstall).
+ */
+extern int chromeos_set_need_recovery(void);
+
+#else
+
+static inline int chromeos_set_need_recovery(void)
+{
+       return -ENODEV;
+}
+#endif /* CONFIG_CHROMEOS */
+
+#endif /* _LINUX_CHROMEOS_PLATFORM_H */
index 645231c..fbabfba 100644 (file)
@@ -450,6 +450,9 @@ int tracing_is_on(void);
 extern void tracing_start(void);
 extern void tracing_stop(void);
 extern void ftrace_off_permanent(void);
+struct timespec;
+extern void trace_clock_gettime(struct timespec *);
+extern void trace_clock_getres(struct timespec *);
 
 static inline __printf(1, 2)
 void ____trace_printk_check_format(const char *fmt, ...)
@@ -530,6 +533,15 @@ int trace_printk(const char *fmt, ...);
 static inline void tracing_start(void) { }
 static inline void tracing_stop(void) { }
 static inline void ftrace_off_permanent(void) { }
+struct timespec;
+static inline void trace_clock_gettime(struct timespec *tp)
+{
+       getrawmonotonic(tp);
+}
+static inline void trace_clock_getres(struct timespec *tp)
+{
+       *tp = ktime_to_timespec(KTIME_LOW_RES);
+}
 static inline void trace_dump_stack(void) { }
 
 static inline void tracing_on(void) { }
diff --git a/include/linux/low-mem-notify.h b/include/linux/low-mem-notify.h
new file mode 100644 (file)
index 0000000..b8a0aad
--- /dev/null
@@ -0,0 +1,63 @@
+#ifndef _LINUX_LOW_MEM_NOTIFY_H
+#define _LINUX_LOW_MEM_NOTIFY_H
+
+#include <linux/stddef.h>
+#include <linux/mm.h>
+
+extern unsigned low_mem_margin_percent;
+extern unsigned long low_mem_minfree;
+void low_mem_notify(void);
+extern const struct file_operations low_mem_notify_fops;
+extern bool low_mem_margin_enabled;
+extern unsigned long low_mem_lowest_seen_anon_mem;
+extern const unsigned long low_mem_anon_mem_delta;
+
+/*
+ * Return TRUE if we are in a low memory state.
+ */
+static inline bool _is_low_mem_situation(void)
+{
+       const int lru_base = NR_LRU_BASE - LRU_BASE;
+       static bool was_low_mem;        /* style guide prohibits "= false" */
+       /*
+        * We declare a low-memory condition when free memory plus easily
+        * reclaimable memory is low.
+        *
+        * free_mem is completely unallocated; clean file-backed memory
+        * (file_mem - dirty_mem) is easy to reclaim, except for the last
+        * min_filelist_kbytes.
+        */
+       unsigned long free_mem = global_page_state(NR_FREE_PAGES);
+       unsigned long file_mem =
+                       global_page_state(lru_base + LRU_ACTIVE_FILE) +
+                       global_page_state(lru_base + LRU_INACTIVE_FILE);
+       unsigned long dirty_mem = global_page_state(NR_FILE_DIRTY);
+       unsigned long min_file_mem = min_filelist_kbytes >> (PAGE_SHIFT - 10);
+       unsigned long available_file_mem = file_mem - dirty_mem - min_file_mem;
+       unsigned long available_mem = free_mem + available_file_mem;
+       bool is_low_mem = available_mem < low_mem_minfree;
+
+       if (unlikely(is_low_mem && !was_low_mem)) {
+               unsigned long anon_mem =
+                       global_page_state(lru_base + LRU_ACTIVE_ANON) +
+                       global_page_state(lru_base + LRU_INACTIVE_ANON);
+               if (anon_mem < low_mem_lowest_seen_anon_mem) {
+                       printk(KERN_INFO "entering low_mem (avail = %lu kB) "
+                              "with lowest seen anon mem: %lu kB\n",
+                              available_mem * PAGE_SIZE / 1024,
+                              anon_mem * PAGE_SIZE / 1024);
+                       low_mem_lowest_seen_anon_mem = anon_mem -
+                               low_mem_anon_mem_delta;
+               }
+       }
+       was_low_mem = is_low_mem;
+
+       return is_low_mem;
+}
+
+static inline bool is_low_mem_situation(void)
+{
+       return low_mem_margin_enabled ? _is_low_mem_situation() : false;
+}
+
+#endif
index 74aa71b..28c8f81 100644 (file)
@@ -40,6 +40,8 @@ extern int sysctl_legacy_va_layout;
 #define sysctl_legacy_va_layout 0
 #endif
 
+extern int min_filelist_kbytes;
+
 #include <asm/page.h>
 #include <asm/pgtable.h>
 #include <asm/processor.h>
index 3329965..9e1c567 100644 (file)
 #define PCI_DEVICE_ID_INTEL_82845_HB   0x1a30
 #define PCI_DEVICE_ID_INTEL_IOAT       0x1a38
 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN        0x1c41
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Z68                0x1c44
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_P67                0x1c46
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_UM67       0x1c47
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_HM65       0x1c49
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_H67                0x1c4a
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_HM67       0x1c4b
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Q65                0x1c4c
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_QS67       0x1c4d
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_Q67                0x1c4e
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_QM67       0x1c4f
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_B65                0x1c50
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C202       0x1c52
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C204       0x1c54
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_C206       0x1c56
+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_H61                0x1c5c
 #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX        0x1c5f
 #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0     0x1d40
 #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1     0x1d41
 #define PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI  0x1e31
-#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MIN       0x1e40
-#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MAX       0x1e5f
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MIN       0x1e42
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_B75       0x1e49
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_C216      0x1e53
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_H77       0x1e4A
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM75      0x1e5d
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM76      0x1e59
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_HM77      0x1e57
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MBL_SAMPLE 0x1e42
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Q75       0x1e48
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Q77       0x1e47
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_QM77      0x1e55
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_QS77      0x1e56
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_SFF_SAMPLE 0x1e43
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_UM77      0x1e58
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Z75       0x1e46
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_Z77       0x1e44
+#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MAX       0x1e5d
 #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN   0x2310
 #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX   0x231f
 #define PCI_DEVICE_ID_INTEL_82801AA_0  0x2410
index 85c5073..9d3cc5f 100644 (file)
@@ -103,6 +103,7 @@ struct vmcore {
 #ifdef CONFIG_PROC_FS
 
 extern void proc_root_init(void);
+extern void proc_breakme_init(void);
 
 void proc_flush_task(struct task_struct *task);
 
index cad1502..b79fbb7 100644 (file)
@@ -317,6 +317,7 @@ extern int proc_dowatchdog_thresh(struct ctl_table *table, int write,
                                  size_t *lenp, loff_t *ppos);
 extern unsigned int  softlockup_panic;
 void lockup_detector_init(void);
+void lockup_detector_bootcpu_resume(void);
 #else
 static inline void touch_softlockup_watchdog(void)
 {
@@ -330,6 +331,9 @@ static inline void touch_all_softlockup_watchdogs(void)
 static inline void lockup_detector_init(void)
 {
 }
+static void lockup_detector_bootcpu_resume(void)
+{
+}
 #endif
 
 #ifdef CONFIG_DETECT_HUNG_TASK
index 796f1ff..145d89c 100644 (file)
@@ -44,6 +44,12 @@ enum thermal_trip_type {
        THERMAL_TRIP_CRITICAL,
 };
 
+enum cooling_device_state {
+       CDEV_STATE_OFF = 0,
+       CDEV_STATE_ON,
+       CDEV_STATE_DELAY,
+};
+
 struct thermal_zone_device_ops {
        int (*bind) (struct thermal_zone_device *,
                     struct thermal_cooling_device *);
@@ -79,6 +85,8 @@ struct thermal_cooling_device {
        void *devdata;
        const struct thermal_cooling_device_ops *ops;
        struct list_head node;
+       unsigned long delay_until;
+       enum cooling_device_state cur_state;
 };
 
 #define KELVIN_TO_CELSIUS(t)   (long)(((long)t-2732 >= 0) ?    \
@@ -104,6 +112,12 @@ struct thermal_zone_device {
        struct mutex lock;      /* protect cooling devices list */
        struct list_head node;
        struct delayed_work poll_queue;
+       unsigned int fan_on_delay; /* time in seconds to delay fan turn on */
+       int cdevs_in_delay;
+       unsigned int cdevs_aborted_turn_on;
+       unsigned int cdevs_multiple_trips;
+       unsigned int cdevs_turned_on;
+       struct dentry *debugfs_dir;
 };
 /* Adding event notification support elements */
 #define THERMAL_GENL_FAMILY_NAME                "thermal_event"
index 33a92ea..7856f6e 100644 (file)
@@ -302,6 +302,7 @@ struct itimerval {
  * The IDs of various hardware clocks:
  */
 #define CLOCK_SGI_CYCLE                        10
+#define CLOCK_SYSTEM_TRACE             11
 #define MAX_CLOCKS                     16
 #define CLOCKS_MASK                    (CLOCK_REALTIME | CLOCK_MONOTONIC)
 #define CLOCKS_MONO                    CLOCK_MONOTONIC
diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h
new file mode 100644 (file)
index 0000000..2cbb8fe
--- /dev/null
@@ -0,0 +1,53 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM fs
+
+#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_FS_H
+
+#include <linux/fs.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(do_sys_open,
+
+       TP_PROTO(char *filename, int flags, int mode),
+
+       TP_ARGS(filename, flags, mode),
+
+       TP_STRUCT__entry(
+               __string(       filename, filename              )
+               __field(        int, flags                      )
+               __field(        int, mode                       )
+       ),
+
+       TP_fast_assign(
+               __assign_str(filename, filename);
+               __entry->flags = flags;
+               __entry->mode = mode;
+       ),
+
+       TP_printk("\"%s\" %x %o",
+                 __get_str(filename), __entry->flags, __entry->mode)
+);
+
+TRACE_EVENT(open_exec,
+
+       TP_PROTO(char *filename),
+
+       TP_ARGS(filename),
+
+       TP_STRUCT__entry(
+               __string(       filename, filename              )
+       ),
+
+       TP_fast_assign(
+               __assign_str(filename, filename);
+       ),
+
+       TP_printk("\"%s\"",
+                 __get_str(filename))
+);
+
+#endif /* _TRACE_FS_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
index 42b0707..3f33263 100644 (file)
@@ -511,6 +511,7 @@ void __init prepare_namespace(void)
                ssleep(root_delay);
        }
 
+#if 0
        /*
         * wait for the known devices to complete their probing
         *
@@ -519,6 +520,8 @@ void __init prepare_namespace(void)
         * for the touchpad of a laptop to initialize.
         */
        wait_for_device_probe();
+#endif
+       async_synchronize_full();
 
        md_run_setup();
 
index 69185ae..96ee707 100644 (file)
@@ -221,6 +221,20 @@ static int posix_get_boottime(const clockid_t which_clock, struct timespec *tp)
        return 0;
 }
 
+static int posix_get_system_trace_res(const clockid_t which_clock,
+                                     struct timespec *tp)
+{
+       trace_clock_getres(tp);
+       return 0;
+}
+
+static int posix_get_system_trace(const clockid_t which_clock,
+                                 struct timespec *tp)
+{
+       trace_clock_gettime(tp);
+       return 0;
+}
+
 
 /*
  * Initialize everything, well, just everything in Posix clocks/timers ;)
@@ -271,6 +285,10 @@ static __init int init_posix_timers(void)
                .timer_get      = common_timer_get,
                .timer_del      = common_timer_del,
        };
+       struct k_clock clock_system_trace = {
+               .clock_getres   = posix_get_system_trace_res,
+               .clock_get      = posix_get_system_trace,
+       };
 
        posix_timers_register_clock(CLOCK_REALTIME, &clock_realtime);
        posix_timers_register_clock(CLOCK_MONOTONIC, &clock_monotonic);
@@ -278,6 +296,7 @@ static __init int init_posix_timers(void)
        posix_timers_register_clock(CLOCK_REALTIME_COARSE, &clock_realtime_coarse);
        posix_timers_register_clock(CLOCK_MONOTONIC_COARSE, &clock_monotonic_coarse);
        posix_timers_register_clock(CLOCK_BOOTTIME, &clock_boottime);
+       posix_timers_register_clock(CLOCK_SYSTEM_TRACE, &clock_system_trace);
 
        posix_timers_cache = kmem_cache_create("posix_timers_cache",
                                        sizeof (struct k_itimer), 0, SLAB_PANIC,
index 396d262..0d262a8 100644 (file)
@@ -177,6 +177,9 @@ static int suspend_enter(suspend_state_t state, bool *wakeup)
        arch_suspend_enable_irqs();
        BUG_ON(irqs_disabled());
 
+       /* Kick the lockup detector */
+       lockup_detector_bootcpu_resume();
+
  Enable_cpus:
        enable_nonboot_cpus();
 
index e5212ae..37d4146 100644 (file)
@@ -3112,7 +3112,7 @@ static noinline void __schedule_bug(struct task_struct *prev)
        print_modules();
        if (irqs_disabled())
                print_irqtrace_events(prev);
-       dump_stack();
+       BUG();
 }
 
 /*
index f4d4141..458040c 100644 (file)
@@ -1374,6 +1374,13 @@ static struct ctl_table vm_table[] = {
                .extra2         = &one,
        },
 #endif
+       {
+               .procname       = "min_filelist_kbytes",
+               .data           = &min_filelist_kbytes,
+               .maxlen         = sizeof(min_filelist_kbytes),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec,
+       },
        { }
 };
 
index 2a22255..54a7303 100644 (file)
@@ -196,6 +196,27 @@ cycle_t ftrace_now(int cpu)
        return ts;
 }
 
+/*
+ * Interface used by clock_getres(CLOCK_SYSTEM_TRACE).
+ */
+void trace_clock_getres(struct timespec *tp)
+{
+       *tp = ktime_to_timespec(KTIME_LOW_RES);
+}
+
+/*
+ * Interface used by clock_gettime(CLOCK_SYSTEM_TRACE).
+ */
+void trace_clock_gettime(struct timespec *tp)
+{
+       u64 now;
+       u32 rem;
+
+       now = ftrace_now(raw_smp_processor_id());
+       tp->tv_sec = div_u64_rem(now, NSEC_PER_SEC, &rem);
+       tp->tv_nsec = rem;
+}
+
 /*
  * The max_tr is used to snapshot the global_trace when a maximum
  * latency is reached. Some tracers will use this to store a maximum
index df30ee0..377dbe0 100644 (file)
@@ -585,6 +585,21 @@ static struct notifier_block __cpuinitdata cpu_nfb = {
        .notifier_call = cpu_callback
 };
 
+void lockup_detector_bootcpu_resume(void)
+{
+       void *cpu = (void *)(long)smp_processor_id();
+
+       /*
+        * On the suspend/resume path the boot CPU does not go though the
+        * offline->online transition. This breaks the NMI detector post
+        * resume. Force an offline->online transition as a workaround.
+        */
+       cpu_callback(&cpu_nfb, CPU_DEAD, cpu);
+       cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);
+
+       return;
+}
+
 void __init lockup_detector_init(void)
 {
        void *cpu = (void *)(long)smp_processor_id();
index 4015f84..121423e 100644 (file)
@@ -396,3 +396,14 @@ config CLEANCACHE
          in a negligible performance hit.
 
          If unsure, say Y to enable cleancache
+
+config LOW_MEM_NOTIFY
+       bool "Create device that lets processes detect low-memory conditions"
+       default n
+       help
+        A process can poll the /dev/low_mem device to be notified of
+         low-memory conditions.  The process can then attempt to free memory
+         before a OOM condition develops and the OOM killer takes over.  This
+         is meant to be used in systems with no or very little swap space.  In
+         the presence of large swap space, the system is likely to become
+         unusable before the OOM killer is triggered.
index 50ec00e..5a15031 100644 (file)
@@ -51,3 +51,4 @@ obj-$(CONFIG_HWPOISON_INJECT) += hwpoison-inject.o
 obj-$(CONFIG_DEBUG_KMEMLEAK) += kmemleak.o
 obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o
 obj-$(CONFIG_CLEANCACHE) += cleancache.o
+obj-$(CONFIG_LOW_MEM_NOTIFY) += low-mem-notify.o
diff --git a/mm/low-mem-notify.c b/mm/low-mem-notify.c
new file mode 100644 (file)
index 0000000..c6729b2
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * mm/low-mem-notify.c
+ *
+ * Sends low-memory notifications to processes via /dev/low-mem.
+ *
+ * Copyright (C) 2012 The Chromium OS Authors
+ * This program is free software, released under the GPL.
+ * Based on a proposal by Minchan Kim
+ *
+ * A process that polls /dev/low-mem is notified of a low-memory situation.
+ * The intent is to allow the process to free some memory before the OOM killer
+ * is invoked.
+ *
+ * A low-memory condition is estimated by subtracting anonymous memory
+ * (i.e. process data segments), kernel memory, and a fixed amount of
+ * file-backed memory from total memory.  This is just a heuristic, as in
+ * general we don't know how much memory can be reclaimed before we try to
+ * reclaim it, and that's too expensive or too late.
+ *
+ * This is tailored to Chromium OS, where a single program (the browser)
+ * controls most of the memory, and (currently) no swap space is used.
+ */
+
+
+#include <linux/low-mem-notify.h>
+#include <linux/module.h>
+#include <linux/sched.h>
+#include <linux/wait.h>
+#include <linux/poll.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+
+static DECLARE_WAIT_QUEUE_HEAD(low_mem_wait);
+static atomic_t low_mem_state = ATOMIC_INIT(0);
+unsigned low_mem_margin_mb = 50;
+bool low_mem_margin_enabled = true;
+unsigned long low_mem_minfree;
+/*
+ * We're interested in worst-case anon memory usage when the low-memory
+ * notification fires.  To contain logging, we limit our interest to
+ * non-trivial steps.
+ */
+unsigned long low_mem_lowest_seen_anon_mem;
+const unsigned long low_mem_anon_mem_delta = 10 * 1024 * 1024 / PAGE_SIZE;
+
+struct low_mem_notify_file_info {
+       unsigned long unused;
+};
+
+void low_mem_notify(void)
+{
+       atomic_set(&low_mem_state, true);
+       wake_up(&low_mem_wait);
+}
+
+static int low_mem_notify_open(struct inode *inode, struct file *file)
+{
+       struct low_mem_notify_file_info *info;
+       int err = 0;
+
+       info = kmalloc(sizeof(*info), GFP_KERNEL);
+       if (!info) {
+               err = -ENOMEM;
+               goto out;
+       }
+
+       file->private_data = info;
+out:
+       return err;
+}
+
+static int low_mem_notify_release(struct inode *inode, struct file *file)
+{
+       kfree(file->private_data);
+       return 0;
+}
+
+static unsigned int low_mem_notify_poll(struct file *file, poll_table *wait)
+{
+       unsigned int ret = 0;
+
+       /* Update state to reflect any recent freeing. */
+       atomic_set(&low_mem_state, is_low_mem_situation());
+
+       poll_wait(file, &low_mem_wait, wait);
+
+       if (low_mem_margin_enabled && atomic_read(&low_mem_state) != 0)
+               ret = POLLIN;
+
+       return ret;
+}
+
+const struct file_operations low_mem_notify_fops = {
+       .open = low_mem_notify_open,
+       .release = low_mem_notify_release,
+       .poll = low_mem_notify_poll,
+};
+EXPORT_SYMBOL(low_mem_notify_fops);
+
+#ifdef CONFIG_SYSFS
+
+#define LOW_MEM_ATTR(_name)                                  \
+       static struct kobj_attribute low_mem_##_name##_attr = \
+               __ATTR(_name, 0644, low_mem_##_name##_show,   \
+                      low_mem_##_name##_store)
+
+static ssize_t low_mem_margin_show(struct kobject *kobj,
+                                 struct kobj_attribute *attr, char *buf)
+{
+       if (low_mem_margin_enabled)
+               return sprintf(buf, "%u\n", low_mem_margin_mb);
+       else
+               return sprintf(buf, "off\n");
+}
+
+static unsigned low_mem_margin_to_minfree(unsigned margin_mb)
+{
+       return margin_mb * (1024 * 1024 / PAGE_SIZE);
+}
+
+static ssize_t low_mem_margin_store(struct kobject *kobj,
+                                   struct kobj_attribute *attr,
+                                   const char *buf, size_t count)
+{
+       int err;
+       unsigned long margin;
+       /*
+        * Even though the API does not say anything about this, the string in
+        * buf is zero-terminated (as long as count < PAGE_SIZE) because buf is
+        * a newly allocated zero-filled page.  Most other sysfs handlers rely
+        * on this too.
+        */
+       if (strncmp("off", buf, 3) == 0) {
+               printk(KERN_INFO "low_mem: disabling notifier\n");
+               low_mem_margin_enabled = false;
+               return count;
+       }
+       if (strncmp("on", buf, 2) == 0) {
+               printk(KERN_INFO "low_mem: enabling notifier\n");
+               low_mem_margin_enabled = true;
+               return count;
+       }
+
+       err = strict_strtoul(buf, 10, &margin);
+       if (err)
+               return -EINVAL;
+       if (margin * ((1024 * 1024) / PAGE_SIZE) > totalram_pages)
+               return -EINVAL;
+       /* Notify when the "free" memory is below margin megabytes. */
+       low_mem_margin_enabled = true;
+       low_mem_margin_mb = (unsigned int) margin;
+       /* Convert to pages outside the allocator fast path. */
+       low_mem_minfree = low_mem_margin_to_minfree(low_mem_margin_mb);
+       printk(KERN_INFO "low_mem: setting minfree to %lu kB\n",
+              low_mem_minfree * (PAGE_SIZE / 1024));
+       return count;
+}
+LOW_MEM_ATTR(margin);
+
+static struct attribute *low_mem_attrs[] = {
+       &low_mem_margin_attr.attr,
+       NULL,
+};
+
+static struct attribute_group low_mem_attr_group = {
+       .attrs = low_mem_attrs,
+       .name = "chromeos-low_mem",
+};
+
+static int __init low_mem_init(void)
+{
+       int err = sysfs_create_group(mm_kobj, &low_mem_attr_group);
+       if (err)
+               printk(KERN_ERR "low_mem: register sysfs failed\n");
+       low_mem_minfree = low_mem_margin_to_minfree(low_mem_margin_mb);
+       low_mem_lowest_seen_anon_mem = totalram_pages;
+       return err;
+}
+module_init(low_mem_init)
+
+#endif
index 918330f..d7780d9 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/memcontrol.h>
 #include <linux/prefetch.h>
 #include <linux/page-debug-flags.h>
+#include <linux/low-mem-notify.h>
 
 #include <asm/tlbflush.h>
 #include <asm/div64.h>
@@ -2451,6 +2452,11 @@ retry_cpuset:
        if (!preferred_zone)
                goto out;
 
+#ifdef CONFIG_LOW_MEM_NOTIFY
+       if (is_low_mem_situation())
+               low_mem_notify();
+#endif
+
        /* First allocation attempt */
        page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order,
                        zonelist, high_zoneidx, ALLOC_WMARK_LOW|ALLOC_CPUSET,
index f99ff3e..e0cec1a 100644 (file)
@@ -768,6 +768,31 @@ redirty:
        return 0;
 }
 
+/*
+ * Some intel GPUs can't use those pages in the GTT, which results in
+ * graphics corruption. Sadly, it's impossible to prevent usage of those
+ * pages in the intel allocator.
+ *
+ * Instead, we test for those areas here and leak the corresponding pages.
+ *
+ * Some day, when the intel GPU memory is not backed by shmem any more,
+ * we'll be able to come up with a solution which is contained in i915.
+ */
+static bool i915_usable_page(struct page *page)
+{
+       dma_addr_t addr = page_to_phys(page);
+
+       if (unlikely((addr < 1 * 1024 * 1024) ||
+               (addr == 0x20050000) ||
+               (addr == 0x20110000) ||
+               (addr == 0x20130000) ||
+               (addr == 0x20138000) ||
+               (addr == 0x40004000)))
+               return false;
+
+       return true;
+}
+
 #ifdef CONFIG_NUMA
 #ifdef CONFIG_TMPFS
 static void shmem_show_mpol(struct seq_file *seq, struct mempolicy *mpol)
@@ -816,6 +841,7 @@ static struct page *shmem_alloc_page(gfp_t gfp,
                        struct shmem_inode_info *info, pgoff_t index)
 {
        struct vm_area_struct pvma;
+       struct page *page;
 
        /* Create a pseudo vma that just contains the policy */
        pvma.vm_start = 0;
@@ -826,7 +852,11 @@ static struct page *shmem_alloc_page(gfp_t gfp,
        /*
         * alloc_page_vma() will drop the shared policy reference
         */
-       return alloc_page_vma(gfp, &pvma, 0);
+       do {
+               page = alloc_page_vma(gfp, &pvma, 0);
+       } while (page && !i915_usable_page(page));
+
+       return page;
 }
 #else /* !CONFIG_NUMA */
 #ifdef CONFIG_TMPFS
@@ -844,7 +874,12 @@ static inline struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp,
 static inline struct page *shmem_alloc_page(gfp_t gfp,
                        struct shmem_inode_info *info, pgoff_t index)
 {
-       return alloc_page(gfp);
+       struct page *page;
+       do {
+               page = alloc_page(gfp);
+       } while (page && !i915_usable_page(page));
+
+       return page;
 }
 #endif /* CONFIG_NUMA */
 
index 33dc256..b4664de 100644 (file)
@@ -156,6 +156,11 @@ struct mem_cgroup_zone {
 int vm_swappiness = 60;
 long vm_total_pages;   /* The total number of pages which the VM controls */
 
+/*
+ * Low watermark used to prevent fscache thrashing during low memory.
+ */
+int min_filelist_kbytes;
+
 static LIST_HEAD(shrinker_list);
 static DECLARE_RWSEM(shrinker_rwsem);
 
@@ -1865,12 +1870,32 @@ static int inactive_list_is_low(struct mem_cgroup_zone *mz, int file)
                return inactive_anon_is_low(mz);
 }
 
+/*
+ * Check low watermark used to prevent fscache thrashing during low memory.
+ */
+static int file_is_low(struct mem_cgroup_zone *mz)
+{
+       unsigned long pages_min, active, inactive;
+
+       if (!scanning_global_lru(mz))
+               return false;
+
+       pages_min = min_filelist_kbytes >> (PAGE_SHIFT - 10);
+       active = zone_page_state(mz->zone, NR_ACTIVE_FILE);
+       inactive = zone_page_state(mz->zone, NR_INACTIVE_FILE);
+
+       return ((active + inactive) < pages_min);
+}
+
 static unsigned long shrink_list(enum lru_list lru, unsigned long nr_to_scan,
                                 struct mem_cgroup_zone *mz,
                                 struct scan_control *sc, int priority)
 {
        int file = is_file_lru(lru);
 
+       if (file && file_is_low(mz))
+               return 0;
+
        if (is_active_lru(lru)) {
                if (inactive_list_is_low(mz, file))
                        shrink_active_list(nr_to_scan, mz, sc, priority, file);
@@ -3177,11 +3202,16 @@ unsigned long global_reclaimable_pages(void)
 
 unsigned long zone_reclaimable_pages(struct zone *zone)
 {
+       unsigned long pages_min;
        int nr;
 
        nr = zone_page_state(zone, NR_ACTIVE_FILE) +
             zone_page_state(zone, NR_INACTIVE_FILE);
 
+       pages_min = min_filelist_kbytes >> (PAGE_SHIFT - 10);
+       if (nr < pages_min)
+               nr = 0;
+
        if (nr_swap_pages > 0)
                nr += zone_page_state(zone, NR_ACTIVE_ANON) +
                      zone_page_state(zone, NR_INACTIVE_ANON);
index 6bf8e87..689204f 100644 (file)
@@ -27,7 +27,7 @@ endif
 installed-mod-fw := $(addprefix $(INSTALL_FW_PATH)/,$(mod-fw))
 
 installed-fw := $(addprefix $(INSTALL_FW_PATH)/,$(fw-shipped-all))
-installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)/.
+installed-fw-dirs := $(sort $(dir $(installed-fw))) $(INSTALL_FW_PATH)
 
 # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work.
 PHONY += $(INSTALL_FW_PATH)/$$(%) install-all-dirs
@@ -36,6 +36,14 @@ $(INSTALL_FW_PATH)/$$(%): install-all-dirs
 install-all-dirs: $(installed-fw-dirs)
        @true
 
+
+# hack for make-3.82 support; without this (admittedly daft) rule,
+# firmware installation fails since it can't find a matching
+# rule for $(INSTALL_FW_PATH/..
+# leave the hack in place till the root cause is fully found, without
+# it make-3.82 cannot be used.
+$(INSTALL_FW_PATH)/./: $(INSTALL_FW_PATH)
+
 quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@)
       cmd_install = $(INSTALL) -m0644 $< $@
 
index 21d91d5..b74e031 100644 (file)
@@ -975,7 +975,7 @@ static void ca0132_config(struct hda_codec *codec)
 
        /* headphone */
        cfg->hp_outs = 1;
-       cfg->hp_pins[0] = 0x0f;
+       cfg->hp_pins[0] = 0x10;
 
        spec->hp_dac = 0;
        spec->multiout.hp_nid = 0;
@@ -1011,6 +1011,45 @@ static void ca0132_exit_chip(struct hda_codec *codec)
        /* put any chip cleanup stuffs here. */
 }
 
+/* turn on/off EAPD control (only if available) */
+static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
+{
+       if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
+               return;
+       if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD) {
+               /* configure the EAPD pin, and set it to the requested state. */
+               snd_hda_codec_write(codec, nid, 0, 0x78D, 0x00);
+               snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
+                                   on ? 2 : 0);
+       }
+}
+
+/* enable EAPD controls of the codec */
+static void ca0132_auto_setup_eapd(struct hda_codec *codec, int on)
+{
+       static const hda_nid_t pins[] = {0x0b, 0};
+       const hda_nid_t *p;
+
+       for (p = pins; *p != 0; p++) {
+               if (get_wcaps_type(get_wcaps(codec, *p)) != AC_WID_PIN)
+                       return;
+               if (snd_hda_query_pin_caps(codec, *p) & AC_PINCAP_EAPD)
+                       set_eapd(codec, *p, on);
+       }
+}
+
+/* Enable GPIO mask and set output for HP amp. */
+static const struct hda_verb ca0132_hp_portd_amp_mpio2[] = {
+       {0x01, 0x790, 0x04}, /* map MPIO-2 to GPIO-0 */
+       {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
+       {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
+       {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
+       /* PortD config for HP output. */
+       {0x15, AC_VERB_SET_GPIO_DIRECTION, 0x0d},
+       {0x15, AC_VERB_SET_GPIO_WAKE_MASK, 0x20},
+       { }
+};
+
 static int ca0132_init(struct hda_codec *codec)
 {
        struct ca0132_spec *spec = codec->spec;
@@ -1030,6 +1069,8 @@ static int ca0132_init(struct hda_codec *codec)
        init_input(codec, cfg->dig_in_pin, spec->dig_in);
 
        ca0132_set_ct_ext(codec, 1);
+       ca0132_auto_setup_eapd(codec, 1);
+       snd_hda_sequence_write(codec, ca0132_hp_portd_amp_mpio2);
 
        return 0;
 }
index c83ccdb..6436243 100644 (file)
@@ -88,6 +88,7 @@ enum {
 /* CS421x boards */
 enum {
        CS421X_CDB4210,
+       STUMPY_CDB4210,
        CS421X_MODELS
 };
 
@@ -1443,6 +1444,7 @@ static int patch_cs420x(struct hda_codec *codec)
 /* CS4210 board names */
 static const char *cs421x_models[CS421X_MODELS] = {
        [CS421X_CDB4210] = "cdb4210",
+       [STUMPY_CDB4210] = "stumpy",
 };
 
 static const struct snd_pci_quirk cs421x_cfg_tbl[] = {
@@ -1463,8 +1465,20 @@ static const struct cs_pincfg cdb4210_pincfgs[] = {
        {} /* terminator */
 };
 
+/* Stumpy */
+static struct cs_pincfg stumpy_pincfgs[] = {
+       { 0x05, 0x022120f0 },
+       { 0x06, 0x901700f0 },
+       { 0x07, 0x02a120f0 },
+       { 0x08, 0x77a70037 },
+       { 0x09, 0x77a6003e },
+       { 0x0a, 0x434510f0 },
+       {} /* terminator */
+};
+
 static const struct cs_pincfg *cs421x_pincfgs[CS421X_MODELS] = {
        [CS421X_CDB4210] = cdb4210_pincfgs,
+       [STUMPY_CDB4210] = stumpy_pincfgs,
 };
 
 static const struct hda_verb cs421x_coef_init_verbs[] = {
index 7810913..f3a185e 100644 (file)
@@ -744,6 +744,13 @@ static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
 {
        if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
                return;
+
+       /* delay de-assert of eapd to allow biasing of amp
+        * inputs to settle avoiding an audible 'pop'.
+        */
+       if ((nid == 0x14) && codec->subsystem_id == 0x144dc0a7)
+               msleep(25);
+
        if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
                                    on ? 2 : 0);
@@ -5879,7 +5886,8 @@ static void alc271_fixup_dmic(struct hda_codec *codec,
        };
        unsigned int cfg;
 
-       if (strcmp(codec->chip_name, "ALC271X"))
+       if (strcmp(codec->chip_name, "ALC271X") &&
+           strcmp(codec->chip_name, "ALC269VB"))
                return;
        cfg = snd_hda_codec_get_pincfg(codec, 0x12);
        if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
@@ -5984,6 +5992,7 @@ enum {
        ALC269VB_FIXUP_AMIC,
        ALC269VB_FIXUP_DMIC,
        ALC269_FIXUP_MIC2_MUTE_LED,
+       ALC271_FIXUP_ACER_ZGB,
 };
 
 static const struct alc_fixup alc269_fixups[] = {
@@ -6108,6 +6117,19 @@ static const struct alc_fixup alc269_fixups[] = {
                .type = ALC_FIXUP_FUNC,
                .v.func = alc269_fixup_mic2_mute,
        },
+       [ALC271_FIXUP_ACER_ZGB] = {
+               .type = ALC_FIXUP_PINS,
+               .v.pins = (const struct alc_pincfg[]) {
+                       { 0x12, 0x99a3092f }, /* int-mic */
+                       { 0x14, 0x99130110 }, /* speaker */
+                       { 0x18, 0x03a11c20 }, /* mic */
+                       { 0x1e, 0x0346101e }, /* SPDIF1 */
+                       { 0x21, 0x0321101f }, /* HP out */
+                       { }
+               },
+               .chained = true,
+               .chain_id = ALC271_FIXUP_DMIC,
+       },
 };
 
 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -6124,6 +6146,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
        SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
        SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
+       SND_PCI_QUIRK(0x1025, 0x047c, "ACER ZGB", ALC271_FIXUP_ACER_ZGB),
        SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
        SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
        SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
@@ -6590,6 +6613,17 @@ static void alc272_fixup_mario(struct hda_codec *codec,
                       "hda_codec: failed to override amp caps for NID 0x2\n");
 }
 
+static void alc272_fixup_alex(struct hda_codec *codec,
+                              const struct alc_fixup *fix, int pre_init) {
+       if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
+                                     (0x3c << AC_AMPCAP_OFFSET_SHIFT) |
+                                     (0x3c << AC_AMPCAP_NUM_STEPS_SHIFT) |
+                                     (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
+                                     (0 << AC_AMPCAP_MUTE_SHIFT)))
+               printk(KERN_WARNING
+                      "hda_codec: failed to override amp caps for NID 0x2\n");
+}
+
 enum {
        ALC662_FIXUP_ASPIRE,
        ALC662_FIXUP_IDEAPAD,
@@ -6606,6 +6640,7 @@ enum {
        ALC662_FIXUP_ASUS_MODE7,
        ALC662_FIXUP_ASUS_MODE8,
        ALC662_FIXUP_NO_JACK_DETECT,
+       ALC272_FIXUP_ALEX,
 };
 
 static const struct alc_fixup alc662_fixups[] = {
@@ -6755,6 +6790,10 @@ static const struct alc_fixup alc662_fixups[] = {
                .type = ALC_FIXUP_FUNC,
                .v.func = alc_fixup_no_jack_detect,
        },
+       [ALC272_FIXUP_ALEX] = {
+               .type = ALC_FIXUP_FUNC,
+               .v.func = alc272_fixup_alex,
+       }
 };
 
 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
@@ -6840,6 +6879,7 @@ static const struct alc_model_fixup alc662_fixup_models[] = {
        {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
        {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
        {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
+       {.id = ALC272_FIXUP_ALEX, .name = "alex"},
        {}
 };
 
diff --git a/tools/mm/low-mem-test.c b/tools/mm/low-mem-test.c
new file mode 100644 (file)
index 0000000..e5cc839
--- /dev/null
@@ -0,0 +1,178 @@
+/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
+ * This program is free software, released under the GPL.
+ * Based on code by Minchan Kim
+ *
+ * User program that tests low-memory notifications.
+ *
+ * Compile with -lpthread
+ * for instance
+ * i686-pc-linux-gnu-gcc low-mem-test.c -o low-mem-test -lpthread
+ *
+ * Run as: low-mem-test <allocation size> <allocation interval (microseconds)>
+ *
+ * This program runs in two threads.  One thread continuously allocates memory
+ * in the given chunk size, waiting for the specified microsecond interval
+ * between allocations.  The other runs in a loop that waits for a low-memory
+ * notification, then frees some of the memory that the first thread has
+ * allocated.
+ */
+
+#include <poll.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <string.h>
+
+int memory_chunk_size = 10000000;
+int wait_time_us = 10000;
+int autotesting;
+
+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+
+struct node {
+       void *memory;
+       struct node *prev;
+       struct node *next;
+};
+
+struct node head, tail;
+
+void work(void)
+{
+       int i;
+
+       while (1) {
+               struct node *new = malloc(sizeof(struct node));
+               if (new == NULL) {
+                       perror("allocating node");
+                       exit(1);
+               }
+               new->memory = malloc(memory_chunk_size);
+               if (new->memory == NULL) {
+                       perror("allocating chunk");
+                       exit(1);
+               }
+
+               pthread_mutex_lock(&mutex);
+               new->next = &head;
+               new->prev = head.prev;
+               new->prev->next = new;
+               new->next->prev = new;
+               for (i = 0; i < memory_chunk_size / 4096; i++) {
+                       /* touch page */
+                       ((unsigned char *) new->memory)[i * 4096] = 1;
+               }
+
+               pthread_mutex_unlock(&mutex);
+
+               if (!autotesting) {
+                       printf("+");
+                       fflush(stdout);
+               }
+
+               usleep(wait_time_us);
+       }
+}
+
+void free_memory(void)
+{
+       struct node *old;
+       pthread_mutex_lock(&mutex);
+       old = tail.next;
+       if (old == &head) {
+               fprintf(stderr, "no memory left to free\n");
+               exit(1);
+       }
+       old->prev->next = old->next;
+       old->next->prev = old->prev;
+       free(old->memory);
+       free(old);
+       pthread_mutex_unlock(&mutex);
+       if (!autotesting) {
+               printf("-");
+               fflush(stdout);
+       }
+}
+
+void *poll_thread(void *dummy)
+{
+       struct pollfd pfd;
+       int fd = open("/dev/chromeos-low-mem", O_RDONLY);
+       if (fd == -1) {
+               perror("/dev/chromeos-low-mem");
+               exit(1);
+       }
+
+       pfd.fd = fd;
+       pfd.events = POLLIN;
+
+       if (autotesting) {
+               /* Check that there is no memory shortage yet. */
+               poll(&pfd, 1, 0);
+               if (pfd.revents != 0) {
+                       exit(0);
+               } else {
+                       fprintf(stderr, "expected no events but "
+                               "poll() returned 0x%x\n", pfd.revents);
+                       exit(1);
+               }
+       }
+
+       while (1) {
+               poll(&pfd, 1, -1);
+               if (autotesting) {
+                       /* Free several chunks and check that the notification
+                        * is gone. */
+                       free_memory();
+                       free_memory();
+                       free_memory();
+                       free_memory();
+                       free_memory();
+                       poll(&pfd, 1, 0);
+                       if (pfd.revents == 0) {
+                               exit(0);
+                       } else {
+                               fprintf(stderr, "expected no events but "
+                                       "poll() returned 0x%x\n", pfd.revents);
+                               exit(1);
+                       }
+               }
+               free_memory();
+       }
+}
+
+int main(int argc, char **argv)
+{
+       pthread_t threadid;
+
+       head.next = NULL;
+       head.prev = &tail;
+       tail.next = &head;
+       tail.prev = NULL;
+
+       if (argc != 3 && (argc != 2 || strcmp(argv[1], "autotesting"))) {
+               fprintf(stderr,
+                       "usage: low-mem-test <alloc size in bytes> "
+                       "<alloc interval in microseconds>\n"
+                       "or:    low-mem-test autotesting\n");
+               exit(1);
+       }
+
+       if (argc == 2) {
+               autotesting = 1;
+       } else {
+               memory_chunk_size = atoi(argv[1]);
+               wait_time_us = atoi(argv[2]);
+       }
+
+       if (pthread_create(&threadid, NULL, poll_thread, NULL)) {
+               perror("pthread");
+               return 1;
+       }
+
+       work();
+       return 0;
+}