summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2020-05-08 13:31:06 +1000
committerDave Airlie <airlied@redhat.com>2020-05-08 13:31:08 +1000
commit370fb6b0aaf07c66a3317d5b35fba4345b31035c (patch)
treeb68550f0d7b340440dc4048ed007b59ffa563e60 /drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
parent937eea297e26effac6809a0bf8c20e6ca9d90b9a (diff)
parentb8020b0304c8f44e5e29f0b1a04d31e0bf68d26a (diff)
downloadlinux-370fb6b0aaf07c66a3317d5b35fba4345b31035c.tar.gz
linux-370fb6b0aaf07c66a3317d5b35fba4345b31035c.tar.bz2
linux-370fb6b0aaf07c66a3317d5b35fba4345b31035c.zip
Merge tag 'amd-drm-next-5.8-2020-04-30' of git://people.freedesktop.org/~agd5f/linux into drm-next
amd-drm-next-5.8-2020-04-30: amdgpu: - SR-IOV fixes - SDMA fix for Navi - VCN 2.5 DPG fixes - Display fixes - Display stuttering fixes for pageflip and cursor - Add support for handling encrypted GPU memory - Add UAPI for encrypted GPU memory - Rework IB pool handling amdkfd: - Expose asic revision in topology - Add UAPI for GWS (Global Wave Sync) resource management UAPI: - Add amdgpu UAPI for encrypted GPU memory Used by: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4401 - Add amdkfd UAPI for GWS (Global Wave Sync) resource management Thunk usage of KFD ioctl: https://github.com/RadeonOpenCompute/ROCT-Thunk-Interface/blob/roc-2.8.0/src/queues.c#L840 ROCr usage of Thunk API: https://github.com/RadeonOpenCompute/ROCR-Runtime/blob/roc-3.1.0/src/core/runtime/amd_gpu_agent.cpp#L597 HCC code using ROCr API: https://github.com/RadeonOpenCompute/hcc/blob/98ee9f34945d3b5f572d7a4c15cbffa506487734/lib/hsa/mcwamp_hsa.cpp#L2161 HIP code using HCC API: https://github.com/ROCm-Developer-Tools/HIP/blob/cf8589b8c8a40ddcc55fa3a51e23390a49824130/src/hip_module.cpp#L567 Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexdeucher@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200430212951.3902-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c')
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
index a19f359e45d7..06d39d529c09 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
@@ -27,7 +27,7 @@
#include "dce_abm.h"
#include "dc.h"
#include "dc_dmub_srv.h"
-#include "../../dmub/inc/dmub_srv.h"
+#include "dmub/inc/dmub_srv.h"
#include "core_types.h"
#include "dm_services.h"
#include "reg_helper.h"
@@ -50,7 +50,7 @@
#define DISABLE_ABM_IMMEDIATELY 255
-static bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst)
+static bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst, uint32_t panel_inst)
{
union dmub_rb_cmd cmd;
struct dc_context *dc = abm->ctx;
@@ -59,10 +59,11 @@ static bool dmub_abm_set_pipe(struct abm *abm, uint32_t otg_inst)
cmd.abm_set_pipe.header.type = DMUB_CMD__ABM;
cmd.abm_set_pipe.header.sub_type = DMUB_CMD__ABM_SET_PIPE;
cmd.abm_set_pipe.abm_set_pipe_data.otg_inst = otg_inst;
+ cmd.abm_set_pipe.abm_set_pipe_data.panel_inst = panel_inst;
cmd.abm_set_pipe.abm_set_pipe_data.ramping_boundary = ramping_boundary;
cmd.abm_set_pipe.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pipe_data);
- dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd.abm_set_pipe.header);
+ dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(dc->dmub_srv);
dc_dmub_srv_wait_idle(dc->dmub_srv);
@@ -120,7 +121,8 @@ static void dmcub_set_backlight_level(
struct dce_abm *dce_abm,
uint32_t backlight_pwm_u16_16,
uint32_t frame_ramp,
- uint32_t otg_inst)
+ uint32_t otg_inst,
+ uint32_t panel_inst)
{
union dmub_rb_cmd cmd;
struct dc_context *dc = dce_abm->base.ctx;
@@ -134,7 +136,7 @@ static void dmcub_set_backlight_level(
// Take MSB of fractional part since backlight is not max
backlight_8_bit = (backlight_pwm_u16_16 >> 8) & 0xFF;
- dmub_abm_set_pipe(&dce_abm->base, otg_inst);
+ dmub_abm_set_pipe(&dce_abm->base, otg_inst, panel_inst);
REG_UPDATE(BL1_PWM_USER_LEVEL, BL1_PWM_USER_LEVEL, backlight_pwm_u16_16);
@@ -146,7 +148,7 @@ static void dmcub_set_backlight_level(
cmd.abm_set_backlight.abm_set_backlight_data.frame_ramp = frame_ramp;
cmd.abm_set_backlight.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_backlight_data);
- dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd.abm_set_backlight.header);
+ dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(dc->dmub_srv);
dc_dmub_srv_wait_idle(dc->dmub_srv);
@@ -171,7 +173,7 @@ static void dmub_abm_enable_fractional_pwm(struct dc_context *dc)
cmd.abm_set_pwm_frac.abm_set_pwm_frac_data.fractional_pwm = fractional_pwm;
cmd.abm_set_pwm_frac.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_pwm_frac_data);
- dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd.abm_set_pwm_frac.header);
+ dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(dc->dmub_srv);
dc_dmub_srv_wait_idle(dc->dmub_srv);
}
@@ -250,18 +252,18 @@ static bool dmub_abm_set_level(struct abm *abm, uint32_t level)
cmd.abm_set_level.abm_set_level_data.level = level;
cmd.abm_set_level.header.payload_bytes = sizeof(struct dmub_cmd_abm_set_level_data);
- dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd.abm_set_level.header);
+ dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(dc->dmub_srv);
dc_dmub_srv_wait_idle(dc->dmub_srv);
return true;
}
-static bool dmub_abm_immediate_disable(struct abm *abm)
+static bool dmub_abm_immediate_disable(struct abm *abm, uint32_t panel_inst)
{
struct dce_abm *dce_abm = TO_DMUB_ABM(abm);
- dmub_abm_set_pipe(abm, DISABLE_ABM_IMMEDIATELY);
+ dmub_abm_set_pipe(abm, DISABLE_ABM_IMMEDIATELY, panel_inst);
abm->stored_backlight_registers.BL_PWM_CNTL =
REG_READ(BL_PWM_CNTL);
@@ -338,6 +340,7 @@ static bool dmub_abm_set_backlight_level_pwm(
unsigned int backlight_pwm_u16_16,
unsigned int frame_ramp,
unsigned int otg_inst,
+ uint32_t panel_inst,
bool fw_set_brightness)
{
struct dce_abm *dce_abm = TO_DMUB_ABM(abm);
@@ -345,7 +348,8 @@ static bool dmub_abm_set_backlight_level_pwm(
dmcub_set_backlight_level(dce_abm,
backlight_pwm_u16_16,
frame_ramp,
- otg_inst);
+ otg_inst,
+ panel_inst);
return true;
}
@@ -370,7 +374,7 @@ static bool dmub_abm_init_config(struct abm *abm,
cmd.abm_init_config.abm_init_config_data.bytes = bytes;
cmd.abm_init_config.header.payload_bytes = sizeof(struct dmub_cmd_abm_init_config_data);
- dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd.abm_init_config.header);
+ dc_dmub_srv_cmd_queue(dc->dmub_srv, &cmd);
dc_dmub_srv_cmd_execute(dc->dmub_srv);
dc_dmub_srv_wait_idle(dc->dmub_srv);
zf '> wTeߟzh^Eݥ>}>Vɐ lybg |~x xb6f5 \VG|r +% #gWPPJv`XDn%bX#ǻ%8v;/ D MǪ:YCJ@8W6|d9N˻O=XEBYxRw6yL7u8q"u/!tU 6nt"VƵG fe\.P/գjxKJ% J.xCD]lk+ F*;Pԅճk}>nr[ {l¢(XcT@icw9wY)1v1 5X'kf eKx cTA~<Y{%|{';xaioQ1%4,c!y[O ]2ґCYezS #{üzff:)Pmq j/KpNvх2jXKA탰26)aOJ8At!sr<ֺv%qB o~j/,u[yMo4Gb:d1kq^=Zö2GN5 km~b 59lpkqs/D+f]HJ汈ǃ2z?kp)A8ϟ@gx@9`(yHxuC]FDJk8AZeʩ-X2,NGj|ٷXχKũ)Ze6]Qf/ 2`ƣp98QN,5DžUZ7(x뻔v[).m`M3̂h1رbq)6:rAlz S1#ldrpU@q!p-&BYJ/3="!նm6 u`j0*C/K1/NMW@o#I nYayAN٪ꗙXGU׊$k씁\cKeG`lٰ 8{|9o0~ _n]cVGL|wǧ@q8yd,{Q>^ ) Hl6I:ͦ0Tsyxu)ӺꀴP[ʯn@{`qnl};gZ[9y0[l͈E !X  % `9Ȅau|DI^5(LgB-k wIVE,ɡPΞww[8)N;3mI6ts9f1]c.=> g$a/[r="u,{'g>TY zlc6s> Η0NSSw@Rҵ6h; ѡ0瓤:^96tpAR9/ϕzy9q`0sp9&cnWxv9fXu&~^q{STO2gm{&3h FޞMϟ9EݭNc$g%=36@+iOϠT!qD .iڽ&r/'jUv{[I},k#q5]dΔU0~<Ѐpϻ]Tmjy@Jz&JE2>*L.V۵U;פGf)GTp!;p㺶qҏ {e^M N>VDKP z V~ ד"vTHlU3 )pQUT ( e \~[-fv쇱%(NKᐭr <; |~Ȁ eIN0on)~^O &u@-˗E퇻::u6JY+D` 8I/vt謓.S[^+n ks6WTD 8ftwrG(EEE4t$cȫi+%mޫteᘳ UF/@۴dDqo:bCd**$fBf._ڡC8Vw}2}0Ql3a#ڃBeFbp`vRq<+*ABIןaz;֭S'eU2("2 IeVY+)ϟ-Fn´uz>ὮA8|+.q Et ?<>bꎫB mJ@DU4QӃ9N~9^-䖽]Idq$@nly#$B0OFՎA5éPp+Ov>O'%zy{׵W V6:n3CoT ӳ;.NQr iSyu'+ M!.~/a''^qn\؁Vd/zT\o!rw5]-ܼ)zc_bsz&%Uy/tF@1K,}g&y Mr@ n{k[έL79 ptHo~ d.岼ŢTG \92U_6 P .YO+̫l lmm~8∃+kJmAipIS^>5RSooi4+Q{ W7m~۶S$]?vO,y `8?T ؤpÝ"xҁ-Vx{q}v~yHQئ=VHCҹr]\*yDbHH@aMSP7˞| nkAt`ۭPKt?s vQI1y =v w eDF*;@{=߯!ft4&l.8~F ;g+u,Ê) DxGAi/0a"udG}y uHih,NW ;IH"FRzaNhQAp/ NShOg`$I}NVk6]P $MXD Cetq(GښRIr1m'$="Îm- DP  M}]2ly]Љ/{8~t C<!ߞ׋7 A@yz}9 _@LwJ"p:aN5kLZ/{H+,&WZ _9|u᳀5bv_޻o IGA )6}?PdWxv;s!AߦA&|{yZ%;3%DX18~6ϝĹ/IF6. u<.܁ݶ^U cc]v|5|V Zk'7_oyECFӋ;l=_ϏA+d} y_Q {joެbjDo])Uȍ/+8us},w߽dZJ Fa|9JxV2j&`WG9o #xse q,fop<'S|6.HhOT/̛2Uc M3rۿPj" uڷ-v385û"9م3Nqs33r?¸Q2tҜjZN2 ZmUKYH!e)(2`9jαMviBoCzpajxk&ox3<1v];X82rpgfY\cj{4K1ymrg"`-Q^@UXt9ãfIoo9xٟ\E\&kTcAKRu ?7EL'ƹ!ȎHp;tI B%HQ9aw~|JI!25SGu12?p40$+զ!C):CPQs i!z@Oku,?;Ky?N034rZݪh0,zyA3tx%&7˯=:911UhןCiK#5R95X(,˝3.rxc4 ֞VFO5Ǔ't睈?GBI_ᝍ"F!Eqr>R҂'uleda!}((fCvF gr^CL_8as,G6g;"-xlG%koK)ˉ3bjz5u 6edWf_=Dm/N30O(_?9tǎl}|f?h~{ry}mH>i%^8s0=>Bʊʋ;wWlm >j|";7t6?^\6BR_X/Oh× KppٵMB/~Y?{:/D3Oby~f+;8mEi^AjB+eLRJ'Ъ En+QZ*מ2 ]{[s9Q2v* Z+./^ґS"2xVo 8έ`D0dt\ )[M~ bXRܕB'i5b4 5I'ǩ-2X?9 r"%\YOV*| bv0]V(, @'A04!GD:nrU/kg^RBZpi؁}WUj8=iCv{5*y?-o-qΨY2zHHIH*c+\s9>A2"=ڮ~uU,ae0"xTW}u˘q mw`n]eq5tʄp.swiqT,{V JVȥ`!q*?T6vݶ{7Y PQSlajlj8`jU02ba&WS)>WKÍcx\(5k"~! 5?D ɕ٨RXF%P@  >.ΡϼAJd?NBχڞ zi~: OT2?!%j0>ŎA}#Gd}جܜISD= ;<</.SHC) ENr* eL*|oh5@L^qXq)r."$\Ih9"sڅ] ,:1|$f(>-DFE^ Z8LΒ*qs DKz)NKɼoaxwc ?w7Hw*'apĘpeR}h2iNeb lG෨KAnBA0O CH݇VC*w"1 pf?:Ԁ_.ii $on(1sH2O>pE%8ut`ٸ,OclЙWkv~BYKсo(9p޼/|!lv.H"7}rx!K!uO꼘d"Ϛ;vX)_P 0h4-d;qۺvbu<\5 mƏ]QlL &hB**DJSR$a5A4"E'V^4 Y KuFV LV`<_O槩!꫷Û2G꣊?Y횩p>&"{Զ:0ure4\$gкQ&]ۍn t?G_o8ȃ3| F? s4 ł.O{ܹjAڴ{7K`*Ff i3\7j^ի`!óX`+;cl%ǺƮ' O`.CTW}+LxhAyyxV[ºLv`qS(UF v؜d+ o0ݿWj@(^a8Cm0 7V nV3(Bo5*j<>üُ)W9n>Xa}ɋ* @0#$k{\j}7jpgh]M U뒽a9 ou^k+ 2,N(9F濕/MR@5X}.{(2鹼!ГCEu`'S(NQtmZ&l֨E~2j1qAΉG  .nLKKU='0Ҕ'9‘(P+*EFbQHa{} ƝidL >~(%sɞ 3.Y])9dtfs&w>(ίT@bRS4/m9fw<].JV*NJ}jַ8XZcݿX\/,|K2Gk]Iv~=Pa#p~:{`C3Qf̈́S<"ΧAm wck8JJ|IA(~rvٯ‚ZՑ| ߩLDt#5҇cxr T/]R千_ͻjW{@WȺd{E g K uCS ypz8!kY4t~]W-XPfzxg0k Nр匀1!^΁_vqveyW#.~Iy9gmEJpPI-耼0|¶Un7?c0 HG{dY2A (r||@Kh]ɩ!ӹd ;0؃A4n``lT) (ɴ}v{'wR,{oɨB^D*7 J`Q)(?V:9f!/%m>ۺİzYL+7~8l&c5_3wgSuh (%NTߞAnqZONe87zN[{Hx㦇s7;7q}W<}Gs<jN;Ӝ"z'I/ݣ'OdGY.~Y!L9Ӝ⇛KM-"TugEEK ـ 9mMHYV]Yz;,ʏ@/^GAY_B߂WW#o}#4RT?A%C? !S@DLo182~8K47+CX~oc6{MK@O jyXY9ڜR!$>7oY>) tF>ϫan˜j*8>. ī!ل BVzRd"} ~l>,H"+sq¨_k|mj_$|u&KhgÜ$vsIێL87ZaxrL/Sz@LL?Q07udOiɆg7'/r^0aaz_-7Luٗf'|^r(9^9ȁo ]4g$z']Wui 6_G NC6]6>6#;YKvwyfEϨ&IrbiݒJ`}!#/<)˂V\9Q̟# ( ) z.L,/_kFol{XtUO|,}۷k9'KG w1YbvVUƧ9,X3颒Ѵ9{!?< te39:KʃHѳl`8sbӵ˵Nm]yua|} my%Ktf_M~MΆn@+M "]4tL3`uEJI(ln:.]פQ*V}ݖGcnY7J߯h*3 a>+5ҝneZdV@{:XdS |ƮVzB/c)hu *@F_J(L3sC}A,uơCC~vJ&[n9#FE ~'9d5ǜC矏IF1uKNo\Gys'C1t |p1HZ0X(p>R׬gjE*^DzNw)`OuS%ZOn07Di$cNq,Q,Yhk;/{שmWLEBoƀIC%DA#Iw~䥶p7맲ىvmkN_7<5aX3FH&#%(2G\aXz1ͩ˅xAd@REE?PRgPY?ld xQ60{ͭPҷ \Tu5ުD5juGxg *Ӌ -D r7w~NSјKYC~^{Yst]=O˾aTV81od_[ŮRMB qn׿m:E-KVy(G ̈́E.~6]~ oƬ]R8.a@kpaۆCQ/Ző-#o ); n:zp%Tߟ%3Qb!Ev F zDТ'A2ICD{O\,Ga9kiD0+ ь`VI>]DF|V:7ʶiȋgnk%6\c6q0( :>SjЅps[Zw/*+0+9rlf4`G1ϟTQKx5j?~q_9͒0x2WH;at CxJaB9Q׉Q}3F_j.~#뾡 Y ÂJP[cSd#욪OݗdΪ($>U"-\y: Ug<_cըeCCSxuN1y2 M ^aP63bҿ:]٬ٶO:Ůhq_nh-"{PWB-cAsYܫ9]CJ&&eudSGJN'O>ư @[{r[:==!vd[|A+J?5#e_n)8qLAS1>l }TcT( w|0tO6i==YI~̙͇ FN -?5v#N$0PQ\bgy*X0?V}t`9~|70奓c:6}cv8r<* -Dʶ{ ƾWpwQls|/ &.ϛc.!}6g3~ܠ$KțjLow۷;sg0L D\Xc`m 2BFH_=xGC~5 Z.|(Hs[6?bϖ :t}u/3fh)\+uYSw5 kuaa즫 _^Qh.2tr6^w3D ),E?U8 (-K3RB.RN$~O_V7Tp.!۫>9vxf2r9}潦R AV>~.ַs sKiEAzf'gaqerjO^pMxYllkVeUVPGyt|xJ>zԲKoY1a%ܴUc {$m,Z."C,(=PAdr%D}o [%׸љsTz\S5FFƥZj{v񷩞ESE:$ۧ+He9ktӓV`lh3VQcr&R#PEW>3 wHKN;ꚅǽ"vf?ʰ.۬I]XٗM[CSqGجGZ({h?k M9-haپ]1fB!W@ZQgs[9F Jn%s ÔKQ:H+uև-S0^ol&sE iD+݆oܑ1 -$;w;[ &1ȥR"~&Ǝڙ]d"M>~sAw !@|wmDf䡢-( ,U(( r_gg ; \Z;n.o{ |nRY:,[@zeR:ǵQ~?d TU] :5_"'5\Nl`eܢ|Q+ۃ2TT` 1dIL݋HpݶbH PEppw}'?zr8ۡ (_FdPx/>ʥg׌Ou"<_N{r7-D #s)UI{6{17z2R_Eͺ`=+)xA"h& #&5c+Lл--ܙMbQ%FU"ݖLh"Qx߽𴣂)qb̈́`c7Weq2RD#i<|Кp M.EXt"0>՟zS>??^34I[GH2dgV9Wh>uA* ޭ52|#YC*_Or@2A:~Oj^F8%0F@99& 6+KC Nj<1Ef#xtk3=\r%F6:WT1He繁YEsƣڠ|ۤ*jab+먜o;Φ*&6TϾlvM/ۇQρS3@á35#=soE;y@ t/^5uBӑR+=jfNn`{4! EC%| Gp|=WE0. #A~_'`@Mgp#[y$T4_ݫ8w^Lb:@*C9{uu)"wxa=!8U"&8ìTb`Id',<=tӨO2RÛ'Zۉ \mY*%~'[mj'U%i1pVbzpa!\=Vm\ɗU86>3w ]g @jQDjb@Nh,aN _ww+`"xF&ΧQȥ6^^an,]tߊʓ)?T]3ҢR{CЯd-UI1̓1{2C95IR'oD`R(ب[nvQ[K`~9 ?"_p|:g rUTxf(2|\F1eh%15ߎps'jPgßCe5# AEY&ӕyػ;D)RDy{Ai1ȈH.g3O:"ǃYU3r^m.SQns "RD5]om P>%~~bTTrC=̱?$W9\ F3a=S2e^(&HF>K'$ Ou=l^F:ޝB;!oDxZ*_XS*h|{#u]1I-}|v>B9`tOsW '-K*s[:+)'T8G>>)~?L&>c1LW^b_x;:;1 p; G~CYLkg;}iBuv6tK- ޖ] ȊBpwu|ZӁ񈋓s+ܭ=xְH UhC.!ݐ%_Էq->mfF04oGQa8A|Qbg QT~^(dLox#;/N=@=/sWqr(#V1ˎʽǚERLsgT`kv/O9b̎'T[g\5,0bxܗI^L3WTRNN~(e OP yvHIj "|Acpnj}t?>7z=aϝl$@Qa :,e$3\;17z\"U[g䗘ݕF6l\hM0UMzB$2%Y0\GtYS[ 9-!9 {Ct6b8ኜ49uܤдOA}^t^B⻄͒'DJ 7 3({n`}3hv÷\ii´ pʽ{4`mGkrTa |=;W~}3HJ+5dI,?Va?2I^ڡMwPϋyq~ݱ_*1yPg*eB TA/$(%r1'XfP !ϓ|Fx"58dؖdi%jbn#-+jNx4V$$tfNhB9r +CN:$LQ-Tvsr]P֊( A,Fd][&hfsr]bfZ*wr@P"ĎwD3vcD{#x3Q%S\-o?4ChNv?W)ppde:!wyIϵRjԔq¾|oϵ,e<;:"G oej-g8 r Ս8hv#R j"dZgM)݄7^5 tA';R`iv;yxK;~SLlZӺ SFerc^$R. ;ň'r?."!_,0$׀$NQ=߬C7osOQMuNRbÚ-ާ3K;a$9s 78o`F13;u{~raBmOHk\֝..yp:qud%u1o15K+OjiTÝ[EUCw~7tw>S 簼Fbk3>D^suv8@&):O p|5DɴQ1b1Xs1.>rL1\4 vI52D?I,ΜNEKk4bDk>@cyFad{R8#~Bc,Vĸ(@14/iv\V_idQ~6Qq_et쭆?*ATMZ |J8/ƳLRz1>d_,]+f  b=Q,`Lbۥ<}w_E$ 9^̘՜̳d(G0 }Ê OU{No; tpW&*sB޺_`7Jے0 B)F5k (| +П>֩eRo*LM*pey=!Gۘy$-ޝ{5ώyE o|r݄QD)j0xSWSܡcŃCxQb1W NzTtDm|YXsmTq3=? 5!ԛo3cN@!Wb(P+E%y H+R7ukD.˟1=<#ylu5j~ۤ(eW *ɡA@7l( :[ |a1I  rt= )/ɨLO1Z}f +Hm,HwDD,C5^L0wy<-ڭ{l4MZ-z-#$"\yڱڶ2[?Qcwm JT9^ _(1Wɛn _Pq xy,X\P{^߫."Tm 5cgdlHS;i-X9 lr;t~_59?"{r{GQDB3LB'(ЅD~Gh|-77!4{:Tzceܗc|}]}3L>ޝK}:Q1Ͽ\S*bQ+W=AÆpP73?>:DL9G_JjQ!Cb @Na_:@ܦ3!tXS!0e0ih~Ll518YK/4BXzd|͗ .ڨ6{s4bRW4( $w\>fUoĉ`32*0AH`ڨh&Qt *& ;8pkKf -j JS} \OvAňh{2TXǶo}qm*A8*#!);X91&: 2ēD) P9r8tپ}i=z54aP uw7>"+ P吡>?;i(VI@5ȽH.Q45ŴuJ :>1bCA9?:ڌbzIp*gMQը iIu)2|BD7OA0@/]]juz++/De~QO?ë!Xf7ցAkTPbCfS)1O˺j`B"r3qG5j\iS_v!cK9nj;_4 Sq~ bPw#QCpq;R4`, h‹*C8"@R4;$’|%h>DꐂҨɗc5Hd|jɱqv|v|qQ"ߧXAo矿ӪMT<0$r`8JXsWl*hXy`t UHQ_vy)ֲvI.`%J'Q jԛ΄ȨDL꟔0@ec[#gIxv҈71-ҋ}o'! SPd<2K}*+5H0J2mNX^hW,8waQ,(T:i^I=fi|/d?OW[ԳOA+bؼ+blςPazctu fɇ tq҂8"_&! sOQU; yx0T}d?9JT|^ͯ]#OuaB*/ Oؐךu2BL{?| fwr gKOKܢ0"AׇƳqvp|K4+]?]w֬xeA 1=??k+S'rߘeEx!:F`C@aˇ&hPI RF܍ ~Ý>p K T'}5V,7 $t'(liш?kJXt& #!Oau׺~[E?Ø;~GȸG فme3r6'mҕ E" X/rBDBL/T'--$xүN] @z\m#;yUܪUQ!iyAF88! }\7я'Fa$;w\HoP."&٭g1*>:ω%TYO0j@(s\矽\ghL\(Kht,H}mxڡ\JY[P ۯbN&XaCD(v֏w1[숈k@EBq\:n$˂,M dx1+pvC84 5f>\CCh3w5=^[>zǢc0pbyKʅ8Ƕx$0 ~аv憹ژw0>.:[U<ڡm.xӶ߼S bPvN\GΖ;WJ{uaeûW,V\qހ S0{K9!? վᡊM1MNgèBhx2Xq|wu-t& OcMSkJr@@-y»1מGNˬb2Rצ"38RDI~^(39bAܟ^QE:LՓ.6flDau!9C1BٕwtDWŷOWU eRod3铴O1E GCtGt\o8Ykt+s0l~7lIͫP;[831"8^%Ú]ܙVJ7<K.JM.9-nͤ } |#h04F1{u¡SABB]2Az$9c-?cMiN?+$K9w˼E6 u],zqp5aɖvB1M3]h_S1]w!GHK1c"+̏ۚW'"',Wʅ2'5,4`҃SxFum rdV3=qJM9ToOSu5,x~8ɋƎˉѝlŲΕG,XԙWb-w[.J\}.k≜Gh't{ac+OU߼I>&SCjS&M.8E\ w^in/8M9|N51%75ޠAp(DbBӬ`# rEi]ҿ2q') hhUUCuYOGԹ(z4 qtL|EANӜjX/h^ x:oIũ{<-XGcAy/w 'Z\ɹTݲ/Vb?Ϣ;Xՙ#zg+F95M؃/x̂(c`VM,J}X-kKvw %\x2ofjFjJwX97aLon:yMb->;愑SF*bA[[5rΩ2toO=9|jkxז*xXYZwn&z9썪S_k\֟UwDl_qn.!,*ńcNvm5&6Wlѭg[]t;$R2.CSpCu<=QGȱgx5Z8x퇥׾co9ޢ@-V ---)1DCV: 3gP?MvFLҏ~ة'5g]^eULVf:7X{ jYk|`M9`uKzw`)piQ>EbܣOq ,i"n^;R>ަ9uM=t#z$ᵳI<9ccտXD#X㯾>=A!1P@[>lЀQp௕̨p}9m]FO⟶f FV?Ct'(-lw*BZ7nQ±B\%_aN4zdc__ղq)u Cm< ˂YrK<"k9ۘUiwqC;(KWfe[m#s{D!UVĺΆ=0--$k+dU30{|3u)W|{1j'(D"_ =\2tj},^@IBQjkt8i$S~pS=Fّd'> CesHIV"oP|`M ) ꡉu}ޡ f@jyG[X/,x6j]hj1M UT+ט&@AWyFLɔVI%5.8o`M \8w@H?KιDSl5|WIZ[Qu܏8"XvLJ0Z`IN븨 yk86pk (XdP#&v([g8"Q Us?yo CqDG3l[" $)"YˆBds;8pjG?a+wyxt_8R|%]Z vGQ(XpȨ[V`r' 4 a6ސphS:1WcaDΈizA) &HUud@wc1cq4˞ZJ~}'?p\-wD<]Z#?WM*V?8tH^VYNUz{h?y18PӰj6*6: }t0ju0J R)D(?9vP6p؂{٤( 'ִ@BUl\~t(ֆtY ?Ci9&fg ")C&Ϗm6ά}vu a<Ve&}Y EFw-pWaSn=d~cԮ=D6l zNCꉌ'i 3L\wuьx_ if]N UX8 bp+fxsvlTȲx$yk IyZ$PDߏC](=5_|O;06Q.wv!za4agTEL&GLF~/u[$;~gfb;ɶ91Re5=V*Kc>szOsPR䵌6ämq8IV}RpGMT&OlU0Qe?,WjL zz/sR>VI@3ʼ͋>]њ͑^ *Us/{~AE[2rz];;/kGrF-(u-L.dIo@DBrȪq9(@JŅZ u>xWdnL?KGFknqP;oe) ܺ/ң~^U;DDn<&""ہ jc`EOD3J;s#,A+sQ "] Dwvnd9n;0 tF Tpi% =]q0A]pw9j>k<8j)f_8ߔP #8>LƊdQ}"3+ m/x}=LO=r<Ϗf"B gb!Q^t"'р1`ma9>]4|t *4/ͯ iۯH]b$G0@>8yM<ץs^Wx#Mf~?7wpv!iBk"a)(]4cD@Rfbt/=am\ RhmPjiZ?ă?ʕ_{5&#- G D>~mcm DN'?g'點 {&ߣo,z JŞGC毇TUUoo|~^m] 6\)* [ x;ŚOǰnS &]c6<]IdYL+TV5VF$_8e|%RV \8ƫ]b[=_,;sKdYePGTB^R^ -%#̷d3SߩY{-RۿBw [-cϛ:.ZH}%Tܬ)Nb빈;Jf!J<@||!3_<*UyS1 x2zO D%=Y]p⩌P=0NOǺzH1?,3_6r(.p'ѮPC,[[o^Y㻳ӷ)# bOEvz-4 )Ѹ]B@IL)D8wm P§ f oz0Kۖ|O+Y9DXu| a@ H0&p1̗󇎫7sOGw:.\p>`\B] ^⎧WZcM@&A c5=%>>D}8Yp_ Ukc 迼AJPDZF?bACF]?eQ12W<{ 1+ğ=Bm˂(-@H:>c?!ɒ ]ၲR*@C"0p%&-ꖑl IW^I ;*}ry'PP̎ XN_4j~4tl7uX닇gS]]ҠN߰ l/ݔg  x G\zg պNf%?bU+;{Q>,7wyym[&өΘϹ,}:5Z0Ⱥ17 8DS?^h~Q( 4 Oᢩ?ÞNإc A$Q(*8Qt*ū_/Jdž˻g!>7]4Wy/]=xg{ 5Kqq9)vsp%,׫@< A|@}ږRu/NR7k/Z5pY^{`B> /2?A,OԁNf>r0Tnǫs9Ozs{.Z|fksћ*o_?O5#sGe."$EID;8C$cEAm Te>+^>2bgiȳW al(YFhnԯl׽`tz0Swn E &%uGlzg8X՚?̹?Ԃ cr8A1@\? ""9o¼A_XwLN9Jx9s>&W@}s;ĜS6i KßBG=omr}'C[O5?XONՍDl*W9ÔF-p;Ux[{dQ J*8s4+?k{6jr^&Vő[x:Pkĵò;@}6͑?KK3nZ"3Za{Vqa',СMQNBbw9DpW;^#9" *tv !^@W-HW}u<ޙ/|%"c':RJpw'F77R`5[\e'*'+ :H9w5lkjϐ<*BLhb2"h`)akӦm u5TO?U^j2+5IROԛP.l\=zGw/-C,1,6G*AKQ'6|}xQ+hU 5Go~˻lgn:jpBso,CLu C591ɓq db0xxca̜_I&&"UEl5w({gˠS( EO7O#ݘu V7g^Cw2nl|[CyB\@:}G&0o&dsq8/\Zb;GV+a@Nu~(.1OmtQ9CuS'=C<zsOȯJ|p) i T>ibL2ϔRb B]t;؜aȄHAgln4@HWBeK&w~_W͝ =*p0P QZ߶HڒMsI ex" 7ӯ"}kE^ 3!0:}@6cw=ifÞYo lJja[=Y !dvvkCQ7 vpe3 }ތ/Kɬ,ZptԀkD{5Hj@7܉=I9idhDDu9.jY(@.@06EbɽٛKW;^uՈ5 b=6H%^1ڽpCQ;EpKAs!zdcMaW4sN^9zBDc`{tU,]xvu>۟a`=*%$YYl~ۢƯoUp5֧!ϫkzؾߙ6/}>3X t~E$AWe4,\B6쐛ݏj35.-njzu][Inv; ^8YpF7؎3a%,V@svg;'S #͔ ӕx+H kXԕ;dx5z\b :n* C}W4wRb{D0X}Sp zxҌT﫢=MaJy`pL3W/t7V4Z+EoXhrMx:_}礜8K֮6y/"I<]`Fb\w m.L~9(nu˭̤F}sUI뽤%?Bkn|9uƨ|š9HMen UAu_!J0:w>fUB:L '!Y`-8F+JI}8%e_jذHǵvw{Sx,;l~ R}ֲDeubU[a5i[EZM_'28_@z-xp: 9&Fz[ߌf{*GmĹRآnQC$U]{+k) ҊL3Ov.$AF6JMpqU*?MSyv #/$w%gNS.*1jW^-RnPЎ(dU gL3Xlu1.~D\r@-/~>: Z݊3*Xرri5~.6. _˃CqoG3k6u*vJΫ7.4ZUsDQѫ JUӶ YRNuQ0mYBeQ7P+B9`{ĺl  dDUұHɽ3ю &Ld()jgF~6γ555x`*l* \]ZnU9l,'wV~[(1E}ٖke }kVsՉY33&(H,`m!rgpq7٤V.r[^ =l!! ,@Z[t1N[uX.qp9RjL. o|oγl3YbLɝUW [=& 7ܸU2& >h=jS蔾E?9Cg:1)`PжO)hevW'x,3rUQ\H͟ڎwVf.,̂}9[dm7vd징ǿcf ֯A@hglrBB0;`@Z'"wV0 :c tYw_c~X>G-=.@[PSDY;s[S9%vQ >>W;P97>n@h"(w>O?=)lykvՃy*1PaWG$ˮaI3bx<1j =>#6 MAC^yP_՞'hG:( UJ] .r& B59SI2;/I\#N0{57ȒQ >{7\,wgz#ڪRD3"0)Iǘ:ȂQ<=! =3 C"zH>#X{H/A°ǜwy!I9"~M\)Un#:[dA>vwrT QfJ//1aŀIJA'O=G>'S ؈!C$pd^?-2 -9`1.@I D:}yE7gF8fKK#wf@1[Wk,8xt0́.b"ڪ0tI~<׭Iĺf^zO{{'_7'>tc8Ʉm@72S)\i f PdAg:Ngxh 0AdL#ߵyǠNqTyLS(k?_;Z~^'oϖC(f@cgCsϫ_CYa_ڀe{aFXr@4|޻p =$:9? 牺wKu2xkjn_%v +RF Bbt|6Vٌ>%BϬ躆sKR8e6kZ4~L\&딚U(04Ogѕj^J˯/Le#KXbdoJUؚA HϤMgzhRXibe@h$6KG<aJ:(vQ^G0ΖYըd sLLsg, 6~ܬkRs<$d;g{$GhĔXiqeBSedYx]c=aUb@$˝TXM(z=q?rN*gj<\8UǍ`0*]+l/#ۼ_3hg]uxp͐? j')͆*IiŤ籩(ogY1kQyAoƠ-Qn95~Y  I*Cv  M̷M2"QB@ 0Mnz,C? T~WA:写G6, ܷe1g\hmYY)`iaXjeG6կ[^Q91рLSP4ਉ_~2Ϻ??x+<6$ ٗUɞ˧)<)B&e6:efuuuiuR v+E5,%KbhZ`n(@"Aeݜ=֥nf t.;Iʔllg٬xscF8 x#~0).qA^c[-1-rsZw85ۈ0a f~$i1SlbZ"b2fGʝ6 Cab# &>9*Y+ۻ[G3R4@}$ ҈Nh|9/A0h={Dz$a=5_n2M5Ls:jb\=(k79f!fh[~797͎/k9NSW&RPvgks 2AgG/'z;JmA [:iDQ$vڬHnD3ڣn"/Dzb(h bY &1?'׍NYr2𪥂žmPUMHfԘd{ 1c`^$v` 8p`tYL^7n)` "M\r (gᴎ!71.TwJ^zQ}UL8aTs]}Y/ǖKf[g޷r>Tط!iR U%='oQY+vO!UͷGF)+}(>Vk.6@NK4=Wٵj{[{DѺ~XKv{ 6Xk{y90ߒGEauz~"0^)ʈ`qij?}+=WퟦU)óqiP~*_289(!l~ݳ0&Ό~+ݬod:hB6 @XlJAڂl;s>d-ONZiD3^nB<Ǯl߰3oCw9ٞ<<|d6T&bI&9fwTw"r]v$Oѵ\ܯ:gEn8O"붓Y$Z!@hߓs46n.OOuV(kNkXW|9=y U"Ow{W{ FRA`Aޅʏ:HbrkY:<(D}'D^Ii$;8tLw9'~;ۖLX'|1 9 ]6ZTjvӕ5PpM@r""uĸ`rNVNC-7q) '4I rg[p]. *(*)(((j(j(j) "+mtk:ެg|ܠb_Ɍ 31Ţ_b=?uL>7!}! LJ?0>6/7cD31ݣʛ#Y?8a݃Gt233|W@s{AgWL@C2wBoU!RB4$MTз+ȏ 333pa!Ȇր}V=_Q Gf#^:Κ;,@ @Knp2ݞkc(z8u<''հlJ,s$3B8%Nz|A}oQP`~`Ϳ$__~62* NLJsگ@6dȐuAX͂A9&;c lS" c @Dd7$B ^n~KHEqd2D{KlVlN'뎷 ;1 džf$I$S ;D'] BPU\iøMYF]H $؊{ ~>*J(*+Ñ.Aݏ>ɑt+Ϭ8uclOٳmD60$Ӎ3^!5a[mNH CuYQ!˵`hDW&84/p 18 p|S!8ixl<%lf@M!n)'58Da-G;.gfh3cڴ7yo<ӧƅi#c1~Gq0SEQ*Q?Ej\h@N[?0>JH`1ԭg{ %5 `z>d9tszzΙ^N#.S@¡ _=vBKdHBcXQ  aƀ hcƒH寇Ži/ kC0gwH@_>0ׇa;bB ,M&;B>Tt@1EeI@=I!1hr=q[QKP˾=ױz7}0YsD?i TrF:i'hտϗkiψL doNz~uᇎ3 h1cXnK磛}ff+]*{3c_p*CX7\#k=aBc}ҲN57;`T;m!Y+iD#a$<q30s1}t_CO[\tG}~<TP^Fp{4RQ(9ǹRQGg" E4ax%|S!ZGIbAHP pb7ůoUYzFQi@1\;d݅p ފ Ka]'d#oXʴa F'7OH¿yS3xKqJf1x&ʫī~"9?dCt֛=?|C) ֞edRY-,?D$%~ݳ|pcIK^K8bϽtXvaa~PO~w q ;$Ϥ@jazXסA3Bd<bmarZKA P{ݻKPe71_;or\J69b[ᡒ>HT})u*ɡw I[#@?#HnIn};kBʛh:;aI@|1{7z8CV1+lsQh@ ~fuD80<ʏ3_q/8N^7`,ݮM@q3rEä2E~18%_兜IUoYHB {A>9l}s(e糂  {y1Z M#D-1 h2$c)J)|UL<98ϹM_|o˻-E(IU\drL y8_-&dF/.ٲW-B7v *yW%ƃ!Fԭ4 A`#a(F{З?-(s{OaͯvnOeŰy.p:9m(#d(8IM۽̶UQkgt_H` "%բZzDk;aՍMi1(FICۊ钇@( W"-02V>gTnۭ4WJ4t*, Q2OyuujՇ06O^v}.)#G!H&tnj >Hgn\{aKx.oR2 |*ͲB rU 5^1O1cƿ9}+i'efXbJ@'-Πhma&,,|=%Hy7McgzK2N>bGJr41e P33u"4E(%>X 5 tۿP)լf, WQ6^M\F׼xIT[k~8m Wp bڋ nJ`AJ8KR+J;ky`p_;OPLOl; 6솉 e`W/w 'P=PZ*֗:s"#D8%0oRnMXvE.v>cG]+\嘱"1B8dօ8 HY+Z:+9fؘ<Їvӷ$7YaTNs_\v~ߋwl`e^c%{#O9 @S EԂeɿ:`CGĠR0HٷZGɻwaAGBC7}}ES-*6JR+$Su( GpT9 W_Q0,f9>Nݼ7;Uro)"$ ݺVkC' ;E@ dJ%a8 ۞PEѐ%U`Ug1,нTlA&SN.GlodVn4ko%PV0^[SLJl&OExfa3EuXߎ)S>ƚj{ 5dIz[Ĉ N K(3n oS:%7V@dEt 8[ m|$:Vw|r`ӿ|R3SR28|pd|w8o O˺㺪N+J>)5I=0_pVB[Ϫ/ ?9nd $ygξ Eg{_sbݎA4V(1S{{#7cm x?z(ߙ#b>ʿ{N;' #Aԑ¯/>BdCeokG#[{fnj_ޱASZ)@v=IyYK8Z;j|:^12R9,T G`{:pD q~Oۛua'I}ޛgaZbp<٧?t$j׿oEŲׅ{!\#rx~6ٚ|gvBX0vɻ>s,ϫt/lV@Vba01PktU9\x2 PpG9AaD7 6GFjND-iP"&(U ) +dM۲p:~P4D$L_8ZnR1%ųUM< /bt ,ͣ=d2pExZ07Q1Sr"o\EQ;|l}/nkr~W=K5|#ڠ^&@G[(X9Bi(KTmq^:f,"#KE~7ۆB.\8E>p_XM9vx^GڛE۵bjjWHF}UR[`ٗJCB88_0Lbq7Oz&s 9zv&L$7/iooy9|# HE,M[ixx[=׸~<`E~($.N"BC>T5n/ k ID1 IgX^yVA~r_>21UG(g81{(0C*?]m"Ep▐kRhܯhM(E)fJ]`,