summaryrefslogtreecommitdiff
path: root/drivers/iommu
diff options
context:
space:
mode:
authorYong Wu <yong.wu@mediatek.com>2022-05-03 15:14:24 +0800
committerJoerg Roedel <jroedel@suse.de>2022-05-04 10:39:40 +0200
commit42d57fc58aebc5801804424082028f43bad1b73c (patch)
tree0a56f5b440358950f838a2685dd4aa187611df19 /drivers/iommu
parent57fb481f9008997563a8de96aa49726fd51d6e3e (diff)
downloadlinux-42d57fc58aebc5801804424082028f43bad1b73c.tar.gz
linux-42d57fc58aebc5801804424082028f43bad1b73c.tar.bz2
linux-42d57fc58aebc5801804424082028f43bad1b73c.zip
iommu/mediatek: Initialise/Remove for multi bank dev
The registers for each bank of the IOMMU base are in order, delta is 0x1000. Initialise the base for each bank. For all the previous SoC, we only have bank0. thus use "do {} while()" to allow bank0 always go. When removing the device, Not always all the banks are initialised, it depend on if there is masters for that bank. Signed-off-by: Yong Wu <yong.wu@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com> Link: https://lore.kernel.org/r/20220503071427.2285-34-yong.wu@mediatek.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu')
-rw-r--r--drivers/iommu/mtk_iommu.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
index 5f3e88c44514..400dea33aea1 100644
--- a/drivers/iommu/mtk_iommu.c
+++ b/drivers/iommu/mtk_iommu.c
@@ -113,6 +113,7 @@
#define F_MMU_INT_ID_PORT_ID(a) (((a) >> 2) & 0x1f)
#define MTK_PROTECT_PA_ALIGN 256
+#define MTK_IOMMU_BANK_SZ 0x1000
#define PERICFG_IOMMU_1 0x714
@@ -1112,7 +1113,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
struct component_match *match = NULL;
struct regmap *infracfg;
void *protect;
- int ret, banks_num;
+ int ret, banks_num, i = 0;
u32 val;
char *p;
struct mtk_iommu_bank_data *bank;
@@ -1153,27 +1154,36 @@ static int mtk_iommu_probe(struct platform_device *pdev)
data->enable_4GB = !!(val & F_DDR_4GB_SUPPORT_EN);
}
+ banks_num = data->plat_data->banks_num;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (resource_size(res) < banks_num * MTK_IOMMU_BANK_SZ) {
+ dev_err(dev, "banknr %d. res %pR is not enough.\n", banks_num, res);
+ return -EINVAL;
+ }
base = devm_ioremap_resource(dev, res);
if (IS_ERR(base))
return PTR_ERR(base);
ioaddr = res->start;
- banks_num = data->plat_data->banks_num;
data->bank = devm_kmalloc(dev, banks_num * sizeof(*data->bank), GFP_KERNEL);
if (!data->bank)
return -ENOMEM;
- bank = &data->bank[0];
- bank->id = 0;
- bank->base = base;
- bank->m4u_dom = NULL;
- bank->irq = platform_get_irq(pdev, 0);
- if (bank->irq < 0)
- return bank->irq;
- bank->parent_dev = dev;
- bank->parent_data = data;
- spin_lock_init(&bank->tlb_lock);
+ do {
+ if (!data->plat_data->banks_enable[i])
+ continue;
+ bank = &data->bank[i];
+ bank->id = i;
+ bank->base = base + i * MTK_IOMMU_BANK_SZ;
+ bank->m4u_dom = NULL;
+
+ bank->irq = platform_get_irq(pdev, i);
+ if (bank->irq < 0)
+ return bank->irq;
+ bank->parent_dev = dev;
+ bank->parent_data = data;
+ spin_lock_init(&bank->tlb_lock);
+ } while (++i < banks_num);
if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_BCLK)) {
data->bclk = devm_clk_get(dev, "bclk");
@@ -1261,7 +1271,8 @@ out_runtime_disable:
static int mtk_iommu_remove(struct platform_device *pdev)
{
struct mtk_iommu_data *data = platform_get_drvdata(pdev);
- struct mtk_iommu_bank_data *bank = &data->bank[0];
+ struct mtk_iommu_bank_data *bank;
+ int i;
iommu_device_sysfs_remove(&data->iommu);
iommu_device_unregister(&data->iommu);
@@ -1278,7 +1289,12 @@ static int mtk_iommu_remove(struct platform_device *pdev)
#endif
}
pm_runtime_disable(&pdev->dev);
- devm_free_irq(&pdev->dev, bank->irq, bank);
+ for (i = 0; i < data->plat_data->banks_num; i++) {
+ bank = &data->bank[i];
+ if (!bank->m4u_dom)
+ continue;
+ devm_free_irq(&pdev->dev, bank->irq, bank);
+ }
return 0;
}
-!D9W ~E)-ٹDv˷K2iFT:_deχ]EgnfثtQts[TdI + Z{˾@T5U$.?20qTJ)_i40_ߟ J]Y6fr@:5$# 8Wxas_rh$D)J h `p`8dG8ĥ a10* x( '*"zz>nb"Q"$"ѢJLw9&?0ysM@ @ȣj5HC4@K}xb8ݺşKpc:5$@ǎ/-{C"4>ed,!U$0I<>Ǐ~`Ƿ-|(RWz7\H!TJDƤ/і^5w8e۸G'ow?:37r+@w~Sv>"zJ 1r"~̬z A#棳{O9nFN]~-r&=i,P?V`N?0*'., ?/~L!Zz(y?u. 9jT˩88JA+$pK #>gN~rĠw|U'"5)1V,>}A7ȠC@(~Dh) ^/O}0/LeAe?SXlz?sVV¡6q}WroyeM/ݨPgGVuMƇUfk#]j'[ʨ*)x} `aX9oe~kcx_s<(l+Xح 5\6"aPiS'`8APhιE\R=SHhPL xRŔzʾ~ϻ{$E 家ݟӯc WոΨޜ|zMxOaІ{7?{*ggW1Πd&`YH\9l& a@dܰG'l)wC0bsHx,Fm;6_its\%>6ps0"_ KsnUE]]??'VA0Q Rn͒Czj*%ݭtɃ@> =tY{8=<,#wfz; D~?5z0%PT*@>j_Y}g؂acf>O%y򚌾ܧ@?vq7`:/o笋2an P!;xtC8tU(SzZ}^7!ܳgnom\>H%'޻F ϾV)7Iݦ]G^uy"cn0a+^^a9ɲ> }^\Ɯy3y^uVʣ p 2sD->+W LPTM\lrd ~̊fA'1US 60mPjZBv8 #O(01EZ'q4,r7Dg> 0] .t[/s^bo1"k/}=Gxǟxީ)cvOBĬagß!\O53|1/Ǐz_>#7$\^8쓀._óM!fAYےcf7E`1k! ]ݿ'Y;>wf=d1ȉ{[ß{ڢy|ܤ3|8C(dvrÛegM^uhHZڗDs6,fa Az43q~=z|FzՇv_.G30 Y~ 0hèV_]mٳsgl|d:Ztϼ\txZA#MZH#W>'N~y_ö k r8f9NǦ0m*8:\:bj_*e3[I.{n\Ҙî/{WM~A*:$woY( ]v8iu7%+dov}.xo&M[~N5}Vʖg7@@X}HJϜ=YtVu](^>2C+[ku?.?eh^fcQIom,yvI>RҪ @8 BP r# V;}Rz3do_[Bk{82Y- }<07!BcEO/24u{Cg,j\*n&] Ü0y;/q\6 SNrCh^$`-߭w lǦ:ti=2jG,v;] >$(ٜp:# AsqvG`vpɆ=0/PݕQ NwI ׍ȁ{n.T{"7U9c3XA3vpȗ<;DIT 7ɨF`c x{$JRvU-V}2Lpjo~3uU()622x*^ϳs5|pg\~1wL_=ߡ'vR\aᦨ XO\U1G6vVxr޿G{8~xպ.O ;x,}( U1|?4H{pfwuE^[KA9Y9atP/k [SA{@xg˿NӍ^h;H|Ͽ0?UInmFO^5b:5 prԭ"su8Uܦ؏tDB s3Q+v3Xc@ bfȇv&! tǨCj%2ܡڬAǠX}ۃt/ x-'xA[xEI6 &k fuHv9 2d1܀#ıtEz#86}3Ҿo'|q1ܟ_Css`8ۼvPcY.Mv:)GF䴰-\i˾."`R,™=ͫL xVù+Vc{Q\ ;u06Տ8d2Ǜí{8kggǽБtx߭m3ͱ3[l2#7"EPf /rz䝢hW\<<ip%< 3t9l@ gH%;ɼm\]$y  +x4FL.P~p[3_52Sv^ 1Po(%3PlàI@9:;场yp˯Wp9_>,aL`ow; 5ҕ&GapO<筒#S^>O@sh EƔN6`%߫ш8Q/ Q.ͭqQ{7:T+ɚa)hb' bVPmm q 1 4]x( H }[UГ| xQvqMD z-POC6ulZbWI_.PM0P>u> 38 ?=Kܯ:sZS*,mo19>S9z‑rZ^u9P+fx0hvU&޼쬲35}dFźg)sk^=Cy9ecoqG<07ɮ2ĉZ':Gp𚼾*84tOiwke0?W@ѪyGkiˌ9qtpq˫gќփwrNHK-z$m$W 9ױ.#Q)==BˮC{iPeXCuUu|Cz~8< ȯTarܡDN߶jޗR,X" ڨ2>/%uI},):}+҃s-m9!nxe>jTo!Dχٻ2U#!?H\Gq@CO۾OOGs8jdjsNU DiˤO?b:*Conp yӌnp/oL2Mߺ Ѝ:vZ7r$ ׼;`* ܺYke N{¥,_FsEB zT W3g.9\=~+CgӱP7ȉg&N0fL}w<2^UӣKaml(-`A;zpfÅ2*?Aġ9ig,%M;6\1)ǐAU!{xhm2p\=l7xǢ _4G#b?}L"D$7nrks|= ?FӉ{C$h`9l3am~?K+M)4ES7MUVWk n!$j9Wlr䢤88 ,gm>+Y.xh5/>&C됔wQ6Y:9P@EQSE4u;Coto$P,/ 7g&ig mrs熑JFjoy-8(kz68xQm 7g_rJL3ooaC16B$ /$T'_: ޣT57zN#y 幓 KW+dh^6I`XVɃ׈8W'ӵ)=:uÇ _mKSYID/kAN 3_"4ɝYi~:ڛ3M7OfCT$'9 A=S\d95|U:`g2%:jPXiuTp~e?"ۼ9R}(4{K=GT(ӣg3@?焈2#[/>R :A ZaaV ,nw+W]69F;Ay~}WE?b\k-$9Q׈^98orM0cRFI wa+Zjr vBzjm:҅J%t] [wz T}k|:ۻ6V+C9u"|z`0 笠`=Lt]` cdݫU{;k׹.0`2Qh)":/:MKׄ$(@P ]xnt#fN_,-q ԗ VQ;sz$f,.U`$S<X4ןQt8zhڱ*AwV+o Rrr9胣+e\?$9A芡jekB4_V@+ =|8"cYao~0 ,>CF,'}d&Sؐkɩ>\/x.7'D,z<Ob/&n,kleDQ y'-l.UcIfJఏ5dˤ l_ vf@|s_gB:~ B`ۃ;A j2FG*qvo>oTE~?#nX 8pPFecvYPv}ݧ['04Fq5Ӥ1-]&}# .)ÌeC{ƴ 'dKXv֫ Cׄ#%`l3=2=Ub &٠q8OP>]7O/z1ttMz߭75bIr[ULq"%h4'7dOf1ɗli|f1*N&{5ۍfacKA/~u!уï^pZnB\-$xk=M?#Pdd߷U]Ƥ|lY *zCC8 .yu!௾"VYXW9mRn,;"6=&VYmffu':w6_wwdӈLߜYS{}[xӅ7RO/>4fo*HuFoy[F}'<u4Y8B5% +vሐ3 Mg`@6í@D>|(p)S\fҨGl%+*U`WMg4VSMWHms1Ge⽏1gNG)AxטsŇCNJv3dx KXW$O1OD> ?xlג8޼&C눛;66`hk LV>tPv w%jqjEW{^ 1.km"$wȦi1ۀʼnk=]|ޡU/>һ1eЇ5EUcA[8+s`FT0`ovn{_>^1g)C! Sfe=I9pFu^`m0le:,S:S ݦ v_KLMc |EV.]4(:_pg8&1u9$'!wKmȋ.zշ}1;"zKKH4F5;R@iԳ]e,4HpH)AJkA/rMц B6W#&y X镨ERp_0\oҵX9ZWrP_nX9ծ n kTp12Dč;ag#3"qGJ?Or${6<+ e\ݹ֤ F̐55fWAuu¯ _vs bAϐoXd-BPl)gRo+ˆLaj߭=(;TH\dʎ6g*0cƈ4exߊS)ßY>.G[=@h%տn];ָ"4 ZȟNVpb~܊-KYVYL䙠}߅Xeǝ^Ks's.ըw2G}ߧӺ_};$>T6 \yۼT6woo};8|#.*`</12GN;v=͖%v/ݡF1릠O`(SZ*2ljW5JE{NZ<"}ɸywF]s# ND`` _d Hb. fA1X^ ʴ ⾗5;q??iT"ɒ;SEWZ8Tq1̇R,&?5Ku-蒿(=\+BG pdSvbjmD kq$w:1!+oQ /3YF/& Xc)bv<~ZT _Յm0Mk1Q}5@,z6&}1mfej(š˾$ȥ@ 案:7(x51}'ق0 W;W}6`vek)m:Vbvڞ9 #otnH'IqQ^?yqۨw#&=xo+'oG'1G%Mg&)4ծ*i;X1KE]JU\\[ns۽5ew4G -> {T rgԽ-O\tLoi4$Uu` %1a7frP(%a3B>_e#H:veRNdLjZz ,Uh:ki16"k7 t-w8RľI\+yK>r.CC'}^sKyk>Q$]]3R?_rPAeG47.;Tʗr@ ʖ)K,X|f15}Wl ^ _Y}06@kS++8?YŲnY !n|.vqOIcd)11;@<57lWб~eFU 1' ywԼ˜C1dCr|+t\8yph60 I.A80ˠ@C{v\!(HEC뮮o;xB8Ooe~9K7P}>`1~U ~,\x$~c߰iz  /@*)2}83ZĪ:I(?e;q@{1(>Heox( z p7>Sx#|0P5k x3pH d:!&~ͪQ'@TzQ)P4hrspDJmmp w !㞐򥪍rm!iH fG7Zv#7N4 7iPios#ׇM)C|!g) ;*_|<.ޯõZ~x IW֝ws Y4RxLV h ^}|\5ukdF8nW`t"J7>iɅ-k U`@'p$me[_QQ ]Xe5:Ol*eH'Ct8uv~2߾RcyL*Ң{s voxP N0#, Z璅 >CTFW&Ge˒Tk&‚DȼQ7jvٝ/* G8v.xGnkԼk.nz&Щ&dFNj?1{ -*ˆp$i1h=ԨVTPv^AU [pV/9tQ·''V?dtÒ##gn=HMifvfiq[9ϧ6">^;acS116pV+>qo`lp?H(Ujvϭv4)lOԯq2&p}\*~@ Z<~$λ2`)gF)$_g׆-"U"+3@o|%qŸ!ǟPAna-*՝I:N7Nj,]W#F#C<BFf)R܄6 w&d]ql,O/;7v}6rsnz7BVֹ,~6!zeg߶%63M,TNn>0'c7ͻ1MI0;$ߩe[}.gG(ױ#.RjQJڢb&$M 앻D B EM-O[nI+̯&~.tn'}ub]4,KC +.\>X>0t#:jw< lK?rvӫHIvVQ>K8x^Bˁ4!$1q E/3SIXV6偓0$+DI>"SSn<+yӾZeJJw;}Ov3 IiWHzFYk܅aCtEb>e >uf!WEenib¾rb(*P-%v½8*:V+_@1F/g_ㄐZ-r0 Q+X4uu{Y,4Wl޼w6VUx_J窶AYۣSiۯInt_etɡDh_%)δpե{c_AL]}H7m^(%&sX VB0Zk ZkZL3Fvc*{:~M2%.9\׫׾lԩ&T~]k}2D#ն麗Mvj寀[+`+3Eqmn: *ЄɗӴl1  sUjsm 7R.W#H+4{WXĿ{zsgN͌UPpCs*r/<ͿYԖ?' lr'6QMШ-s?]B /}$O|$/`\<ɓY?9svKms[%U({? îaI?dz)eVԭ|87Ka2 A0_)^=BܺfK[m "O>pVZu$_FKvǍ'.(+]8F TY,gu.d:g6>ki|\l粷d&BRdVI'}V뀫9Gw|M )"C(YV)Q.ih璸s0գfkS'{WL/-'Dv>f}^WY*8$H3‚+` (!\byi=Hs>qG i;BO7 g׿v9u Rv~ur 8Ÿ[sIqlkIg/m{ocOOh _7]_ON۔.A1Oh[S^~M_Qk#3~?r3/nnJxuG^[t܌^`\>,ω7Rʼ1.'!GX.-v>WlDΤ &tii[REn`'d d+}@Oy 0C'!뼀q 2;^NZڐY.Xc {|_ wM$;VZݽ;^݅wRD1&Je[Q S#pw |{5woY0]šl}/ hhbK2ܡ9kl:" ZmdHs"X~pwUvz8?3)b"u_[FrC#ޣu w NkZő-#g itwXTj#O0-#|sQ{6l0 8;o Sm!"HMD@_c!96k%~Ƞ%.\uIuvbq& gڱ)4VCA(58͌IYHE\Pt }֭7ByGK3 2 _yJ*X]Ȁ 7deGP}ܱk6I8^RrVH]wG?>DĈ$^_5i!u̖dlaQ9HN*緢*_m<뀄u_E/)eouooTb;@Qv f[R1^k %s^nqcHs 1Y,&s\bMyH1Wn%AN G_`Tz!LEG7 vJS \n4:`]m ϡD@wx(eW BFtՙg2gaVZ z{E@oup$l{5`$d5BN nfv˴k߇* */Dghe{ȗḨ㖸}vNTq(K3P?ĴHsIQRAzӦy3a;k4f&p>4B%M:b-E8#M.q3y-E{۱ /C &-l-I#f;̃A ºܮiϜTc}Bl$cg2y4n(0Jfq$V"<&`'qhwsf5tqѷ&יĢ.6h\eEzԔ(A",AHjVgG#ZHbp$~͏2l(TE59*@"($*gKmj;=R ck ӟ}~wOgw>k`qhޗ-wG,ses1@߿Ғat>v< < nr`-CF$z0d먯vtVIRg)+a@1Hɑ^5p98(Q;ou;BDv٭2M5j,D&Z9#/3(B"z<}~ghۯPޫ !{]!ȓn \OV 5EH|R!UB}?rq&NIL=3QVYVFHZCw 4r\?Z%_J{t߭ ڢ)`xWcLVWSϊRrY 0b(ifIBkcc1OیQW#߲OOi.,_&_wM$0ԃ;:nʌmq 0 )js`0)k[X{W,m].:pcM)G{x,Ce='l XUA*> ' %,HR̝uXߌ€}% M5p-5}~/O㥖sHoUq.˞N Һ$ZYT*<_KX'|xF Ṗ6&c̑y5D_eO_̯\EMyB5ThX̯= ͽmqAV21U"[)6[f^cf3V .WUuy:V(5θ2} ~@.JܰjUrS䦒 7ipE`'| |V*ӪL&o< Z+$lc<(W수}d PSتWI-J܇Ez>Y㪴`W(ЈX6Q9;GܤEx0P{$P =B.oɓ hp72 Dc[gG3P?ֆ9BGDyx(*0npC`X̤|hXnr?0i)#QיPu1~|c5+O#kL> :vkX}KpP?/XlK5D\|yhoY1 ,PQ9말F0̻j WIDIG+ˬ:KZCȊ/vN5, `.x}>wM} Q DF%kWOGl`GMm,Hqa?\= &`(X3%t"--<ׅۜ(7WQY׹Zu, dR^`/Y4&R ;\Luԙ1oo;?Vq?lqi0ެ<KnjU0)adm_{se69!h(r^ .7mx,` I,>EfMݦeZ",nynp"wpз˗_=|e_zG swL ޞC[{E:c/Ogz+cV 9Jnd2KCǪ6zp6&  >S! Oa X T?,ObvpǬ,݅_ɔ.JVWt|\Tv]'6LѮrjMD*Q+bъ'>nN+wX1>d@WZ?=_\39];Pzzd1hɹ8Ox4e\PPEyؖ$&*FjILM(=t(Ø"V>RU<:QZ!CG /)Z瓿<9{9q|A %\E-Θ&HOiXQB[]Z#i."uk9ɥ ! b?}L "0 8utJ88L p:pNꫮTS]E@ F׮Y߰ ٛNOx=Ѫs=cQGm<RzjlQ{'=H|]J6d氽 5Ny+^?[Y|}W aBD3_KQ㘣YeǝWpNϤi//T>ڔ^Y_k2xL;BB1@.WMLxsFzwd8tILa],2 ~ mW!BV$Tݪ2Bx+<6B''0̔sg,w|~2o+ #$įE01h\pD,DC%*!L?sZ/hi IAԭBPpHx)o;/^>\m$^qg<} 9DR8˽ Ba^:m3XV`7G"IãʸOF$8b$_/F:/?r#57yzx­x>#d;DoXF•20\Wp{b('X k0?6wD]{׽hКQ}MaNE<7LV@[9&dA 0 $bISƶE鴈 G̴Kr+({ODGa 񋕑ҚU't\L|+j(3Fcn0>F^^=)F9\!V $T"CR,5W`apoSyގUظ<Oh'Z9.>4}\\)ڏTe?_|"wAhS항P14͈~@46@ >DHu.),i{Ww҃lonJfɷYqaKtxH\߱ODf((Er^> ^^~S8^w $^a$}OKk0pGОc۳,| J C8M aBYb2)BC&.7n fX`̘hۀ܊ܦtf5䙞\ᄟǯPV6b27 0!*[pZZ;?f=g1`ǻTxC2|ժspx K}o;XQ02Oܤ܀[ySC`?| CSۭ@n{2(Ȣhm}l0: BǓ̈́qުs9?=w\oeԌ cYySf|kCIWEif vZ>֦$zH u !Ǜ{5x"6!˝#rCP*ڧRuQIhGxFЉ̗: մrd>PF|k(HǹkD^a'5R·G |X|$B_旡q6jW1zZpHH#XĬ?j\M5⇷H©5o<n*w}fsht;t6G0,fC@uPqډuqvW:~}v[z5u ihܹC>6A?9U?ev_c2L˝ʂI#vT%]*9r%oP*yMyGb̾޳Du<_Ý 6չ;Iyy~1zt==FG9u"Ffi´ 6ޛ07"RV/(5YhjaqP3fdx Tp.>XPٖT1賠B$c;  c qya^"77OFg.ioc|YZw7-v̼q56@:%c?[ẻ O RR?]}dԋ?\*]p.7sn[*`k0?ۈ1|s`O{^J0 jZ]LƇXӯV8v^U S{%dsqR,LWw8 Ù!@E 'Q']ad:/ fEE(!Hvܙ--~]{ [˨ UڷzW9x Q|bY\<؃'=%C#'@,59}X)ssi޵H/qˋa Sf,G뿾Nr*5|1~H׸}ImӥGh ɨ#ffnXO .H B/(ʒW.txP'g )s|_M_':V 6qeM:p!G% h(M1!clBC׭xz1y6Jǭ&'Ѩx J]# 8<@xwOӛtop C [mey>7,'ٝroP(u0 m_P(/Um{鱣[|kimTT>&1~ܲ߻<+*2ڐJ)؜utWyԔnlW{yaw.q+mb2C__Ss٫-23Uz6cAO8Ľr iv}/f.BۭV@};T_?gͲc!:?O+ h"d=x#Awoz65j;  뤑_/zHI:9d8͵!0(yx9"Os^Qu;|~p0r>7 &CPG*mZDkd]\ҙOa7_֏N?ѼI s|{Uq5kG021q v`C'W3ܭx<]T53dڶ#lz+1}քt Iz;Ň3Dzb 2 P|-.5;-?ˈۚSpCv9M+)ھ27vR3;3{@%Y( (sVǙ{ Îpy+uԜ Wp"Ң4ޥ[&t4Gz $!};N/;: @>xH;0LJ{ .I SRvTʩbԻ㐰G Iā<Ǒ>֘/ -%# 6a[P{F9ވ<bP:!>d(DceI bO6!4aF t\%ee4Q#oB(Q|62KͭhWUjb*+ I.|rg#,7`[w\%O&l8R؟.rua8ax@ f5M 4q6N9v2 Azo]Um*dƛYL&Id߬Pg1 x+iz C1LOn;R1sU`|خ"VOUK|qy$9Sb=T rs ^oy.|*ѝ׼CR;dOQkIv@H N"D&8gfJM }?M.?K[2sY 8]ֿe\ ->l3N<[WS LIpk4v b%-YXqo\0ad}\bGku|e3&$(ei]HktK_!ΩM Gg:\#;mn&D D`vBԺ?Y!m_ ̯Z\p~XjǧZ`@tnX@[9A!0-VOj 4Aj\ZSatW|{T/ Snq*ΜŹ A&層7b~^G]өH1`tiiU kVV=S$Y1qďaDn 3 Ay_}T$ |qژ; ~е?¥--|H[i uaryE*!G~,#]W=2Vc*+@eeW:E =[ "R% |gm;|qh??W~>:yz̙O&2P|-QZ>s(燇?Re"H0nnt`4H}8OACُ'ʶ)2?%J+{Gl!ks[wO2 Qbw#Eaaʵz9:9.GryC@;<]K9BgF(؈+wkYۅ$QB v*^'Ѿ?o?tq QXM; (D0 ̻p :2CEN _QꏗH[gK4ۏ1{ǿV;O]Lls^c' nՎ=9bN!lBF; EGwTaގ 7~C`ci,7֦Wu!8x2k7W9Oֱe^ [Eor}c;EEL3[;͘NVˆOgMxajd tHD _1K׻&igυa9eI.Vf^d96G,~*FQ,鋡*65f;EPA\88g.},x (񦪽ڟF)!K02 J83 $MPwQEH|ٱЯ+vJݛHhMZkڃorw̍qu-rXMd܎!DŽ+d\ϓq8qd1EZEPU,fCDNq3ɜBW8XṾ?o Vrv@,רQ4 "vl5ߌL56}Sp;{vvZZ9/&nz)|*f s헛ԣ.+x(z3/gJenO|72ev-[NDIVjm)sh_n cgwg/Zx|EΧG9XLkwEg[_'ƒ8W*/j燋 YUGd48ql(gkwK*jS/*K0nT9EaȲZOzoNIVxE_2e~tuc'9Y4aGQrPTq[∕]h!is͸0:G-i]n=ۜ&V> q"Χ|]psLͩu\<3)4۠Fr }Bm~,J",'n qgmYyeQm"5/Guv͝cXqq䃂1UtdӘuό[\%O+kip#!sizu^艎12u/8Ҷ?Sg9$;N-¤H_XВ&\5]{ƷįFyYwP&]C`yW‚b><5'nh;ݛiv<2u CbwWS|9#Ⱥ}9y~ p{h<>a.|rbG9~!gҽouBKf[ YyA{ۏHMFU1E" A0DkoY9Dv}Nҧ%Ѧ)]1R,ƂI{靦߈& DԽz\w5Gމ]fZmo&yrpq ;E[2c6 E#.5ўy]ӝ(ݖ,x.R-[7h* K+M=Kqʄ1`shg[w xXSZUnZLKfgCt5j3t"zj}kM\aP˟LF\|k@!ep( ~FOvk=nVN/iwLJcuY֓s7Tq8ΡGG?#A!xܶ~p5Q7NufK;95j}1%xMuFj &q&t oG"$zdvcJH֠! efd9reCۄƨFlR[|786Zsz#c7Y;V{AFôsQ26}S͘CҼy: GTz|>Jj{y>b_U;"oAv<ds }W: O9| wr^]F7QN*b8ъpS=c_؄Yd;~'&P0=SDfz(V񰞥 TX]%?3au<$\=K8䰻;l|quI?*̻K&%&WQhM8?$%Cj53llqnNc"~wڞ}| ^?-)ג4IJʃMhvmUd6@T"%`3աC,fX(% { ,c'eq`O3䲺EZpѪk{l* YiOd)ᅱN9_'ΗsDs8}ki@&U;,{d"Э('&^mv__Tׯ]yNNS_*+!,Y@c~xXOyKޣ~Oz[I(֩k̳jVxUگ4}94]u걽iӴ->WiMX6gQuc+S+Zz`Gl +h嶳AozhRkΔ,ٝGR\`NvOzC"fΠ7"WQwy۳TJ 25 DMAX~ 4ɾ4ݬąByDKۏӈ / 7ht>4'0dLDͬ)b69NițVDf6{( az.fN* OZA< t B"4 H4&^c9Hr.NSx,:U(C ;@+IB.[_'}E&ˀ|UoL~yLӰhvh_ԿB'HTr\&Te m[+G 5r.3+_33 GȢ*bwGep~DF~>ui߸KYsfl)s|'I=THXce$]u+ yއV@RJ0QXb]^6{#dž\*2({.y &g(A^UQ5|Ğ45woXm: 8 Lo.e dm~D:I';Zʈ;!G Pڸ>;$AD&UUF1ta&_QFL\{`G;£^+VY!xWL*#er(#L~ץJvO9"pQLB=$Fv>ipmrCiGc,Pp4bEeq%IbɥފRs$ڭ;z7 |mjWۅl/`Y EHęRFt .6Mu҃{Ÿ#b.qfmPN4A ߸RuW2`QDVQҢdgU~[w>^`wzaNq|Y\<6T{ @1]W~cD*zⰩ'?]N[BP\P# Zy3DL;-!1;Ώ ڸ0P:uDBT.w$_Zm8;(6`\'ɛꞫЂ@Yxj1~ <_ _uQ3qOߺ) Aw;$'dٿBn'U aZM^S}u@"]l!;c)Psgn"ɋ%bv}(ai}1x]:_f8;}l =ArVl+ k% tƱ*,E) Jm韊ty02VP)q+Dy',An0nVNHVPmӶ뻓%?i?Y)&w o\ÀI=d G;( E3R_ wVH/bY~Oxܓi};ZuU/3! oFlckhEKtTRsPrz _|1g,RӬ /KB(v=Ve.><^1N"DH{ stU __weOt,7ΊWjFPaQ!PL!F:^&< ;.?iKyKY*=OY\UT1p7Ps|п Mcx绺5\-4}1ŇlB H"5ۺz&;s,V'>:;N_Ct zԔ8!)JDH$@@ DǨ:T%+ |M)I1H'¥T!%?ʍ%ʕ}eoI( ] 2487TlT/:pJ;&D;O&5-T_]M YVwNM@>^Xn3c ; q5g o_ӧ{G3eOTtGPl8NתJ 2h2n`,MCXcq?tm$HgX첟ES_֛R@3cbx&&_̻aOg&VroWu&CŢwϷfuGϋ_ѿg5o=VXJ.Q?w?s݇i Ritn"[9u<|?ξ9{GkC[*?vQh0{OQʿ C/? 53yy1FɺLѦ1#}k?Y$~Ao/>99'y_^&3\5p| I=ж{g0v 8RY![.4g&;WvUI׳se|Kyr7MχP>?29@W%?n 0*hp((]A{kГLDt󠏢zl[90Ɖ*WE83?C޸ @^{pt??{'j"J1J$`Yg\0Yέtˁvw8Oж <@Nө96Nߏ?]ݿ>wjP 5X0@`PP5FU"jOZwFt F#b',s2\Cqz\uAFh'CyY`(T}SA@8,#ej@/'|GOGc^Y8#PQa[jyfрOWT~Vb0?_O*~Jj MIua! HԈvLL Ӧ. ύZgeۿ&e*ƶ2U0}Qy~&Ix{Yb( ?N1޾wﲿ/W6yj|2{N >YGQ>,>N{ R:nnsyw_<}ћjtb ڽ^j^!x{ﻘU8[ok>WZ7l uvoEɫྐ| 6g^sxj6-sG >lWtF:/,-}B׳5vlq%XB0 éP:BKfOeAY{'w]%n=J22dr@x6a|#JCj6p!Xw*J  đŭyx ރx0h92V2>cH̫ÅڋGŢMNJ#6~I4gcgϷf]%׃J^*@)NCnd.w@.6kZ-pqx_Bw1V*%m#@G+4E!ڣէ#nV\B0g=b( %r:p|WucܱS|AlfqqBAgtu6<*xx~^jsI#HDQIڍ"} G5f8=_s.}Ga/-$[lKWÙG[öɥA/*3_ca}'X8qgQħWTy >-1Mճ&}_{,UG9ҔJWw3s,€T`=c9_p_Gw8:@i%H?FzoYR\SscBȢeII߶n5?]f%1fT}O&lWs@@u.:$NQB (P 3T(t9b~ wN7 >`Ê1hQ lPWlF_|?mV- Nz,w&:}7?mܦ-1^} PUJ[1.uхMep@_,.o'ԜmYb$hd6(:)Y$4PY A/qGQ~=}B4H~"nd׃k@bШ{hS!Wn^/'jމw8* 莨dDxmZo{lTۓ^D%@Օ_zQ+zw!(DMYq!ӵ Y~WԳ>G[o'`lzΩ5!Ffi3dXtu%<1uN!s>ޔ =OjBDԯlаirs8IArƸity!_۱{.fq@0/̉`^) um wpˢ6JV8l1A֍v-GO=~@fZ21,3xS076mB @IL'A]f,acZ{L} P<冋L* FNEG@P90pKg8dY)F n9ˈe! # ķ94DAV*ckߨ͞궲8o6߬Hw #A:C;(y@d]9$"P+tDKnHK"u Um<ԖD^2 ŕem2Wl=.e]Gb޽wW [vi46/i ^3 kuD/2!gڠdN`(k?`YLξˈ6:>1̭Vł*2ׅЏ^slgM?+6ի?Ey;j>?4>W\WߜoX̣gj@׸>Aܺ\\Zٽ/S"xx hx;.l~R]hCζoTYFgM׿0E ^'.w9~/\|*(>M 9(skQk#{t9lˤ/f՘9WG <>bzgV 7{9Ck0ή1\)Qޔ|3XwBFoR=.@X *&*apP/T\g՚o!`AU#dr: n͔9'L Mw`>"@/L)4L R=6oي[D c 0m}H`e-:Cf+Z Nz ř511چUy7MDcwA{"31uX =\7njI ơ!G~9\߇,{9:Slf^؝>* ˢ~܎x_=>g-O[ Z]4U/#p#Ke.cPct7>_oU!}eԔ Lְnv7>W+;RZ+zBW6`FO{Jp['ʹ@|.îw|OѺ}vzΟw 9ڷ\0CW,a_g4b{u%m3 ~d]ku/=kбHstܢMv-prcMZv-c{'.^hXݯ3PIZU0y0Vv=?-(漻zc9ȩ>S}:2 FKh"5 W ߨew5Ap2T~R0!Rp.bYWM=*BHiĀ,}^_MVx=XeLs蜪(ũ]zlK][; Cy sDq,Ω2ܛL"Zחh^>6vm:Ng$MƯ,S*6YEz[5>? Z$ؗ#<ڮ9+rxY/?}  {c}7—w-vJ(kTև Ct |g )HPԣ[v͛afj&M*?V*8ռ[%/[ I' p`LN@;Hv+ jEy%Q@ ҧL[%23 jgqoD`rOm'@2Zƽ5Sl7X8QkʭqS죣W47N56N@'&(Vy|m2~zp\0Ƕosȴ^Ic`eoT9s3)ǃ !7`HIG1(y?`/OeGxƴBuZ5e!\E$?S jB D}`bljYtTaτ "ϱ-r;֞X?;΀Hm˷bj7 A~bN P ~y~+T:lvh`K&~ٞSE^Л%,$3ً'U=E!9i @\e\/MO9{(>!K\JM }[Gl8tH=tb@a1}h~y7 buuwR \ysWǹԫV_c*zd|1oalN/~y Q[SPRbۜS>1Bl\m~Q\x˖VA8xt>^ `A܄ :0~=+> 9"B(FOo.Gep U@WAe1[nt#2ӵRZ=/l[(ku.$"sxB<~zkΝ45W` 0ɃfجcډQ; ͮwNM$;MmTc(i(}X5U+c:wGm%x0i:i sZt¶áBzqV/ \(%|-Q 9c"q7[[" uխXC 몗Bqݺ(ŖtT阭_+q-ˍ|㺐ȬȵWBqs;ań0ӱ#RsEqW|ŝ{O#IVb*bT眉ǼYt?E/=*B)r 䃦 F{>]'s6 G?|u] -}^:뿣%=Nh J _:fPA$l҄M,5 Ȃ&;GO_e;z]z?!kG>\4lg.p D$uئp"d$@7m`Z!}\T_ e,x6HJR,@j[x;ĕaQ"=38i uc3^ b]Q /?/_ݯ/m諭eF <4׆t3buuqك(y}GXcϭ( 8̐u1tJh}9>pz *B['׿<#[KzĈY=aǽP}H ~OJk~qoGYM鳽k}7mPH=0@2/M޼p{:DC/{u;.ln<ąl^. ކ_+ 1e4 qQ>GL̜=X.߂-jݖ\@9Ʌ]֠xwd7mvZP_ zRH#{*QEZt4{\NW!l^u*km n-pV.a7Z]j[]Xm=|>څLjjYͅ 400aӟY/u k/톹=51v^o~dtk5J'0NFn3:7>vp1rCˎU*,QH&RclA@gWN:CZWҬ9ژY &[sTѰj:<cK`j7!U*z6j3Air RJZT9;$n8ayYz;hR;[1qKw4I SK#Mc,18lLVBK"X`^S YL}458Ͳ/M\K'Iru  0!icu. @*$ɻt ͆*7IeyAN)A.|p%850U^YV9*VB3a['4.7…pf5=#˷fD]zK=adg#H Ѭ?aJ[f8!|c-jE]Uj)2y|髀 q%.w;~~ 1NAURʬimZ}g_Qa2noUe 7d ΓUےr^)gQ79Y)95,I.ci/=@uzIzU4b{Z{@hT/~hqSAl40G--v:,5i=@UF7K,u~ 7'z" DDH  rAoN@ Dn3|.[e۞ODn9^+ 84ي.`Nib_@l湩ȁ(\L4tG9m+,E!gZa]ʐ/h'[6"hő/rݗCf32p5_޲R6Bї8mZ/~Wc <vgXqxĥ_l>8̿ǂIԕ krgӔs K}q b2u{WcǍGdA_ TQ~R-6 (*`S7H!b&`f`fѾg6G}\]wU(p5t '#upmba̾Y WFoFAVMo6Dn;pt)v=lt`F)]Dud1YA]TU b_'A۪z 2z2`@%eՃA:"T$Pu:"nv`r,οiF Fyef8Rlbhs&Bk$ky-lR*H;1x H}(`Bq7zx$!H&P6 y6Q:-M^5A6G<@ Bhjuj %Ax)*n@ $`׳P (8feQC!F wl:m Bkj >\Xv`4gk> e5.PN6TL:>2x2UQ2UQ2URTQCTQCTQHP5E5E5ESE QE SE QETQKTR";o=˯: e:;xs2 h F&qA(a(F=Șź|-m$&CӍBig`$~yHz{DG_{,=ai6zi/ռfEtr^tz9z ='>$9'n(MLJu񫤶E$ P P,U %@TEUUR+CHUU#L@P@4 (=ޭw|?O#&I&I Cf)Y`E-#DHD!QR%Q!@R!@RW1KQ1151@PD(oLuSM"V%jaPzv2{CZPBl]V\\ twG;)P?Pwyݙ+ўB!Ӳ% sTlzX67[ET%"?]o6˷tW1+af|+ޮUoxrp}P.8~D*DU%VG:[ntxRN0jW.gzS4dGnE99p@@T"llʠjΎMu\UC̱m3ߦ̠^A1!;;+2Ѽ Wa-+ϱԚOR%&i XDmg|@&H 9Y0l,la[IU\].r^HeaKsùwJ@'gU| :Icݖy >%ATtzyΥMg;n>fPFfӤ>=_Q޾Ő1ǒ \7jc׺A> }:Ōi˚Kb<(HK:|14Cun(:z_ 25" jHN"B/Eu׳џ5HGi p8B;{IXH}^<+I'̩$ Y>M'Qt݃kQ"T) iq؊#3'uKS!MG CnpA⥸u9;6[y IN7Ӻn޿ t $C⊕Q.ԍDD6a@ )@DB(Tf@= D: Aԓ2shPH`N0(2HHS@m4 E1R@K @@`fbEvA%U?c~T  *BtWP~0u%26qDFlKMaz4 HX@tYࠂ'Y_QjO}{iko;I%@hN}p0~s#9BI6i!$ĝV~;:gEmp\Mp%V%WN_: w a z  o׬|=Y$z$jwlQ,m hH";*Ʒ D\ɽJC{C|!~YŊ=oh~l9·Zq6Թ|[>gipHP,z{hUQXwwWdJ!7XxQJy-U [lS:p? Cݶ@}\G#F+,(chF 0 Iޖ$ e!99#(;vێzy_gU dR!8hࠄGnj[]=IF[ W  pxbT_{)  J4236Nqkg ^">ڟYYG -.':Qj:JҲ 67>'5<"0xqy<}]q!.WTZ7#gtЭ1Dz;#f9OϦMi? >q-y%N -3 [ANgF_u.* :1#[e5D),U'0@ !UdT(z^0ߪp!{Fl3)5LSVdÒk788y̌l3udCBg$?;B $)KVj"~EPs0C Q+xldڱ_ Dd::=NQJY;gID(QPV>ta\&IF JIF% Tj(Q ᳥rw U_U0-` ]{'8"L ?maUdCi%?(] y(]`d'CpIFhB <9ǰ1 R>"%R?:>yQb&3WiYvonRZJj4x6k;ض~ڷ;aɪ a$*J1x+|}3kKË! 㶱6ݧ=Z >4};\&DŖ,$H֫A ѷK/3cliLf7SP#Z)N2RPMu^ e=X[&{薝3bɫظ(@ba(띄xhd:0_2B< ɨI>4s*"I$nNcFvh?!?oR_&$E)>lr/Q9qg/Mv>O:ǎn|~c2ӟXXѯuk߫bn翦 1Đa @ 4q T Wū)+egWmVcdLqxw:=:ſ&/}+Ā'./1o?AͮouAyx'3S0ϴڜS̩ȯTĻOXML9 l}s(e;8 ѫUi]$"AKI]K28V\og#}vKyM4j78ˮ& !2 u㱮FFVܞcG4I<ʐߔ\GQvv2el>W`#?;T\ԃq{X(&~O H AwaqJ(_T_}{6/ <΂<>’ul B>25ICg\(XbwЪo'1Y}F`DM ~,Sߋ^Z]&/?`3Zǯozѫ1GZ H)nn맻 wopoq\/1:aGN_~RrGBoXuk)*HY|]) 6X4q~#Q >} XTx`ËNB&~=څχ x#ޱN&WJy|RUc[0gF O $~\+|_[kp>8FSBSR47,$IJ˂AWٯxkx zʑ?mWo_)Wƪ?fbZܘd2f+~M34~.F[QH%^K-4PVΏ[e9GWQUg75D/6'5PYKnDiM8Z.I (-/ܕ/0 i1Ӯ9}eضDi~)]6?Ypl,KGd|X0c 7>3" OiX 80<Ŷh#kM|aď;Y.< aV,(Z@F1 LAc8KA2e_u1x:{3v#, $ˁD3|׶X ¼?d,QҀC ! :vЀhhᡊ(PrECJQ B wn[c.5 //0DwX$~Eǘ=H @CCc?.~i鄙nfnng11PblqR~t$l@ %fQG\bŗԳ=2iu¦|l^|Sć ē'KURavg5&zÀa޸q|SVSa@CU}{Fwek\3^^А£jxQTy7#20_ٿK#̛*ۓ1!BķL}8&/ıXYIAUpyY`OHF^\w-Lqz 2N01[jl6f$SbY Eas`A>hj-~,8md <;ee}w}ó\~2B7 [P uۍ5Tm,Q{ISm}JwVCU\#rx~6, `ڦ 67>}о>tBrY}u3dc<9_(8_90ɹ1+Z&"U RH Z d4 Q}h9 ք %Ovq!)tz@@,eNTIt1T&Uolav8R{&)߹}ߑ3&cdW7bԶD7ZHDIx'7T~wk鈼n{R._ZGl>w{|Ex`CD Q1#ohtS}֩t8_b^.3!&fef*r%l|'k\bm|y+R $پW, 0 KnIu9Zei'Ϙ+xFV78Yq.{9:6 th/Gދ'5R^u|d O`<LKb&̸ЄjK"] }uVFyWMS &r{&R'^˞Lc\>t ΫƚeW7cklV~]Q'mǷ~ X! GX_3T fnռd_9h|/YR%w7w  tHTNEE῅qo:(0C*?t]m"E?pq7RT~=Tx{MZJnSޜ5Ï=Ÿ*F91w^w sϋPVNx[*