summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Morse <james.morse@arm.com>2022-04-06 17:45:45 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-04-12 07:52:17 +0200
commit9396d5ede3df91cc71c70a7fb11826a10c34e775 (patch)
treef676ace93106ff50c4f8892b74ea97b60761a31c
parentdf0448480b9c2f0a2f5a5055e04afa80bf0a5301 (diff)
downloadlinux-9396d5ede3df91cc71c70a7fb11826a10c34e775.tar.gz
linux-9396d5ede3df91cc71c70a7fb11826a10c34e775.tar.bz2
linux-9396d5ede3df91cc71c70a7fb11826a10c34e775.zip
arm64: add ID_AA64ISAR2_EL1 sys register
commit 9e45365f1469ef2b934f9d035975dbc9ad352116 upstream. This is a new ID register, introduced in 8.7. Signed-off-by: Joey Gouly <joey.gouly@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Marc Zyngier <maz@kernel.org> Cc: James Morse <james.morse@arm.com> Cc: Alexandru Elisei <alexandru.elisei@arm.com> Cc: Suzuki K Poulose <suzuki.poulose@arm.com> Cc: Reiji Watanabe <reijiw@google.com> Acked-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20211210165432.8106-3-joey.gouly@arm.com Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: James Morse <james.morse@arm.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--arch/arm64/include/asm/cpu.h1
-rw-r--r--arch/arm64/include/asm/sysreg.h1
-rw-r--r--arch/arm64/kernel/cpufeature.c9
-rw-r--r--arch/arm64/kernel/cpuinfo.c1
4 files changed, 12 insertions, 0 deletions
diff --git a/arch/arm64/include/asm/cpu.h b/arch/arm64/include/asm/cpu.h
index 889226b4c6e1..c7f17e663e72 100644
--- a/arch/arm64/include/asm/cpu.h
+++ b/arch/arm64/include/asm/cpu.h
@@ -36,6 +36,7 @@ struct cpuinfo_arm64 {
u64 reg_id_aa64dfr1;
u64 reg_id_aa64isar0;
u64 reg_id_aa64isar1;
+ u64 reg_id_aa64isar2;
u64 reg_id_aa64mmfr0;
u64 reg_id_aa64mmfr1;
u64 reg_id_aa64mmfr2;
diff --git a/arch/arm64/include/asm/sysreg.h b/arch/arm64/include/asm/sysreg.h
index cc06bbabed22..dc03704ccc79 100644
--- a/arch/arm64/include/asm/sysreg.h
+++ b/arch/arm64/include/asm/sysreg.h
@@ -70,6 +70,7 @@
#define SYS_ID_AA64ISAR0_EL1 sys_reg(3, 0, 0, 6, 0)
#define SYS_ID_AA64ISAR1_EL1 sys_reg(3, 0, 0, 6, 1)
+#define SYS_ID_AA64ISAR2_EL1 sys_reg(3, 0, 0, 6, 2)
#define SYS_ID_AA64MMFR0_EL1 sys_reg(3, 0, 0, 7, 0)
#define SYS_ID_AA64MMFR1_EL1 sys_reg(3, 0, 0, 7, 1)
diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
index b4a6f881c3c0..82590761db64 100644
--- a/arch/arm64/kernel/cpufeature.c
+++ b/arch/arm64/kernel/cpufeature.c
@@ -98,6 +98,10 @@ static const struct arm64_ftr_bits ftr_id_aa64isar0[] = {
ARM64_FTR_END,
};
+static const struct arm64_ftr_bits ftr_id_aa64isar2[] = {
+ ARM64_FTR_END,
+};
+
static const struct arm64_ftr_bits ftr_id_aa64pfr0[] = {
ARM64_FTR_BITS(FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_CSV3_SHIFT, 4, 0),
ARM64_FTR_BITS(FTR_NONSTRICT, FTR_LOWER_SAFE, ID_AA64PFR0_CSV2_SHIFT, 4, 0),
@@ -332,6 +336,7 @@ static const struct __ftr_reg_entry {
/* Op1 = 0, CRn = 0, CRm = 6 */
ARM64_FTR_REG(SYS_ID_AA64ISAR0_EL1, ftr_id_aa64isar0),
ARM64_FTR_REG(SYS_ID_AA64ISAR1_EL1, ftr_aa64raz),
+ ARM64_FTR_REG(SYS_ID_AA64ISAR2_EL1, ftr_id_aa64isar2),
/* Op1 = 0, CRn = 0, CRm = 7 */
ARM64_FTR_REG(SYS_ID_AA64MMFR0_EL1, ftr_id_aa64mmfr0),
@@ -459,6 +464,7 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
init_cpu_ftr_reg(SYS_ID_AA64DFR1_EL1, info->reg_id_aa64dfr1);
init_cpu_ftr_reg(SYS_ID_AA64ISAR0_EL1, info->reg_id_aa64isar0);
init_cpu_ftr_reg(SYS_ID_AA64ISAR1_EL1, info->reg_id_aa64isar1);
+ init_cpu_ftr_reg(SYS_ID_AA64ISAR2_EL1, info->reg_id_aa64isar2);
init_cpu_ftr_reg(SYS_ID_AA64MMFR0_EL1, info->reg_id_aa64mmfr0);
init_cpu_ftr_reg(SYS_ID_AA64MMFR1_EL1, info->reg_id_aa64mmfr1);
init_cpu_ftr_reg(SYS_ID_AA64MMFR2_EL1, info->reg_id_aa64mmfr2);
@@ -570,6 +576,8 @@ void update_cpu_features(int cpu,
info->reg_id_aa64isar0, boot->reg_id_aa64isar0);
taint |= check_update_ftr_reg(SYS_ID_AA64ISAR1_EL1, cpu,
info->reg_id_aa64isar1, boot->reg_id_aa64isar1);
+ taint |= check_update_ftr_reg(SYS_ID_AA64ISAR2_EL1, cpu,
+ info->reg_id_aa64isar2, boot->reg_id_aa64isar2);
/*
* Differing PARange support is fine as long as all peripherals and
@@ -689,6 +697,7 @@ static u64 __raw_read_system_reg(u32 sys_id)
case SYS_ID_AA64MMFR2_EL1: return read_cpuid(ID_AA64MMFR2_EL1);
case SYS_ID_AA64ISAR0_EL1: return read_cpuid(ID_AA64ISAR0_EL1);
case SYS_ID_AA64ISAR1_EL1: return read_cpuid(ID_AA64ISAR1_EL1);
+ case SYS_ID_AA64ISAR2_EL1: return read_cpuid(ID_AA64ISAR2_EL1);
case SYS_CNTFRQ_EL0: return read_cpuid(CNTFRQ_EL0);
case SYS_CTR_EL0: return read_cpuid(CTR_EL0);
diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c
index b3d5b3e8fbcb..4c09f87650f4 100644
--- a/arch/arm64/kernel/cpuinfo.c
+++ b/arch/arm64/kernel/cpuinfo.c
@@ -335,6 +335,7 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info)
info->reg_id_aa64dfr1 = read_cpuid(ID_AA64DFR1_EL1);
info->reg_id_aa64isar0 = read_cpuid(ID_AA64ISAR0_EL1);
info->reg_id_aa64isar1 = read_cpuid(ID_AA64ISAR1_EL1);
+ info->reg_id_aa64isar2 = read_cpuid(ID_AA64ISAR2_EL1);
info->reg_id_aa64mmfr0 = read_cpuid(ID_AA64MMFR0_EL1);
info->reg_id_aa64mmfr1 = read_cpuid(ID_AA64MMFR1_EL1);
info->reg_id_aa64mmfr2 = read_cpuid(ID_AA64MMFR2_EL1);
w%E3aŕ<`澇X(2`g:+@#hC`(yc IpF|k+)N#zQԔ:3k3:TJD/ -y/6Vr}Q bɸL}C^nkCdNzR~穊iWZE^4R|߈D:u|ܿ #@M<~kL1u))NeOwF/,xP8>[}a->>߃8#zVnz SgyjצYvGt4 $e'cTTF 88OC$xp6ɐ<"lnĕvΥs{e@D J55an@z$X.Rc (񦖠E|U8 D [$`(}]>K~hkI]bI6Tkz z"/  Oudugwtд/MUEJElm9r腰{jw T Uu%i7ꕬ1iE2PxkJ7c=]RL XlN#b9S$=b6󾦯64s|޴UpZ ""IO\.`j5ߒeWZ,?#mkW N"$'7Ύ^Ň=o+檖MزqkZw7ӹXHbr_|Z܆@|3+Wvw/뜈% vX|޷/r I+ɫ'aMrZtX$W AŐ4ƵY4Լ:iUMr\RҌ/40$$#fgjF\ͧ>{WEI Rd- 8D  @:uce$ݲ&v&6b&**/++~2=`0,!$6+O9h< ʊ ΒC֌5 VYrsЫ02sg+;YL9+r$!g̡2c#ƹ P02aVI![bDO 3枙Dxtȼvt:+3i|3' x~s?&#=ǕRȒW"C KYZXO=OXog՛@oK2Cꆓ؋pM=U]J&&\3ʑ[Qw:z?vOH߅%wǞSȎ; r1߂r qszD:?:oacf~ glH^8XZr^tL㊄e)F\nG*aЯA:DHY#GJ 6-ƄBFNּ,ͺ5wicXOܜqމXv9")fZ13ދ;N+ gxc vub+[r}p颗!nz1,a5 a !ۣOGn$R|d<뭊3}ѿ- <`kD >%+,"z*ۊ&ci1t^Qg6*gH"5.~.~2˿x+vO,+/Ps@R~k9L\C>YM]b43Wp8XI!p?MӼVт+w+Vls1f\꥜#a0 pC6XlB.6a$jG _\l<|[3IkQwo>c)ngr47O(+BFL9%cX˱}bIdq9xL㩽؁}\4Hx')yq(8Y #bť'TH˂ Qlv9Iu|0HЗ/jWK|)Z-xD·966N-0\n`V p2@wZ5zd۳[j86*xһ$p4ƉW7͘$s.~ҮИp5߂!QK"2N!C+:+ay@6Dp7*6fť8d!aP ZF'|`kL+đIl r2njv+[ҕvat 8 [8#v.Oɻ}`X]˽1+  ulqÚ᪱f@Q "BV+KE ,>\-S3uhOc[P[ >Ro (AGI0wkS4]y!PǪoPdCl/1p߇WÀΦtLr/'?Tj2;E2:`\9xg=" \F55+JrKZ&YTDK<9,{ Hf6XDHХa*z?yfF#JeM=f(l-EH)|_ݎ~5k='D|+oB@,X DžZ'3[-$6fԴY>͇$V׆s[!ʨuESō4c+Rc y$>,4J|>},.Xں f%^{YVW<7]h&a"2 r9n/H6l БU.b7s6?vCdqZ*q> F9鏉IZLU™@{1߼wq#&7/V^_^%g4ٽӆ;i[N-LO:iO'IQCGe lN-WwjpQq}f/1dEFa^?/6ɟv=lӿM*<'o} ;f?T*?;X_G C,4&ص4R{,J*}؜"ܻ,l-Ֆ6`6g-ϩȑ#yBP*hcxMpI \xh+ |r /-pK(ZD:X9<Ei?m<73QW~DjU${Хs_8}}e?ԋj49<[kY3B^K v^T*φwko:(zyw]m:uz?x`nS5c]kL}AJxh(J;\uSX l/5) Q"6^jtZot9FekL`~)|^lLٕWN}֕g;YG&nC4K- 6DʳT4Yy~ li*Ƭ Ld033Ul7$ aq?4$nz~ɟ=e-T=ϐw,EliЗ"r`@8ն eU'=Ȋ9 왘Tw {* rZYiSA=5Wޝ,VG4[wѤw{\&NSd)c<#.a02`Lφvve+4$y?! |4HKSOhIz mK$qoލ\2cdT:b4#pCY6,xbH7>,VG#5 d4TFYTbT El}S&F¥k\[MYQƾCeay8Sh\n WWڔ/ Mq>YC|o$$%&R[RF|Ghιr1p),;+_`oA9Y4y {]Ik)Q۫!\@yAzI7<v.: fL.O'L!  ]x<\OBLaEÞ* G{yab(mexyڻ3(1N,m>d)Tb\֙ܽ~mkǽez}St֠ Bt̫M]^R.Oݦ:z!g{κ, 3 &ݒn'7y- WFBVg^Fbwzo~>*KVqղkzuV?>E'&.K:kD&_Sݺ$ dAK\TbuN0G77Hzw4NB}fj: KvPI!^7~,S՜N۝N밿2`fW@&ME Z |d PqckwBϮ%[WNTM {XIaI], nQCKjUAk=#X{2>l #"jr:f}Rk:13X5;}%h:g 1'|+b{=}>Yr1F: xaی_Y倉m9z|j- jL$c# wZ KgǍ44 8{t`Xfؑ{J5iLkVYsz~vqnQ?15ώ}l &syisdH8 ԫINtwE shODB-J[.d&Y./f&3+nhq}5~[eI_IN̎!OzPVZ*Z.6v|Lxn:.uf%d3nH>?l`f6ڈ >K$Ł#2c LZ;=1 = =v[UKM2bdDYKjVP}'{{Aq.aT`d\UvwdkL0kc a:T:jTl6Q4#HMGUdmjdr6WfȦvw#dLd &<|pnGۛ.oG 5Lɹ8;9v`?nޫO~wfrh腟/NQCW\q9!hU~"A`Sz!K79F5'rRNPls ZJJjzV믇0긱[ җסicEMK݌.,4q# U`ץZn ٠v^1ף|LX"Bq]}g !aeci3]WؗSMw 9WkN+% r>LgF?Ւ&`AQ] qwdJt!Y]r {b7~c :ڼuGk7 7V#ۥ%Ґ!+ľYK>Cbg. 3d4Eٕh/7ڸS=dyK>?9c8H#8ძXI:^^#\{B8C3fg%nbrk?Wz4P&w,c4[L;;Hm%d!ܝmVo>O#)Bgç䊃wxՖͣq9tj Pu6N''t#$~1i>[݈MWsܑ*7˛9 er<_rEKsר## PWgCmj\OZ5VըJ[ m.;p饗 ^C`uKx-'s֩ xߠ[NeT|,(j!Eae7'= rH"ejQ$PH j\'OM yJccjt: %Y޿ 61SRT~lɂ6#~`2LxZbjduFvcݤYIf1 مr8BY w$7&J 4(hͫQZrФdJvu*N=c}}ĭ!A>6魂gzxQf;IS>g!6KKWW1 hwt LA7Q1W}t~g .lIj&iлژ > Vfs@[O9{3A y o3+dyx2Vlԡ3;oOɱ׃T:BtV&.բAN||۫&LHdޓt6V-Lh!YڻCU.2f'Cɍ2$,Lzc'DZxԃ 9vDLhf>>qVɸթTkqg䰎d4Td4;Q%)hLЎK/ؗŀ/%ʎRg4uP ̱O7dz\J, f%Q(l;{FK ME.tdSyAGs]n7joslQ8"5L ܖ(ӀWbiAysw6Qh;>\#w7#N ~j}W jGB:QYUx'ͱR\괡: 3Nsdw׮>nnYI|LwFx!EduS-۰V}4F" %Y.muJ>twHبw*ߒ)(YaJ`t"_<먀2Ȕ'Y[0 6Ҵ0(L%YCNms0@h;EmR-X4Uٮ:4q#V&d:V>DUثi $L`KdC:sľ6zɼo_1:lGI :4˳[9Ϥ#ޱ{Uo8^*Vz/r$*zM|_|6mzz8ό'+ƲU%;zYiiKʲ,F#Iu1RiT1\2l ʶfL\ \8ay]O#W"G}BC sJ]+x&VfP'8 6µ8ZvYk$S5M5Fr~n?N泜J.:?2=j̑#^g IL`X~G6`MYd ]%O@6 N=CpɿE ?ę t5$b>Xd,').3(0ɣ%zx}x%i{ tjE[&8sO"푩w4}d|BDn0>B[9X"X9Q8Fػ\C±!f50/ %X 0ȠY|4DV23YYmv N}R*fTɰMuT$EIjd L&53=d'z3=ΥOs-?箓ӕL ѽ֧5+-5~9 Cs"Zw"5{]qE,!k3b2f3̦5Mg,O?^'e˿E/$#*^AVnl Hlj3ww'K1thwl\F ztek?G-|/$#HR5pȰU[MB Z@=UUQ/RmY>^_Gg,>-V v^^\-3أe}RdG oI(a0I^JPV!z9?]ۀfd.D\ZDYe2)4r6ZmY55JГs;Rh'ɽ| 7כx GCul^fd$!P}&ԑUYǂlNm25h]Rթj_RU^<9EVgUv 97$XdVڨ#8!CKq ?}h>#):zTyv DZıVG+!)R^oxCr?гR1;O:Հ}M#bwk,#½LֶG0u<}p %(_iE;vA'z. _U܎ t"+"6WOW^xG:bt18 W7p^kb^ ?F.w{>1uJA(yE IzC'9x'T.o v:٥Y{p{ ^'Aa iģ"6@&h=Ԍ B:$ d, VlA1;ְ^ZI|ư=V Yy&s5HV (c.6>LC'OIMzt909>dMӴ=iM i6zIۡEZ> 2c2<$qH*4%R=)A! 4[8>4 zFR6Q&Cķw;<4^&Ɉ2;p)l}LTAfL}m[ldH{}"0:jo;KW"rs#_ TbC{en]/EV)0"B # +Kewbqr1>&0d!͆9͍7>c,ҙVk\^4螖*MR Ł-[FGh~.ʢJb'cfp z%5KèrJVV~yhH{WjhvIitzG pPuB~p9lS?W\o" A~+; g!٭߂.ȋ#qζ#r$Kui[u@V3lяG5u8zw Q;o.Wiaz_$!2zB61<(Dӡ_I<㑲!i2Haː+7'nvݎOc4(4[ Iq2#q?>C{=^šxh^X0L6YK @]n|S|<\3n8![ФLvt J>;yihE.h#>“7#xRC؇>S'OewqmjǍzI==Wm#Mx@AOvjy} nhn9RF m@E?Z$Zg00Lyrzبfj|6Mf:f6]۞T,h]rV{p\ X. }}l9!v:LN< EGEP.@O 4a¾x!GZ@%C^2hhsP`zI#&A YxUeq|J ;xCêP|:RWf/_-|㱳Ku}ըQѓ_d]!/@>w-U#׆3+!0M@$I^<,~h/) KT I><`Em0j[%|+j|r0۟V Kp@ OCV-eX&DWP Z \TY .!I 3JܟTK< dyag'/s&eCEds ;OӧAJ: >qh"s 4z36lTYkg|y&(?)/lg|/{1䷼8:kIDNk3M !\tG.i=vI5H4#XA$Q-0غo"%+{o2o%II}x/%K vOr H-!iII{7ٟmsW,`GZoAkPvwXթԁlOj$h{6A@g(#U+1f>DJG|)@xq%FDFB!BX&}~;"Y.&3' ^8~@f I`WѴuH@4ii&-@Vҡ8Ƭg؇\f!HG/#&K| :p$ ĉ48bu4P oeuƝjRNK][3z` .׃{x"б[U~/UB3e Rܯ#ll1҆DXb@e|/# ,~s)@e@gDFoNJ 4xFKMjA+&Cb?ԭU-\|-Yi Z4 U0U_UoȳNH7T|r}ݕ4ejPxbԑ` "eKL x}:~x˙N4<*X1@99cl)C{QL ߷@T RtoAGEK&܂.G@BIb[V 7要Wr(3E@B8uxv3 GWUF|c$ׯV9j!ssCo_xjpˉQvw\A.{ wϫQ]wMN mj }7"zmT^}H,;wqdz&9WMmi!1VZxU+N2DvW~'fpv>F5TQ#LM@դdm4դ]5  YptǢb/IpO%E|p%]&@k&f c]E zd+R"8-:^oI˔Zr]CJϭlY s+`bn~JN[*OܢrQ3HORk ~)ՙk<LUV?8u^suiHՒ)O6w ^fB>m2_>;x)ODiFXOt}G=o<#Kc3 R7=9ICPZ~5̥Z1R6dvM]ے\d\(_8L'p~Y03 1ȏnH" 82bBfxl),Rvz.>=I? !Nwagg}N.#ِ2,wٛMT[+'!< `ČpkޤP5nYdtStR ~@Zz63Cr]Za dLa#"jv8Gzu\gK?wg2EZ:-hUā6QݻzM?  ;Mn+vtrdw`]xt;/$EwR}Z*)0b` -U"hzTJ[ 6.d aUo7 ``f)G#CD-"gP"(빪}A<Im5pAʃ4 W$%#Xbl HۂuQ1JF"wsb34I騏ʷD#;\-yIe7Lm'\h瀾reGdKAE J_q]u3<)ҍ Gy5CǍ x) թtqb0tJ&. "4 zZ*^&$xk|ȣz>kBQ>BY LM $!#I/'G# x|5)~#Hf X心ƔLXz}_*-Z>5zb^'gMق>fM ;HZO 7ՠ!`}C`N̥=aוt}^h.FxIKZAWL $(s~`*_j4@NV~6sGC_) зerG ີwTRHO=KRRZ˷C^W vK'n]sU kE5i-n0P-#լku2uq! TrSF[ӧݣT@v$rWͮ]a,p8>gKALleLSC|,ojsO/l/0iYm>4b>o bI0RuCyͣܒ we;It{dP2N&EALn.lG.>{Zu ;{ʁ`EHm&+T=DȷڎM;[fSc}~cɼwǖJoҟnӂњaP0L n\h)V6$oZ @(bcZGy:)p6 3Æ?h`9$lݕ7ͻyo4 6}LR#;/CBI u9.u^>rR| ۖFJR0c+Hܕf՚O[7YlFR]&JTOuL>4VmOhY*[ڔ&%QXP\DSɝIZ ?0FnQpʖ ̚<{t3oo̶5mGc N;i|rn":͂S.c&<,藞^)O)9#(~9 l*UL6zI 8 H榋U3J^`L83{ᮮؐ*Hy(:85^235֭TvIMӽ!;|J5M T(-ӕ<^DYe5iRk8!}dz4ݛm& r8!!F8D B(_G'e&2BV]-dE> H17ZM-:F5z[d\xJ S6\][/eVlb \Gȷb8g Á$uzqfQ|qAa2xu;z?ty?xZjDU6a闓4P^+WO /dA܆>nQ 饀 :\Vt'B51J N㳮SMME_Ex + I4Z@H']L&'(@2bO'V{ 6T!vs"Kl 2´e7' n]w =u^nKtH}w;69rrF ʙgM'/ wG1J&70i_OLB L/f;W>R_=p0TЬl?\j_/)i2ܡN5}/?A  irSW]h&TANjfb~H4c|]+GV~֗3d>{ &S0NGPrqRW:bs͖jtTZL4I]MkNi_ޫ0;hu[ˇ 3KSk %9k.I,B.u9oHJWD{+M <_3 _5 Ae^P(%ց^, d/:sl's[)N%I|en(csJ':u;'ܫIYǓ_͓ݕKo#Ԑ'PQn)A4b! fy YjJ҆%iE,wiYtٳnpuNiT T@/rskC8"O_CaME4d>mZD nw _!3tp@>_ʍZKl6Mz/ٙizr`)p\*oi#㞍2B Qd<;6{瘑 z,9X'EȪؚL 6|t5 Wнhlی("b\!2%̝- '~A^Bs'Feϫ|\[fC:Qǘ;N6&&Aj,jj֒NPrX'/OA,O䐂4VjhL c㖞%R׼${R[ +`68+f@0C媾K6iv>|J9=l19bԳ^C `YȆ>sZNATaE,̊@ap;ďד| I3ZF."$Vc!ԪiZIu^)fs>Jmu/۠Oϔ l?Oq=ԛAMEvD)1W׶rzE]^ G=Rc_9ce;*?냵ҏzU@6$ 6?[7*mщ5U\z[|sSxuт=!IѲY4z_%USO=g!'e^[l' 2ds6C \aO'k'7FMsCګrhĐ_DyuǔFc1? mK׼w_:Ou%K)%^;BL!OQVav&y@jO{R仒w%FDnu;fSE5Nʥ3+$䞣dhzWl̆Zd^On7jljA,.l)XT[d6mH Ӯ :K{Y i-= ؋#Kcs]w}3DngVM:&wjąJ)G^zp:kӋ} JCloUٮ˭v-WŵM<,lYl]Oa)8ɳG3$Lŀ𨚮y.񹳍E,qj E0Հ9 j0\>A&҉>'ë<1^ms܅_ ȷmK u= +'Սt4), ;Fѥ|&0L=g^>.4ef\{3:.{z[e~:f@} qYc ~ݹgQ`.DGGuNdsct&~I}d6Ue˓H!E- NVh=>!n $PVf97俶=bDP-N0U^O (Bh~U+GaEzնT #*y'&Ysi+;K~tdyyMȨ_KlГcr8!&[zww&>N\ rGI6׏cnx<֥s`7l& L||ac TBeaǏg)Koe |صZ;]X% ^WZU@#l4ۆ7X[ސ?٫K5<#4fl;i2bɜ%+$%unVlfё4j q5N،D5 tI <"a˓|ڞK7uDtXdґHA-W0Tc ֦F]]!ɮK<0O-zm:NvlG/Ѵgt& Gr>ǎw)oV% ͅ sK^Jol6~I /d%ywOH.rϱgM{܊љ+g+we~Ҡ@I5GOoBʅtOjXݎZ9T[|Tyv`y]0e^fIJ +Z:c >ðshE]9Ϻ~B=Q/Æ_MT;(@!x-aQؿ![gY0%_C$Œ"փjwڭHy62Tӵs6+Mjo6GP84c-9!PTSWi Zv<[d+/wS03rX:/{5uWM)-6f;eHwIh ☀M?k͇/bR8Q߃|)fR$(3(/wɂ~W}CR,J|+گ2!ESЫZP #5}eU. fhUu&7_^ݖ~ԙǨWA׶ߑH'ヹTf1Bзߑൎh|?Xnbu!/}W|<+G3 g>Y|01io'k>+A5&jҪUV}2V椭6mk" ITo5.%Vv-KSR!^  $wZS%'9OuFumZA>m5;hZ룳ftcUHuL&e4QKt[e"`g2 H+ou9# K)ƧtmsV###%囓UуhH F@LZKkdl!Ujr[+2l cyA{ϵ*x9`r6-]Y,jnZPc%ۧΊ\[3M 4n#A*rV\ow:yy1dN9[fUnahZ)ӗ(9$K,#+{_F/pxl'Ev4=mư:mr$:#ZQA[R6-)Wp c I '*C:H=.|B:eOm]9mA $Std*P}l=a5iU1^4T!#M뀽-bS1}9LJ-+`0H!z9wdZ#)m0a րA͑TK?nvT~gYq>u& Y񈬷fo3R f)jl:uR]K8C6g/gm ]V>:5^I/.5 /ooxQrai𧳍bz-*VU-Fy}O8qd4Alr8ޤmNi5$#\?a7:^d,Q Oͽ/4$td"$UG;[ՒD{[ˌh 3^ 8ޏ+5r!t;B27!|k71>n݌\7Yu%pcigZ YkWMEzaLgjȍ^_ d>N\qzV}`3l"!(2O"كT~㗃\S{xR5ti@H- 2Bߒ/dkX^0/Krڂ=`aJuT(s}:U; hq|j$4kd{DByWb?^i/!{ɢUQβ5 0Au$&ɿR/n]9j@+.@#HbD|Wrrz,w;㆚گaO{լi4yUIc d5Ix[)f5 Ip$~D$?I\Xt'l|gAŰKIr `/ڄI~hǎr͜䆪3|L^^iVn)wVdYk蛳a(O&_zWF`R}2J6V#1SM R #ѱW@Y8[V!>=`DAq#H@͟RrP/+yլj=oM3 #l`ӷ-v&if765̮/GEB VmɰƋ>v/4⿴m R>|4Dž]]/ !!r$$lВ7l^OMl2PhZ}iʊHڲV~c`1a~aͺHI?ѵv.Y DZZrAٛd4;E?9"q]ҟaxl/X &b>׃x0ə[8R49[5t a "K$oZ>G IpENQS }KŢRVO9ǰ̏hfo-Dsէ $%NKr,M7 Lk A:9[vFhpm$ִ8gFy4oIm[ vښa0/o~ aG/lQ;~⤼`Ӫ6|! 'X8!+ L;&r vqŎnKHnիr?AxGme2ZdDvFGX_ vW+4P7ޖx4t#Ë ߫|6rA*ֹ{ .\T~"hqC]#\ė](mC ҙMdDõv_Oь/g/ $3s&$uP6Vר'W^#򏾓cAūlę Ntl$@A"+.sVp<89%qwM6"kT1,(Ţ٦sͩ ([;|;/;'@B{R_立!B(YjdxQy ߫&̎7ߐ,qo!{{պp zb *zW6`UXu~+:f0q']utN:bIZ.sX/uއ/腴Q ]xݵuXmd-Uן;}.fKh1XȸPj6ތυmtgڧhGcXǤ[-׻ n!ß5>zhLՠ!Vl^7nI=7SƉrAH;4V2DB hGKk6ma>B"eX؈=*)klRO\nU} [Rs!G[h%(~pݗpOυ]xh4W9ʁCCP'ƼڛZ&(c2%FߘK%U,?$c)ɪL/b8c\l2kg`|Gtv7'k-(d`'Ž"%iz>bEn!NK϶ vt3X>5.w8:(g_N)3LrkHCQfAZꌼ 6[<8}ȧuWf{rqObF ꚙ,P#sF'?YwxTGp դQljM4LVz;_H I"_v(l%b{i{fD:i&WĚ%sܪL}/ 69s^ ڂ9l[yI?ާ]tV˕gﻍ6$۝ݽni F "d xYg9:^ԕ}O6f韍* '5wQ֌OYI]M|I~ _YPWa۱C=s^ZWz.|E `TRD4OO!pK{% 0;by_^r}uo"Vf!b]93C)O_NvgՒθ9&}_H JNm԰u0zюT` }hvA@#I ҧɓ ފ@/T*Ws׫m\!mbߪ%w8F5KO~{<@GL-ُ5v1~s9,0UnX)=^w$R1˷Q[;jz]nKl=dFRB߹ 2C곛]1jVZ:l*)j!%9Ni|>^@MM)QO}4 zo|v0~AkP5)$cxt 2}mƷN}N#2V:j4MR+{̘XkgX57 7Ƅ l?u ~unJRV% *H<&*8dCb$ Mx*sZ.4fxN{"ٜHBGZtWORphR J,2C+;q'եzB[V-t/@ؓ0яg+J/s) z&j+}kUB-@KnU0$U88u)p-T4"hOGZQO!gpA-01ܕYYq-4oHc6c¬ /dCp 6,`'LS~8y˫4. fZ״{u7Je@r7`ͯB<ŕǠ%֒),"<>p"sw4fOf(>a@)IvSp̀|}iMwk꒱eqķUk(=+ZRz"so !KY!ެ6ٽţ=l>d wg毜TY.&Ѿh.5zɼTY&$ճ̙W:XzdO;{ Ѿ8}G'DZA䅜k}'5bu6<.`瀉MKfŎ!Mu@*ac)HĉK!d0A~sUC-Tq儁4>h?}_10HGr}^& IWN8X$*7?Μ IВ1 }iQo+Z&5bé (Mupȥ5t ՞7$}NQ?Ozш\*qL>I.2\0^Vn:471fx[xZ"ܡ']Z&yŤĻD :!o?:Ij?|ߴ"IV<B&t/,r¯8}lU7_n4RfP]dĚF-ϖ,ll)`ȟܽ1nb4^>R蹙:_b+2kգƹ <`>Tl;1}4cQ9sZEfkX]ԸC̤z^O;5hYS8./BVWA4hWP]&B†Mu,1;ʈ;'_N8dJ+M⬋z,.37R9-0GKw6MUS][(BStWږc=}Ⱦ>gޕdX=’^ --l+苕c`Bm.}Fޑ fdIN&]:bIji'$!?%qJ0,꛷:pBzR{~|tNx:ڪ9tTo2hܤiלQT5:jTmWi3N:` =$"|q:^RbŶoJQȌ} o]2-CxCM.nr|XXsDeR#5CG%;DbE2dGU@Ngg1u椴|[I-鳀>|7uW7B$- q] eB#ʕD|\ JeJMY4<nTKTwh>ZҘǚ"MKop0yזd& z_iӯzk7m%(tMml(|pDZ)9 yrs-4*Gh1ء2a0c4\G_ˢIY~?I륵M [ zB8e\5%߬6:y%z~S_HRnM4YGdb$Oq1!ݯz$/dաs2eҢJ"P=Hz_ =MB^ ?5OӟPU.ȌdBP ˜ [PYG\ą #/K|/͚ցR i0o?Ep4FFHuFTm`XU!9 j2ltUu؞N6U8Cv d7:Gz'sΣm~m&xDk׬!qsg_PfiIqۧϳG fbG㆘p{rU&=?V:J! `~@XVkBiXwUgLf:EH}Hʩ;(HzxMr SpW9:hiTMGWry ^xI;%bR`:,@-_˲'[ Uwq7$g,$N:KI3[8%t8K8q"!'@+>.e>_1[|iw3]x ̟C{De{XNFZ@G rqR;YRJt1 :WP8uiV1l3p 6 {l?< c il'n Ǘ/Ql, ʭ*H/Z$׎"|І^bc7}KYo/[z7Lۨi]IMB/ @h{dT Y} pkOUZJtN՚S5i fU}vc@ ۃjԛ zoKjTҲgy\g|jG#5)BzoK9ܵ{$챝vU6SmWŸ򄦙 >lOSAF1GŒL"3Й*47@;LIgo-2(F[Ϡf[I8  #Z#[sV+ufW3ȯ4jVM:쀝a8"lZ](-B[7C/-NEӶ}dD;_/2}ЂPS]a4 ]X11ys2bXn6.H4Iw*: MjgLavm*3YGkO_YՉi!]!ȗ!He<=xܭBgU⢼u=;fjOphȡi*dHp >ԝd1]OXv֡9>`3&rz|9sz S>c@%v^FW~3< wlKQ{?ʹauԟO?%uiq@SpC$LBcZ;c0}p}Yg lGgstg{b9.՛kDɼ 4z ;)uΟp :!1"WFk2驄-Mѥr5")"Yv( dүGJfRD+ˬzcFU1|'w`,ěnh#Ѯ^hT  [Cmm$n.!!~|ZNӺ. ԻӻRv.p8^2"?40Ѫݹ:>Cy4zӃ~f!Zi+<+DMU`oBMQر]ros=ie#K;!:4"U侻OI<P^l5/j0Cߤy(<źՏ7hWhTK*\!xT;Fn@"3{COx}D!V:n{݆jLc:dvܙU7l+՛:`6O8C,iI~r_r*35-!U/('Sexs}2جk;͚N`2QTUkX4xͰx>-%Q\-8hqʥf5,a5BC>]nBtr'-[AC55ʇFԂqgA@;Ep8Ii3a*a Ca~6RUlG]hB,ݬu$xInY^r x /k4 g×9Hv!pZ*9Aov2ǷaL4ZK:$ ׆eAb 4_-־#KDt\ul`W£  +/1g\'&cSB(Z?V>^ݤ}j/g ]%o>:-]n 6n'or1k8vq\3i!;aaz9vԢ72ȼ2nFW2o/~f ! /A'4}5{D{': ]QOA"d?p֥i%ȕRŹ.dĺ&'# z/D ң9f}<>}2}|}pn/_I/_>ЬM]Nz44d4PQwˌ$}M}srKǰ}d(V-ӚwU,51RW Tуww.f[9a>9.Gm7cьIGْ.8=_n`K }Hww2/ip7zsq9F<{nY ͖DSY: 6A4|pBof}R2TLل!"X3,`}: g{*?ӑɄqcPC;Nh sp|zatpdogsX23M7j<]P[|SK/X nず>y;=vWl 72UV6XU*gA21u.WhS )VFA*Cg/^Nhɡh0mu}ͶO/ep:F80͕urrp=l\:  %`:h"?s^GRcQl\' piIB]{&$/:8H7+~+ZK~-l3& cgD]QRlnЧiZ[ed_& @0<\ LU?w&C5C-4MH ^'ep. 9tK_}p{Be܎Pftp͂8`/c2 P_T2}~@GcgֺBb09թZ*#=G"Kv>RnOdiaS-2HzU!]]RwՠThcH9Nj'4)rJ h\NŘ7]ML+;1g >-9u|ȓ?,*',.j#izVyղ\?BL%Q \_T6=Wo3^5bHgIN-5Ռɝ<jiIKJ-u5#bP瓈!򐵝Yk@>*pخ5;3lUuRjrqk鐋C˔v.Mȧ pA*FڤUˑ@ҢVez\?!2K)x~9GZ J1ޯL<t~fA~PCh5+mo"#F\imphE ,0^K7D&l k:@]mcx>bK:>zY7y<33Szsc`kBaG7jy-J W^Gp8S;I-HMӮ1yT,S٫U[ͬUƩw[#Aur ;dnr`#{7?Z:c&q܋_-8$9T]^hң57cT5 *{8@).yB! -h8!`{yJO^4/$hџMp ΁?C֍Ziy,IJB5?>H:U~gEIM/ajNRi4vk4J*\ $ERk'R^X%t0|?ht> y/j:/`\y#{1 Kɠ&bWhR7o؃P^a;Tw*csFЏiDY},ep86N\4&{ObpP~Jhޑ۪ LRR ^^-7ZU(P | 6^>νfl#'4Wc??Ijf^sނ~!- !pqyw)` Fa?( @ w#yكJi0芸wtD~ci"4\J #-кYeG\Hn0Ddiiu"GHg4ZEX&d I1%$`>sJZws8yR&r ŽYHWʕ~B~2ZaGDiU <뭕qmD5 Towf/њ/4c7ӹc.60CVIj Yn\5_# ,4֐lm?*]4P#2d[AmhWki8H{eWm#XKfntfv=/_H ٛ@ W:`P{\ޠyGlWD>2ş׎NAahg#*Mnܙ˃Kfck[-wHRzkR' M.hq%މ\m=ނ u_²\d,0:j rhQ==Qj @6 0 l\+'pqJ7?l538ƶEBL &^d#{$TT@|. P> _Fy~;loo>ͶWM%/B'ɱp isCr*v%2ɞqOVl3#5?Ɂdj.L70[X5$&b4  %^P˾ T!K k 8'8b8fTG4%ۭz@: |A)*,(wCՇF5MW"Po7FנAS忟,`ܢM:{x|t]qa_./ 7́.?ŊçnEmVǡDKJ !C\n_5< <xkQlYhY>5r=, V9=( taj8}㼾U&{f>tFMd3v{ƚ;'ׯkYJO뚜2 ^lE* L;ݙ)(>qAO!>k -Tٰ<w|BE.#(9urF4H2 8ѿE99`u"L unyf&zv;l{`yNQ'\1MM>ΰ#e}ԙEcFֲ+Db(s2|tŊsw-'^,)ܧ>Y5z+ЏI*e(j~H a*9ai+Op/r H7ǵ!iI6_,mn"܏z[};WK&hdz`͍XZ7 WgL,, _`PPy:}!"wMjOQ~KLr&ED%h REx)[(΅)=@*K[q~\m=`~=+y胦ۏgl[l8yzEBQOխVQ0Y=kЅe1OT?87Qmɱx&qg1y{G*ycd$=Kޠ)=#oGK5aTL>܌ED9+$pV3 OG;-8dv~l#`=|ڒgBdqqJB ,KjɌ|(\yKhɪV/MkG)yt8̾(8J6;R !Ibx@=zJZobmȓCv9W0 *"SJn0!Ȕ#h)Q\bpU?OT\i{>c屽܂L&ŹKrF:˛ޔ{4ەUhf2Kғi:p=V ۔pgm'> kNOЋ9NuW=۲䮜u;,i1bՏemfڧՋ^ըܢմ~x^0rgژczU~HL XrǛB3TIVknvYn0r/{ʀaI:Aʶ[1Īu 5aZo122 #]#h"lEεboX"XѯCRlp(@zH{.l$Z x:>8)vesLnQLt2g?xfa}KĹ>[l9)F.:1Zc9 Щ_s7lh̸eX~Wk i͎'2"? x+)[`ŠJ&/KfF|! zNpq nW+U5S9ݬ.oq,R{7cB?DrJ*V.o<-f?e߬Hq¾ݽ⤀5 pyb.2u /KhR|wfMt^k l0mg'!VFހIS:@ )TKW>LZjRa0%ˁ2᧸ϳ\0Y w J{׻򹍪۵F yff'Z@{]FgpyяmH=z͂e2<+&8Z_=񱲔Mr6>1=\SWាf|OB;;: avPmȯ5k&r6IU! 7ԼUV5{R_\ bZ|MJEDEZ3>zƝ^Gnq*ξ>U6JdQ/*Hc-ZYܳW;~#8utG=m^.%ωt>w5.ٓSZRHnlt%-w!'ܲF%Zk{x[BN8Bi LyM2}SBS44+M$9ݤ9JϖFP~Q"Ly;Nd({ApqW^( ,bdpru`].L]$'?͇Ti4QWc4z11C.?WLß\d wksu&yxA9!=ߞރ\fFXo,3sC'3_\=Q ׹v=ggK baL3K~ڐ*r9cФ%j #.d.Cqxy+hHNzlpmğk0W-cן6mF^RS0u8FmiH;]. hƴbs+'wӜÌ;T \1eVtɎܿ&k 6;ԖUөjSmR(8&tÃpгsȶW،,uV +ϕfGu9}y$\0yҩuH}YK''P.0Ў4'Hk|:wFZA6%v⎈51ɀ=( Vt#|tfd{r3bBփ1`ieɟt-$+-2x9p!CbEラ7a7s(nWK68Bp膫@0=Jd 9ްrD_uz\qELE׮'L}b@v$-a{=:ޗkvTQ8zydf8)0;ǷM7AK7(O: 2Eor|ԿM9l*tk@pf&̍nu'?SAԇ(h2E;*%b1]W@O!TO+^& 5Y+C$ޞl=rmV_ jaEJLYdhD#VƳscnprO}rH>.l/x\eiIAx[}8j{|qa!,Z$I*toNs#P~BnעZ-t7| `Mi/0 ťoPݦNT]jt5Ro]khu S|sP󤇂r 5*t6"|6@^6a3" #zC1:Uq&,^i J $̱L¼y+qoYsS4FIs{i<׻ˉ\+Pt"v$,X vݸ?⼑3ۃ( %LtDl)X3',3 \"j!2åN+KɖíUԳ'Er̟5!OV)ItR_n0x@?8uM#j9o<֭~C}h/Jl?. Jn8&vQH Yz/;r0y [ T )5EIN>CE!u^Z,ɷ|g"(ȋ+"@ sޑ0$(LwdύB$h/Ry=o߇jP15-tcE.A5 4| Dr`hk{ 5Dkd1ީڊOC}FiJwiC NKIQ!ƀ2펪N= hT(´ǭfB)+?'gn8r+r2XɵC}\1*>^pʉf&j*t䘩UȻ6"#bGTݺN]i"ԲS~rq"d'[Œ[Jo|'cڑ4ewTے["r{ƌ.qEo+%9= Hj"mG5eٛ4@|k5p!%[knTVɈ<\+9ۮD/&>CmuEg@54Mb PڢU ~+ѷ8;%/3>X\ OZ $?:]ZY0*?>0M`E?fyCa<.S_GB;{L$fZC"/wuvPx+S}mV.M f =8cix&(P#e@=5lr&d{"%US6_ހ>w/w$`Gn4h5]֥2>ð2 `&u&xME+`2Vӑꌁ'ڥcX$cOzl 'VuwF:!I܁By%At @1vqXW!16qP >)\Qȟ..m6a0_Մ$= ȭ\zqmS͔PVƱS$C2bĺk%WGRR)xG'o< RG WLz_8  8G/™\||S].Ơ ʍrZ9٫6{/w}`2|8Σ@7'V~[8>>dfu[mQcjM&!cZMhTIR5եzPxP8ەHOlT]ܡLמc;Bg~?Nc_`dqAg J7zhqo b\ >;Ovi( x>K2`%|ׂLkb;V֐}aaJUj)IԏvANqz}!nbR_GB7;[ 1/kNId.%cX5Nj3i5lM\}\.||5bh~ ڣe2S=\ϔ6W)1}wt@55M̻dqj7oI0\@}Eߖvb 2hTsފBd?ڭvb* t \[pi0 6D$zJU翍,cVqCw ӓ$}yg\T6XIc Я#Q,~f,RN+zpy5Jo6٣lKd}4M5U;fptG? m/VG,.35;yhS;NSM{;sW>T+DrS*Jg`dۑ8JW:QdMc"KF1+XؘtfEFw6%ϔ`YR2lIa_ݻ޾-˛4كٖ!rJ}5TB o%_[cƃy m:E$J|`O>ҿ1-VT<B629A MѓiJ^#b-F6gd.44fw8vVW.ֽAӑ5ԨM5P8%$7~ %v+18oC4Tt2KIs~}WRMI[рJ*vB'!:Fx'S*֮4?@qy9ڒbWW] Y szx cpuM T/7]'ZzdS>?+ d@+s[?35A~bbGPLrITt$} K˛ϹOZk`";\&0'+ڕʥE6y)&)5;ZbRy6G1/w{tǡu2j"c[!(}`dрG7OG"9< Jl½r #^"7ѓ5 qvOݶ({Ot^ϧmF?*"w,S$Uyj yrnU+h/חg 6#È;źѵ!; N_\L5\f ]I8qd9X?{>:EVkRZx7fvds(DuJ;zĴ heƿ'Z؞|ƔX󌀃2!Y6s'SA=12% yɐnLc'ik7zef7 7w" ohKL=$̆~$/3#wm'}܇b/ v70ݔwQ g