From f5311f196837f1b71da1fed86251b6f5b4e0db34 Mon Sep 17 00:00:00 2001 From: "Nanxin.Qin" Date: Wed, 27 Mar 2019 11:14:04 +0800 Subject: [PATCH] decoder: bringup sm1. [1/2] PD#SWPL-5261 Problem: bringup sm1. Solution: 1. add cpu chipid sm1. 2. modify the operation of the DOS power on/off to compatible with soc sm1. 3. ucode commit id: 6e4fda861bcf23d1bb01f4a8c2fe516219e818c7 Verify: AC200 Change-Id: I386a324bae2d78e4d66f9adeeb23f898b4cccc61 Signed-off-by: Nanxin.Qin --- .../media_modules/common/chips/chips.c | 1 + .../common/chips/decoder_cpu_ver_info.c | 6 ++ .../common/chips/decoder_cpu_ver_info.h | 1 + .../common/firmware/firmware_type.c | 11 ++-- .../common/media_clock/clk/clkg12.c | 8 ++- .../frame_provider/decoder/avs2/vavs2.c | 22 +++---- .../decoder/h264_multi/vmh264.c | 2 +- .../frame_provider/decoder/h265/vh265.c | 18 +++--- .../frame_provider/decoder/utils/vdec.c | 61 ++++++++++++------ .../frame_provider/decoder/vp9/vvp9.c | 34 +++++----- firmware/video/video_ucode.bin | Bin 945408 -> 1617664 bytes 11 files changed, 100 insertions(+), 64 deletions(-) diff --git a/drivers/amlogic/media_modules/common/chips/chips.c b/drivers/amlogic/media_modules/common/chips/chips.c index e3792b721b61..1fe51072d27b 100644 --- a/drivers/amlogic/media_modules/common/chips/chips.c +++ b/drivers/amlogic/media_modules/common/chips/chips.c @@ -73,6 +73,7 @@ static const struct type_name cpu_type_name[] = { {AM_MESON_CPU_MAJOR_ID_TXLX, "txlx"}, {AM_MESON_CPU_MAJOR_ID_G12A, "g12a"}, {AM_MESON_CPU_MAJOR_ID_G12B, "g12b"}, + {AM_MESON_CPU_MAJOR_ID_SM1, "sm1"}, {AM_MESON_CPU_MAJOR_ID_TL1, "tl1"}, {0, NULL}, }; diff --git a/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.c b/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.c index 36b594a070ac..1c0535712726 100644 --- a/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.c +++ b/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.c @@ -56,6 +56,7 @@ static enum AM_MESON_CPU_MAJOR_ID cpu_ver_info[AM_MESON_CPU_MAJOR_ID_MAX - MAJOR AM_MESON_CPU_MAJOR_ID_G12A, AM_MESON_CPU_MAJOR_ID_G12B, AM_MESON_CPU_MAJOR_ID_GXLX2, + AM_MESON_CPU_MAJOR_ID_SM1, AM_MESON_CPU_MAJOR_ID_TL1, }; @@ -90,6 +91,11 @@ static const struct of_device_id cpu_ver_of_match[] = { .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TXLX - MAJOR_ID_START], }, + { + .compatible = "amlogic, cpu-major-id-sm1", + .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_SM1 - MAJOR_ID_START], + }, + { .compatible = "amlogic, cpu-major-id-tl1", .data = &cpu_ver_info[AM_MESON_CPU_MAJOR_ID_TL1 - MAJOR_ID_START], diff --git a/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.h b/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.h index c9f391a4108f..7b9f187d16f3 100644 --- a/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.h +++ b/drivers/amlogic/media_modules/common/chips/decoder_cpu_ver_info.h @@ -43,6 +43,7 @@ enum AM_MESON_CPU_MAJOR_ID AM_MESON_CPU_MAJOR_ID_G12A = 0x28, AM_MESON_CPU_MAJOR_ID_G12B = 0x29, AM_MESON_CPU_MAJOR_ID_GXLX2 = 0x2a, + AM_MESON_CPU_MAJOR_ID_SM1 = 0x2b, AM_MESON_CPU_MAJOR_ID_TL1 = 0x2e, AM_MESON_CPU_MAJOR_ID_MAX, }; diff --git a/drivers/amlogic/media_modules/common/firmware/firmware_type.c b/drivers/amlogic/media_modules/common/firmware/firmware_type.c index 9c5edd622ebf..882be8ce78da 100644 --- a/drivers/amlogic/media_modules/common/firmware/firmware_type.c +++ b/drivers/amlogic/media_modules/common/firmware/firmware_type.c @@ -60,17 +60,18 @@ static const struct format_name_s format_name[] = { }; static const struct cpu_type_s cpu_type[] = { - {AM_MESON_CPU_MAJOR_ID_GXL, "gxl"}, - {AM_MESON_CPU_MAJOR_ID_GXM, "gxm"}, - {AM_MESON_CPU_MAJOR_ID_TXL, "txl"}, + {AM_MESON_CPU_MAJOR_ID_GXL, "gxl"}, + {AM_MESON_CPU_MAJOR_ID_GXM, "gxm"}, + {AM_MESON_CPU_MAJOR_ID_TXL, "txl"}, {AM_MESON_CPU_MAJOR_ID_TXLX, "txlx"}, - {AM_MESON_CPU_MAJOR_ID_AXG, "axg"}, + {AM_MESON_CPU_MAJOR_ID_AXG, "axg"}, {AM_MESON_CPU_MAJOR_ID_GXLX, "gxlx"}, {AM_MESON_CPU_MAJOR_ID_TXHD, "txhd"}, {AM_MESON_CPU_MAJOR_ID_G12A, "g12a"}, {AM_MESON_CPU_MAJOR_ID_G12B, "g12b"}, {AM_MESON_CPU_MAJOR_ID_GXLX2, "gxlx2"}, - {AM_MESON_CPU_MAJOR_ID_TL1, "tl1"}, + {AM_MESON_CPU_MAJOR_ID_SM1, "sm1"}, + {AM_MESON_CPU_MAJOR_ID_TL1, "tl1"}, }; const char *get_fw_format_name(unsigned int format) diff --git a/drivers/amlogic/media_modules/common/media_clock/clk/clkg12.c b/drivers/amlogic/media_modules/common/media_clock/clk/clkg12.c index d5b6daf9693c..eeb6d29c7277 100644 --- a/drivers/amlogic/media_modules/common/media_clock/clk/clkg12.c +++ b/drivers/amlogic/media_modules/common/media_clock/clk/clkg12.c @@ -719,6 +719,9 @@ static int vdec_clock_set(int clk) clk = 667; } + if (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1) + clk = 800; + if (set_frq_enable && vdec_frq) { pr_info("Set the vdec frq is %u MHz\n", vdec_frq); clk = vdec_frq; @@ -765,7 +768,7 @@ static int hevc_back_clock_set(int clk) if ((clk > 500 && clk != 667)) { if (clock_real_clk[VDEC_HEVCB] == 648) return 648; - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) clk = TL1_HEVC_MAX_CLK; else clk = 667; @@ -813,7 +816,7 @@ static int hevc_clock_set(int clk) if ((clk > 500 && clk != 667)) { if (clock_real_clk[VDEC_HEVC] == 648) return 648; - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) clk = TL1_HEVC_MAX_CLK; else clk = 667; @@ -1009,6 +1012,7 @@ static int vdec_clock_get(enum vdec_type_e core) AM_MESON_CPU_MAJOR_ID_TXLX,\ AM_MESON_CPU_MAJOR_ID_G12A,\ AM_MESON_CPU_MAJOR_ID_G12B,\ + AM_MESON_CPU_MAJOR_ID_SM1,\ AM_MESON_CPU_MAJOR_ID_TL1,\ 0} #include "clk.h" diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/avs2/vavs2.c b/drivers/amlogic/media_modules/frame_provider/decoder/avs2/vavs2.c index 220d33d9bb34..633c9247792c 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/avs2/vavs2.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/avs2/vavs2.c @@ -809,7 +809,7 @@ static int avs2_print_cont(struct AVS2Decoder_s *dec, static int get_frame_mmu_map_size(struct AVS2Decoder_s *dec) { - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && (IS_8K_SIZE(dec->init_pic_w, dec->init_pic_h))) return (MAX_FRAME_8K_NUM * 4); return (MAX_FRAME_4K_NUM * 4); @@ -817,7 +817,7 @@ static int get_frame_mmu_map_size(struct AVS2Decoder_s *dec) static int get_compress_header_size(struct AVS2Decoder_s *dec) { - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && (IS_8K_SIZE(dec->init_pic_w, dec->init_pic_h))) return MMU_COMPRESS_8K_HEADER_SIZE; return MMU_COMPRESS_HEADER_SIZE; @@ -952,7 +952,7 @@ int avs2_alloc_mmu( dec, pic_width, pic_height, bit_depth_10); cur_mmu_4k_number = ((picture_size + (1 << 12) - 1) >> 12); - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) max_frame_num = MAX_FRAME_8K_NUM; else max_frame_num = MAX_FRAME_4K_NUM; @@ -2188,7 +2188,7 @@ static int config_pic(struct AVS2Decoder_s *dec, } #ifdef MV_USE_FIXED_BUF #ifdef G12A_BRINGUP_DEBUG - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { pic->mpred_mv_wr_start_addr = dec->work_space_buf->mpred_mv.buf_start + (pic->index * 0x120000 * 4); @@ -2709,7 +2709,7 @@ static void config_mcrcc_axi_hw(struct AVS2Decoder_s *dec) return; } /* - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { mcrcc_get_hitrate(); decomp_get_hitrate(); decomp_get_comprate(); @@ -3696,7 +3696,7 @@ static void avs2_init_decoder_hw(struct AVS2Decoder_s *dec) avs2_print(dec, AVS2_DBG_BUFMGR_MORE, "Bitstream level Init for DBLK .Done.\n"); - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { mcrcc_perfcount_reset(); decomp_perfcount_reset(); } @@ -3799,7 +3799,7 @@ static int avs2_local_init(struct AVS2Decoder_s *dec) cur_buf_info = &dec->work_space_buf_store; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) memcpy(cur_buf_info, &amvavs2_workbuff_spec[2], /* 8k */ sizeof(struct BuffInfo_s)); else @@ -3838,7 +3838,7 @@ static int avs2_local_init(struct AVS2Decoder_s *dec) && (buf_alloc_width > 1920 && buf_alloc_height > 1088)) { buf_alloc_width = 1920; buf_alloc_height = 1088; - } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { buf_alloc_width = 8192; buf_alloc_height = 4608; } @@ -5167,7 +5167,7 @@ static irqreturn_t vavs2_isr_thread_fn(int irq, void *data) unsigned long buf_addr; unsigned mv_buf_size = 0x120000; int i = dec->avs2_dec.hc.cur_pic->index; - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) mv_buf_size = 0x120000 * 4; if (decoder_bmmu_box_alloc_buf_phy (dec->bmmu_box, @@ -7036,7 +7036,7 @@ static int __init amvdec_avs2_driver_init_module(void) struct BuffInfo_s *p_buf_info; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) p_buf_info = &amvavs2_workbuff_spec[2]; else p_buf_info = &amvavs2_workbuff_spec[1]; @@ -7068,7 +7068,7 @@ static int __init amvdec_avs2_driver_init_module(void) return -ENODEV; } - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { amvdec_avs2_profile.profile = "8k, 10bit, dwrite, compressed"; vcodec_profile_register(&amvdec_avs2_profile); diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c b/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c index fd92bcc6d430..9c51508c35d0 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/h264_multi/vmh264.c @@ -887,7 +887,7 @@ static u32 mem_map_mode = H265_MEM_MAP_MODE; static int is_oversize(int w, int h) { - int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1)? + int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1)? MAX_SIZE_8K : MAX_SIZE_4K; if (w < 0 || h < 0) diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c b/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c index 9e7f8f3017d4..e585fe6261b5 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/h265/vh265.c @@ -1693,7 +1693,7 @@ u32 again_threshold = 0x40; static int get_frame_mmu_map_size(void) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) return (MAX_FRAME_8K_NUM * 4); return (MAX_FRAME_4K_NUM * 4); @@ -1701,7 +1701,7 @@ static int get_frame_mmu_map_size(void) static int is_oversize(int w, int h) { - int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1)? + int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1)? MAX_SIZE_8K : MAX_SIZE_4K; if (w < 0 || h < 0) @@ -2822,7 +2822,7 @@ static int cal_current_buf_size(struct hevc_state_s *hevc, int dw_mode = get_double_write_mode(hevc); if (hevc->mmu_enable) { - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && (IS_8K_SIZE(hevc->pic_w, hevc->pic_h))) buf_size = ((MMU_COMPRESS_8K_HEADER_SIZE + 0xffff) >> 16) << 16; @@ -3066,7 +3066,7 @@ static int config_pic(struct hevc_state_s *hevc, struct PIC_s *pic) if (hevc->mmu_enable) { pic->header_adr = hevc->m_BUF[i].start_adr; - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && (IS_8K_SIZE(hevc->pic_w, hevc->pic_h))) y_adr = hevc->m_BUF[i].start_adr + MMU_COMPRESS_8K_HEADER_SIZE; @@ -4870,7 +4870,7 @@ static void config_sao_hw(struct hevc_state_s *hevc, union param_u *params) /* DBLK CONFIG HERE */ if (hevc->new_pic) { if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_G12A) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) data32 = (0xff << 8) | (0x0 << 0); else data32 = (0x57 << 8) | /* 1st/2nd write both enable*/ @@ -6422,7 +6422,7 @@ static int H265_alloc_mmu(struct hevc_state_s *hevc, struct PIC_s *new_pic, decoder_mmu_box_free_idx(hevc->mmu_box, new_pic->index); new_pic->scatter_alloc = 0; } - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) max_frame_num = MAX_FRAME_8K_NUM; else max_frame_num = MAX_FRAME_4K_NUM; @@ -6537,7 +6537,7 @@ static int hevc_local_init(struct hevc_state_s *hevc) cur_buf_info = &hevc->work_space_buf_store; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) memcpy(cur_buf_info, &amvh265_workbuff_spec[2], /* 4k */ sizeof(struct BuffInfo_s)); else @@ -11866,7 +11866,7 @@ static int __init amvdec_h265_driver_init_module(void) struct BuffInfo_s *p_buf_info; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) p_buf_info = &amvh265_workbuff_spec[2]; else p_buf_info = &amvh265_workbuff_spec[1]; @@ -11909,7 +11909,7 @@ static int __init amvdec_h265_driver_init_module(void) if (is_meson_m8m2_cpu()) { /* m8m2 support 4k */ amvdec_h265_profile.profile = "4k"; - } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { amvdec_h265_profile.profile = "8k, 8bit, 10bit, dwrite, compressed"; }else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_GXBB) { diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/utils/vdec.c b/drivers/amlogic/media_modules/frame_provider/decoder/utils/vdec.c index 57159d7d6e8b..f62b76ab7baf 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/utils/vdec.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/utils/vdec.c @@ -2816,7 +2816,9 @@ void vdec_poweron(enum vdec_type_e core) if (core == VDEC_1) { /* vdec1 power on */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, - READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & ~0xc); + READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x2 : ~0xc)); /* wait 10uS */ udelay(10); /* vdec1 soft reset */ @@ -2834,7 +2836,9 @@ void vdec_poweron(enum vdec_type_e core) WRITE_VREG(DOS_MEM_PD_VDEC, 0); /* remove vdec1 isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, - READ_AOREG(AO_RTI_GEN_PWR_ISO0) & ~0xC0); + READ_AOREG(AO_RTI_GEN_PWR_ISO0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x2 : ~0xC0)); /* reset DOS top registers */ WRITE_VREG(DOS_VDEC_MCRCC_STALL_CTRL, 0); if (get_cpu_major_id() >= @@ -2875,8 +2879,9 @@ void vdec_poweron(enum vdec_type_e core) if (has_hdec()) { /* hcodec power on */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, - READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & - ~0x3); + READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x1 : ~0x3)); /* wait 10uS */ udelay(10); /* hcodec soft reset */ @@ -2888,8 +2893,9 @@ void vdec_poweron(enum vdec_type_e core) WRITE_VREG(DOS_MEM_PD_HCODEC, 0); /* remove hcodec isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, - READ_AOREG(AO_RTI_GEN_PWR_ISO0) & - ~0x30); + READ_AOREG(AO_RTI_GEN_PWR_ISO0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x1 : ~0x30)); } } else if (core == VDEC_HEVC) { if (has_hevc_vdec()) { @@ -2899,7 +2905,8 @@ void vdec_poweron(enum vdec_type_e core) /* hevc power on */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & - ~0xc0); + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x4 : ~0xc0)); /* wait 10uS */ udelay(10); /* hevc soft reset */ @@ -2916,7 +2923,8 @@ void vdec_poweron(enum vdec_type_e core) /* remove hevc isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, READ_AOREG(AO_RTI_GEN_PWR_ISO0) & - ~0xc00); + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? ~0x4 : ~0xc00)); if (!hevc_workaround_needed()) break; @@ -2994,14 +3002,18 @@ void vdec_poweroff(enum vdec_type_e core) } /* enable vdec1 isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, - READ_AOREG(AO_RTI_GEN_PWR_ISO0) | 0xc0); + READ_AOREG(AO_RTI_GEN_PWR_ISO0) | + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x2 : 0xc0)); /* power off vdec1 memories */ WRITE_VREG(DOS_MEM_PD_VDEC, 0xffffffffUL); /* disable vdec1 clock */ vdec_clock_off(); /* vdec1 power off */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, - READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | 0xc); + READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x2 : 0xc)); } else if (core == VDEC_2) { if (has_vdec2()) { /* enable vdec2 isolation */ @@ -3021,15 +3033,18 @@ void vdec_poweroff(enum vdec_type_e core) if (has_hdec()) { /* enable hcodec isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, - READ_AOREG(AO_RTI_GEN_PWR_ISO0) | - 0x30); + READ_AOREG(AO_RTI_GEN_PWR_ISO0) | + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x1 : 0x30)); /* power off hcodec memories */ WRITE_VREG(DOS_MEM_PD_HCODEC, 0xffffffffUL); /* disable hcodec clock */ hcodec_clock_off(); /* hcodec power off */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, - READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | 3); + READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x1 : 3)); } } else if (core == VDEC_HEVC) { if (has_hevc_vdec()) { @@ -3037,7 +3052,8 @@ void vdec_poweroff(enum vdec_type_e core) /* enable hevc isolation */ WRITE_AOREG(AO_RTI_GEN_PWR_ISO0, READ_AOREG(AO_RTI_GEN_PWR_ISO0) | - 0xc00); + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x4 : 0xc00)); /* power off hevc memories */ WRITE_VREG(DOS_MEM_PD_HEVC, 0xffffffffUL); @@ -3048,8 +3064,9 @@ void vdec_poweroff(enum vdec_type_e core) /* hevc power off */ WRITE_AOREG(AO_RTI_GEN_PWR_SLEEP0, - READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | - 0xc0); + READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) | + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x4 : 0xc0)); } else { pr_info("!!!!!!!!not power down\n"); hevc_reset_core(NULL); @@ -3066,7 +3083,9 @@ bool vdec_on(enum vdec_type_e core) bool ret = false; if (core == VDEC_1) { - if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & 0xc) == 0) && + if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x2 : 0xc)) == 0) && (READ_HHI_REG(HHI_VDEC_CLK_CNTL) & 0x100)) ret = true; } else if (core == VDEC_2) { @@ -3077,13 +3096,17 @@ bool vdec_on(enum vdec_type_e core) } } else if (core == VDEC_HCODEC) { if (has_hdec()) { - if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & 0x3) == 0) && + if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x1 : 0x3)) == 0) && (READ_HHI_REG(HHI_VDEC_CLK_CNTL) & 0x1000000)) ret = true; } } else if (core == VDEC_HEVC) { if (has_hevc_vdec()) { - if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & 0xc0) == 0) && + if (((READ_AOREG(AO_RTI_GEN_PWR_SLEEP0) & + (get_cpu_major_id() == AM_MESON_CPU_MAJOR_ID_SM1 + ? 0x4 : 0xc0)) == 0) && (READ_HHI_REG(HHI_VDEC2_CLK_CNTL) & 0x1000000)) ret = true; } diff --git a/drivers/amlogic/media_modules/frame_provider/decoder/vp9/vvp9.c b/drivers/amlogic/media_modules/frame_provider/decoder/vp9/vvp9.c index c246fe16ba85..4483297bd3cf 100644 --- a/drivers/amlogic/media_modules/frame_provider/decoder/vp9/vvp9.c +++ b/drivers/amlogic/media_modules/frame_provider/decoder/vp9/vvp9.c @@ -1590,7 +1590,7 @@ int vp9_alloc_mmu( bit_depth_10); cur_mmu_4k_number = ((picture_size + (1 << 12) - 1) >> 12); - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) max_frame_num = MAX_FRAME_8K_NUM; else max_frame_num = MAX_FRAME_4K_NUM; @@ -4677,7 +4677,7 @@ static int config_pic(struct VP9Decoder_s *pbi, static int is_oversize(int w, int h) { - int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1)? + int max = (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1)? MAX_SIZE_8K : MAX_SIZE_4K; if (w < 0 || h < 0) @@ -4691,7 +4691,7 @@ static int is_oversize(int w, int h) static int vvp9_mmu_compress_header_size(struct VP9Decoder_s *pbi) { - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && IS_8K_SIZE(pbi->max_pic_w, pbi->max_pic_h)) return (MMU_COMPRESS_8K_HEADER_SIZE); @@ -4701,7 +4701,7 @@ static int vvp9_mmu_compress_header_size(struct VP9Decoder_s *pbi) /*#define FRAME_MMU_MAP_SIZE (MAX_FRAME_4K_NUM * 4)*/ static int vvp9_frame_mmu_map_size(struct VP9Decoder_s *pbi) { - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && IS_8K_SIZE(pbi->max_pic_w, pbi->max_pic_h)) return (MAX_FRAME_8K_NUM * 4); @@ -4890,7 +4890,7 @@ static int config_pic_size(struct VP9Decoder_s *pbi, unsigned short bit_depth) else WRITE_VREG(HEVCD_MPP_DECOMP_CTL1, (1 << 3)); } - if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_SM1) WRITE_VREG(HEVCD_MPP_DECOMP_CTL2, (losless_comp_body_size >> 5)); /*WRITE_VREG(HEVCD_MPP_DECOMP_CTL3,(0xff<<20) | (0xff<<10) | 0xff);*/ WRITE_VREG(HEVC_CM_BODY_LENGTH, losless_comp_body_size); @@ -5241,7 +5241,7 @@ static void vp9_config_work_space_hw(struct VP9Decoder_s *pbi, u32 mask) /* cfg_d_addr */ WRITE_VREG(HEVC_DBLK_CFG5, buf_spec->dblk_data.buf_start); - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { /* * data32 = (READ_VREG(P_HEVC_DBLK_CFG3)>>8) & 0xff; // xio left offset, default is 0x40 * data32 = data32 * 2; @@ -5254,7 +5254,7 @@ static void vp9_config_work_space_hw(struct VP9Decoder_s *pbi, u32 mask) if (pbi->mmu_enable) { /*bit[4] : paged_mem_mode*/ WRITE_VREG(HEVCD_MPP_DECOMP_CTL1, (0x1 << 4)); - if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_SM1) WRITE_VREG(HEVCD_MPP_DECOMP_CTL2, 0); } else { /*if(cur_pic_config->bit_depth == VPX_BITS_10) @@ -5466,7 +5466,7 @@ void vp9_loop_filter_init(struct VP9Decoder_s *pbi) } /*video format is VP9*/ - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { data32 = (0x3 << 14) | // (dw fifo thres r and b) (0x3 << 12) | // (dw fifo thres r or b) (0x3 << 10) | // (dw fifo thres not r/b) @@ -5826,7 +5826,7 @@ static void config_mcrcc_axi_hw(struct VP9Decoder_s *pbi) return; } - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { mcrcc_get_hitrate(pbi->m_ins_flag); decomp_get_hitrate(); decomp_get_comprate(); @@ -6120,7 +6120,7 @@ static int vp9_local_init(struct VP9Decoder_s *pbi) cur_buf_info = &pbi->work_space_buf_store; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { memcpy(cur_buf_info, &amvvp9_workbuff_spec[2], /* 8k */ sizeof(struct BuffInfo_s)); } else @@ -6137,7 +6137,7 @@ static int vp9_local_init(struct VP9Decoder_s *pbi) #else /*! MULTI_INSTANCE_SUPPORT*/ if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) cur_buf_info = &amvvp9_workbuff_spec[2];/* 8k work space */ else cur_buf_info = &amvvp9_workbuff_spec[1];/* 4k2k work space */ @@ -6157,7 +6157,7 @@ static int vp9_local_init(struct VP9Decoder_s *pbi) pbi->max_pic_w = 1920; pbi->max_pic_h = 1088; } - } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { buf_alloc_width = 8192; buf_alloc_height = 4608; } @@ -6172,7 +6172,7 @@ static int vp9_local_init(struct VP9Decoder_s *pbi) pbi->vvp9_amstream_dec_info.height : pbi->work_space_buf->max_height)); - if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) && + if ((get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) && (pbi->double_write_mode != 0) && (((pbi->max_pic_w % 64) != 0) || (pbi->vvp9_amstream_dec_info.width % 64) != 0)) @@ -8336,7 +8336,7 @@ static int amvdec_vp9_probe(struct platform_device *pdev) pbi->init_flag = 0; pbi->first_sc_checked= 0; - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { vp9_max_pic_w = 8192; vp9_max_pic_h = 4608; } @@ -9347,7 +9347,7 @@ static int ammvdec_vp9_probe(struct platform_device *pdev) if (get_cpu_major_id() < AM_MESON_CPU_MAJOR_ID_TXLX) pbi->stat |= VP9_TRIGGER_FRAME_ENABLE; - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { pbi->max_pic_w = 8192; pbi->max_pic_h = 4608; } @@ -9611,7 +9611,7 @@ static int __init amvdec_vp9_driver_init_module(void) struct BuffInfo_s *p_buf_info; if (vdec_is_support_4k()) { - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) p_buf_info = &amvvp9_workbuff_spec[2]; else p_buf_info = &amvvp9_workbuff_spec[1]; @@ -9646,7 +9646,7 @@ static int __init amvdec_vp9_driver_init_module(void) return -ENODEV; } - if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_TL1) { + if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_SM1) { amvdec_vp9_profile.profile = "8k, 10bit, dwrite, compressed"; } else if (get_cpu_major_id() >= AM_MESON_CPU_MAJOR_ID_GXL diff --git a/firmware/video/video_ucode.bin b/firmware/video/video_ucode.bin index a5145607e9493152ab0ca2620e34ff1a588f6067..ec0dfaa5e8c8d492ef5d114648657a0d31c77417 100755 GIT binary patch delta 24471 zcmeHv33L@jx_?#my}jSg1|fuS6B5Fbgb*TY5NJTmLJ~;W6afh!q9}_XhOndpj({RW zT2l%RvKgGH$e4L)#TjTtLI6c{a2Oe7R0I_e7zCVAAN;@Wz99kghW{Z4nRg!doO`Of zs=C(i`|4YM-Sl7&dT3m6$M|mMZBIvj{1pB;@4tqBF zsYmwo5JO2;;%ns>`)!(-vUOng#Xp;mjQ@TS7ABk_5565VY~uQ#?pm?;!4w+by2S%O z?(P|M?7RQIH?8&JxNq<15pwkRJ1%ICi1UyAnEOEU$5(yy($d>1S>OF9X%IqFX(6PmvE)43-<`sRNd?w5;mH%3iT!#%_IYPPdd7KWH{NtU72+kAeOB4o0s=Am5OL zj)M#z{$7~zV5hqaX3bzBNBL&VpTos+kYj{kKPxEZ)+=u(J~X<16)!??%Mx?B)VQwq zbe=e&pnGy=*KQNX7j&6`>V8uSrWD>cC3!jvnM9iPMLAQa#Ppr^P)tmxm`*8aow}uU z?i`bv(y2%71A&%mZxKpCsAlHcQME0b|LBI>;WC2@!B4SJgX_p`z$%N%(QZwndy7=} zISW!9>E1$BK-oNcWwx7N6-bd=jshwD1KTo~OP4Mds!Qlt+4`QzPjmiM>oiu8tcvI? zr0}zN;-qx8+l;X9gi_O=3Zk_}78bEVVO$vr)0er;)2H0#=?j=m9j-KIb60Xn;kx1G3X$2ofY!<)qP!Ktw!Y6z zB=iL1S8;w>f2q(Nn8=bxa&rit&0b!`jV7p)$#B(oIvF{Y}pIk<9_szdru*?S40T01Z$d`r%z{_?&d0F zdQYI8iR{=KZY$9rVHIn+%CL1v9VuCY*ejbCL&GJJPL_r_u}SD zk-Ii~-Be%WwuqiG=fB9wm>}J(_=J0ni|FH4pe1gKhPV~2jd>Lu#?P_d4{*_#u`v&D zW7z3KTm;dJnEZDx9ZSsr3YW#6evs>79{D>r1IyO1`7VWIv*bqR zA5!ea9te4?^mVR@M+q&GOlt=B1u@_JhKu%hZ09x#GasnO)Vt!`+NK<+E%w?9AYw^}l}?Qk>en(-<~gE7 zV9Ht^QRc|#!y?rW=Ogl)>y9W{1XJ_7ua&P!Cv8HG~R_X@R^Lj`hW&B~ULXS`43ok-$XG zDAADgIs@a;x3~|W0mY6&f!e8}5=HrRjtc447cx4=-Z`Tj;?SpoL_U8J@V zYXW)``{b;W$XOQ=d#gx|C;ET0?KHJ!)pnRYzg-%n!=_k|^%W7xK_icWt`eludQ6%WSpCf^D8ipOOp4gAj~I$(ic znf@7SIVLodMV?l=68&ylqTdeY*?@=Dzd_P!mfC{o!&vWGYNTDue@5{Wn$CKkQQELI zv(!;U|A}3gr7nQFC6B0w;T*ABO16cx$eu4$V~E~?Z7o#&srqfMbhhqxCH9VdM7&X8 zr6YGh`WRPIdxs!00P+!L+HBR|Pw#_O0aM-@dBt;q^Gm<;isu6PR!^*^!*luwHf6RN zE?WWD2Fzv|+!J(`mCshk_>iye1feXXNDcGZhf3|CVX;m{Y9i4kHl|2TCi**US&^Cm z(|xl@ZARc+=jSI=<7 ziedc>H5CqohYj_(eJ~U}s}_?c)HhF!^>BQozdt|HIt2!@rJ6slRJCAJj#r1=2*s(L zD(I&2rILRmI(N<GfK!bZ2@s*TjecO@HumCBsWAW~=e+w{wIjOxTv?O1X@R z;PeOAFHL1*a+GGQq*NIJX4WUA%5g&IG*)dWtHWr(np;EH$d+8FQeifGEk-NDe=)UZ zlyERSBvw9HIqa))PhX0_N8Xw3{mci3A?v}Eg`9pGnSJt=e_+iD2^`S~8tTusKBp8B zYa!b*R7n6U&YZYXS?0ky`|gM@-MsY$CD;p16?$u&o?S#AxbcU&AL~a#onk;rV)KG8#76H%-sC4a$8tcrt+&3cspF4 zt>_{g7FQ5XofiONK@Q$MUf*MOWSK&yA1zqX0fLPE?!nuNQ%96ZZ?lQIy1O%2U z8$~-HP$v^y5%uKtHJBURwyNcdC&lzERj#j_tHHj@mn$g_jTg?kZ$dygW?tdxQj=19 zh1)cKsZM~#vl=NJuR`Mu_~n4cvz6{13*vbYj%~sQXDb=RdX=q=)RI|Ewz3pt&afP1 zIV4ANlp%yZ&(d;15TX#*jHnfaR;nWipCRa<=7K>=EQSYO1VO0L19g%R?45uld^69M zge|bSjVWiauUDNQ)W@^lLqQPI4J>V?l4u?os;u%5$US+)ce`10r?Q#!Mioe{@l*b= zzf_Q#P<}kglcZKEPhSFY8%=pJ8uB9`))mOF5ep=%9H|*lrkAs-QA(^trz5a)AjoKb zF-lo)%UKYuE!dg@B|;%}0+ub`pxnuV$0=VCc+!@!OduGshwlY{ zpq_1lcr6PnpQ|_yCC{b3Wzn$z0WQf5a7kUE%OzRYmrEMlct;xBM|9m_?2*Bfn)q8rK1Nz2J-(QJ0 zpzm@lPIE#ailww%A_xpLaHEkC=^%AW{9tl_3otTDpr|caiBreXC z$;8%R+r$6oZM^OQKM}Y_Yy=GL@0=JBEc+d$bAmp@1+G}hZc05aKE~=A$lvOwdJ?O6 zN159E>i{0+094CpB~v{BH_=$?cI7U>KP=m>jFGL;SoJ{vRuMbD9U=pIGV{NyY?ZBC zdu)(DnH_x>JY-fj<98@!X*9zfvpzX+o_rXHaU{U_`?_r*@OvTqw=Ylzm-H+4mmLt> z0TfK{d@ZZB_)R9CL8&BuBk{tYGWnf(yd=<5vi(>FwVZtRK(*327Q)Md*iZKYnnc*y zx35=t$Rax*p_1^e#P58>f|RYUR(duK;Cl2A+<6N7Vq|)Zovc=h!ma8;wI<9GY9gSi z033(zVDon>V+h^G4((KCV4mgIC{1RA^jlUmT+1csS+;w)7Rw5E zD|ZmRlzp^YX(L-tLbF&G^e5Sr5!&nQ4||l`h&9jragWlQ+bvl3;0Z0SuVFC=0K%-XpcR_Hbw} zvZoGK$s(A#vkY)8{1K{$^p?_TM`r=ibhc%$GLh)-vDJ5JZ3z92WqqJr#Ia`9K4lKZ zvRVD1(t=3exPTWcj2-*4vc3gu370}84z`4Yo)&h4YiNC8H?X)$_bU@Z^^e^LYN1#9 zev|)L>E|J+)Xe%s*$qlWe-?g7IVqwnh^bayF#vDs~76UqZhdJh1e37tuO~`m=t-_t`D}kNXNDZ;(n`0J` z?H&`d7UqMSSgksXZvYil{eXpOrl8>)VUvY`abk)G$*^DFCMyTNt@R9dW+5eVGb5T@ z3N#u8t2QVnGTR5-!fpk}Wo9Hc@(qD&VV)J6G`kJeA>n|DkYFm6?Wsy42gIgQb!O3bUbywslg=Za}# zY5PL83B=!@Nua_r5S^gS3e~@~rb3y1Tpr$*3gKvjJiI;JZyzf+=|F`hO{upTX!7>` zh~FS-7~D5~SXYKMMV_WFE>}kUCK&RNXG9VeKE7wUQaQH5NAQQ0Q(j30KJ^)!nhy6{ znmbyt7*u?iv=BQ@TKpK5YT%!-$k1MErr=f%!dzTnNk-CZudtMvoM(bEB$HP{kz|`Y z5{L|Ru~^Lv)jh82j?fZm-0bfODrfSV7mMMyOZ21^4WFB8yb zcA1?nS)dbf>??{C6p^K4vyeAbhAb2DKVvmY~@j;77E!1sCxD|YoA%b!I4;@1F=EbV?K_tsEGZEYfk-)@B$s~ND~8Gzdm;a>qhP&yx}J7wfaXi9mzc{BqZ?K4hB-4g#k@60X%P=S-}mcUbL&sK((=%?Zgef7AN~H3IG`RLDs~>dSC#O)*x# zxj1&bybErGJXrR=x+LU*1uJCo=`+Ey72q0dPved)Ns;IY9_C{4$LuE)-BqdS3E{&m zWA&CeoNw%H6^#!XCtLY7Yk9q4yv6pm5S!r=qs?1jx%XlTQDUyKFLnY!M=BHk*cP|e zTgw&%1e5k>@~_Z1Iq`tRpO9Ng#}cS)uV2#JF|uXM{?q7UOHJ6YK=QR#d0%Wc|9)PI z{7^|9)*&pQo@2!nClAC|xiWkLDVUaaf z);%0nBKRxuIdMCjo1N+3+2QWHrB{~A;xVt_-Sp*ZXe&SUh3@Uv{F_NDA zvrc?;oKqnKX8XRr*16ufmUOZ=>{AoCrf-_QI5#fZu=S@#k= zp|UzV0g!#M#+jVqO+q5F`H;{ODI`LL^lc|KGI9&sSRZ;gk9i6v-Y|7nI0tM zH9?+TB|tZ>Ik;Y+OCqNk9S8k}ptp^xK~o~o8(v3X zrh9a!5%i|pC|i>)MzGTZ#oysqj0=PB=k!hUSc?^6B-}oBY)0~Kuj&Jh0c~}w<9(8d zXQE4hIeWX%`gzWH(X(Fm@(M9N5>4=`ioTf_bU49=l=8wEDqE|e($mJo{I0~BYOKy* z5veZ*2=8;e)VZRGjLGea6w@2YcG& zVbjxMn4r*)%Hnwt^Z^d8e*_^P5A#{WquzmIr4P^2M~ba^mo1?lfrp^X&AUyKIzb$g7OS>%aYNMWt323Kn(*A&6{}*5cF%Wd)VmDVqN~2X zIxqVF`$*y4BL$>(yLDR!+o66#TM}tRKkSAtje^CF8^%zVM6tFVyrD*qS*@?wr4beDsUEYzpoZmu;1rmZ`?q>UD)=V{j$o(zQ(}=ud;f2L#tPQz^B&(2i9(P zU0lV+c-h-+yTV+skh9%RbmiuDJD5IayX%37YPY*CR=nT0K`Gx>QimaO*3ga|Cw}a^ zt}N5wrk5S?1$*c~CnDUM4W1*Uf(xygS#rQ9017e2Wump8_!bfxZnin-+bT-*ao`*H zBlEj2eFHgo>%mMr>RShR8uPPneEl2do}qwr46u)W@N)Li_q+Er!)BkzUjlh9CTqRS z+fMkJCtXh&*q}tIiqvd8+J0Xn@o0_W$2#E<4U(gd9|NRhv*V>I0g%s4Qu_C#^rr+9 z^8mkX6hU?W_wIY(xA(4a-=|wF$SD0}38&GaHp-rMWgcI?Tom z(nfOnXN7F}c4c%ZiVt9E0`HgsgyX_?`%SgeEO)TBH57&0VH?2Qbg@%#og88(-&Nop zuqLc)o>rEo2Y~OibD;dAI-HI!x^3%i-7>2lPRDw~#_6;nR)3b9uT_UznE_PM@7#gf zuz7f;PadL05r z#YnruKQrwvZ5gr3Y}Cx277`$ooR`zUrE;a3Icb!Z0taPNbLD7l1-t@nn#tp|D%p*! z57Z#C4s?4dvc6vU=cqfsbfW7vO}9H|N7n~xjnf>jiE48+3QoY19IY8B0ng=VPe2fF zxkHu&P)xalw7sD;)};;#XfB7cT*`yTat3SLLTQ+tt%@`?P#hpU8sZRM8%uNZQEhoW z!n3??(^hMCCJ%@~@9Pqop6(JE-B?FtG|we6YmiH1G{+{g3xr0y1Z3@U2?*xVWtjGw zhggT5?GHhtF5iB{T8-33G^Ym}-hITL8mY}8`iJi3>rdO8|099W=gLtUkHNp;HrF&B ziQYEgx@n6<+zyFS0;IE$XudaE8w&`iEj9(5hxbR!_(|H|JWhNwO9R)0z4c`_HMAS3 zHO`Q|x#Nz=_z&K37k65FZq?Zmwda;?JvirHaV zuC_tLgZYNXr6xYlU0?0I;lBUH*?n*G-iW?CdhNcKc&=~XYZ@egrJm7iucsB*;A)q5 z^p-k8y_PxZIaQOq8!r`c@B$@E=-|EOS05oThP@~G{Po?F23MzQn8ODJzDD-lk3uXM zup7<*0dDlwVbiF|8IT{p)~^8G(VzVG_p4Kh6^8~YW(Ya`8ns28V#E5l31cM5z?x=@G>crywG z_p7wCYRlZO(#{qd=gqjvK=of90qtF9PD;?6OSwsim9%BD7-T0x4mc znf!`StyL8YjRa#~%h<~2z+%EFeQBkby_oiK4USd#a(V4y)~^DK3Ag{*i#bBNzKhv_ WN(B5cQW`z|dh$bqy_UZ(P5XbgFx<}o delta 5756 zcmcJTeM}Q)7{K56JlpHF^raQb$54tQE1h6V<*Pb+pksozETb~X(8)O2 z+zeBPpgp6;p;K7q=BCcO;HGJ&(cqMTIzJPfsLLek9~zgbfP0IY1sGyW369 z>bonXNv7DcQzwdcd_8Vb)sbfR#gQp(k$)8IsVzO)H6^*sQM>-^=ilo;c=t%s`MHJZ znVau(d+cwl{;lceh0pT;sytsjl?kt{F^N-eeB2uL{5xMgHe}h4b^cyl`NQzt5q~?z zcABq!*c~0WaqSn~FV4HPuX*jR%%vUYrb$xz9HC_EQ9h^hK$3ZK!t|=ri?`MuxKL46 zHtWSnwabb-HvF8t=F5Xqbej$~F3rDos@t_Qec9IQfwx<)x~wgGALXB{&M9)=U|JTY zIUd?OqI!foH|J-cyHZkr=GUUEL+NPcnrV~MXMkcYu!Y9g$JPbFdt$4ahVcnW9HDO-i0$Y5Rt!Vy)jCAOac8p>-+9Kc zFPv8?Zn06SPBYJXAifWySnoExV7HTh5%>H zuFms6YtapFsb{!XF-l3<3rep@c38u3`#^jQxmp!)k1t$C4TQ!4-oU+9lBtzDZ=9FnEqR01W+eEaHC3 z?WbFY6l@s)yswS2?57sx52f&c+!V?pQB8qlVB6r4t^pv#C(^$J!Ws!)(UDd4gu%)6 z0EGIGJ9N(Nez$)7A5I#aiEYDun6K!(w$ll16J^O^1CTW}lIEKcc|@fp6KCw~8|U34 zyv{L!WEu9yIkva9CWnxbW%7*shi{%M49@f+tgV5V4ITrB=RZbb;uK^LMfp+UIiK>f zD7+7+gTu)}?GO3Ta4)%DK}MFDAYA}N{Eu@pVR^|+keEEuhkP=`xrC&={IG3sgu2{m zT9u?)seP5GhsX%y+U_T8ffDnn_JKo!X`SY(1)Pn!VP?wf{K8 zM*&2Wmw)7*fG&qb2h&6okX2^P#nO>|rA@FQl;*_4G?}st*D?TCTu0LuiC&>3GnN@P zjQ|*Zj0==T@f<~FEHirHNJsVMj)M|?3U)cfIzqCHF(&sj_LAL{l9SX0!)B6n602X* zbB1*}+;tQyu~XnIBD`PbFMDIIGz@9B@iU`ewqv0LS;ONJabge|S!Mvlg@d|FHzy_jlik~6G1ftOtmn&r3P!Gi! zg=`&~J&ZpAge?)u^^|9?5I<6xA(bbh_h^d0F8pagW}T-1^lsJs_!EU0@(Pa-Wk;`v zahHMSI16YcKbHkex#l>{E58Na<@I*-5d}^Q+EBEP0vm;G6Vb!QpTZENJO)V&N3}G? OHA&f#NM!4bFydcbgFIva