summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@amd.com>2024-11-04 16:28:55 -0600
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2024-11-06 21:31:36 +0100
commitb79276dcac9124a79c8cf7cc8fbdd3d4c3c9a7c7 (patch)
tree0ae35fd8669dea40d3718625f2c9421e1fdeca22
parent59b723cd2adbac2a34fc8e12c74ae26ae45bf230 (diff)
downloadlinux-b79276dcac9124a79c8cf7cc8fbdd3d4c3c9a7c7.tar.gz
linux-b79276dcac9124a79c8cf7cc8fbdd3d4c3c9a7c7.tar.bz2
linux-b79276dcac9124a79c8cf7cc8fbdd3d4c3c9a7c7.zip
ACPI: processor: Move arch_init_invariance_cppc() call later
arch_init_invariance_cppc() is called at the end of acpi_cppc_processor_probe() in order to configure frequency invariance based upon the values from _CPC. This however doesn't work on AMD CPPC shared memory designs that have AMD preferred cores enabled because _CPC needs to be analyzed from all cores to judge if preferred cores are enabled. This issue manifests to users as a warning since commit 21fb59ab4b97 ("ACPI: CPPC: Adjust debug messages in amd_set_max_freq_ratio() to warn"): ``` Could not retrieve highest performance (-19) ``` However the warning isn't the cause of this, it was actually commit 279f838a61f9 ("x86/amd: Detect preferred cores in amd_get_boost_ratio_numerator()") which exposed the issue. To fix this problem, change arch_init_invariance_cppc() into a new weak symbol that is called at the end of acpi_processor_driver_init(). Each architecture that supports it can declare the symbol to override the weak one. Define it for x86, in arch/x86/kernel/acpi/cppc.c, and for all of the architectures using the generic arch_topology.c code. Fixes: 279f838a61f9 ("x86/amd: Detect preferred cores in amd_get_boost_ratio_numerator()") Reported-by: Ivan Shapovalov <intelfx@intelfx.name> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219431 Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name> Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Link: https://patch.msgid.link/20241104222855.3959267-1-superm1@kernel.org [ rjw: Changelog edit ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--arch/arm64/include/asm/topology.h4
-rw-r--r--arch/x86/include/asm/topology.h5
-rw-r--r--arch/x86/kernel/acpi/cppc.c7
-rw-r--r--drivers/acpi/cppc_acpi.c6
-rw-r--r--drivers/acpi/processor_driver.c9
-rw-r--r--drivers/base/arch_topology.c6
-rw-r--r--include/acpi/processor.h2
-rw-r--r--include/linux/arch_topology.h4
8 files changed, 22 insertions, 21 deletions
diff --git a/arch/arm64/include/asm/topology.h b/arch/arm64/include/asm/topology.h
index 5fc3af9f8f29..341174bf9106 100644
--- a/arch/arm64/include/asm/topology.h
+++ b/arch/arm64/include/asm/topology.h
@@ -26,10 +26,6 @@ void update_freq_counters_refs(void);
#define arch_scale_freq_invariant topology_scale_freq_invariant
#define arch_scale_freq_ref topology_get_freq_ref
-#ifdef CONFIG_ACPI_CPPC_LIB
-#define arch_init_invariance_cppc topology_init_cpu_capacity_cppc
-#endif
-
/* Replace task scheduler's default cpu-invariant accounting */
#define arch_scale_cpu_capacity topology_get_cpu_scale
diff --git a/arch/x86/include/asm/topology.h b/arch/x86/include/asm/topology.h
index aef70336d624..92f3664dd933 100644
--- a/arch/x86/include/asm/topology.h
+++ b/arch/x86/include/asm/topology.h
@@ -305,9 +305,4 @@ static inline void freq_invariance_set_perf_ratio(u64 ratio, bool turbo_disabled
extern void arch_scale_freq_tick(void);
#define arch_scale_freq_tick arch_scale_freq_tick
-#ifdef CONFIG_ACPI_CPPC_LIB
-void init_freq_invariance_cppc(void);
-#define arch_init_invariance_cppc init_freq_invariance_cppc
-#endif
-
#endif /* _ASM_X86_TOPOLOGY_H */
diff --git a/arch/x86/kernel/acpi/cppc.c b/arch/x86/kernel/acpi/cppc.c
index 956984054bf3..aab9d0570841 100644
--- a/arch/x86/kernel/acpi/cppc.c
+++ b/arch/x86/kernel/acpi/cppc.c
@@ -110,7 +110,7 @@ static void amd_set_max_freq_ratio(void)
static DEFINE_MUTEX(freq_invariance_lock);
-void init_freq_invariance_cppc(void)
+static inline void init_freq_invariance_cppc(void)
{
static bool init_done;
@@ -127,6 +127,11 @@ void init_freq_invariance_cppc(void)
mutex_unlock(&freq_invariance_lock);
}
+void acpi_processor_init_invariance_cppc(void)
+{
+ init_freq_invariance_cppc();
+}
+
/*
* Get the highest performance register value.
* @cpu: CPU from which to get highest performance.
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c
index 1a40f0514eaa..5c0cc7aae872 100644
--- a/drivers/acpi/cppc_acpi.c
+++ b/drivers/acpi/cppc_acpi.c
@@ -671,10 +671,6 @@ static int pcc_data_alloc(int pcc_ss_id)
* )
*/
-#ifndef arch_init_invariance_cppc
-static inline void arch_init_invariance_cppc(void) { }
-#endif
-
/**
* acpi_cppc_processor_probe - Search for per CPU _CPC objects.
* @pr: Ptr to acpi_processor containing this CPU's logical ID.
@@ -905,8 +901,6 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
goto out_free;
}
- arch_init_invariance_cppc();
-
kfree(output.pointer);
return 0;
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
index cb52dd000b95..3b281bc1e73c 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -237,6 +237,9 @@ static struct notifier_block acpi_processor_notifier_block = {
.notifier_call = acpi_processor_notifier,
};
+void __weak acpi_processor_init_invariance_cppc(void)
+{ }
+
/*
* We keep the driver loaded even when ACPI is not running.
* This is needed for the powernow-k8 driver, that works even without
@@ -270,6 +273,12 @@ static int __init acpi_processor_driver_init(void)
NULL, acpi_soft_cpu_dead);
acpi_processor_throttling_init();
+
+ /*
+ * Frequency invariance calculations on AMD platforms can't be run until
+ * after acpi_cppc_processor_probe() has been called for all online CPUs
+ */
+ acpi_processor_init_invariance_cppc();
return 0;
err:
driver_unregister(&acpi_processor_driver);
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index 75fcb75d5515..3ebe77566788 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -366,7 +366,7 @@ void __weak freq_inv_set_max_ratio(int cpu, u64 max_rate)
#ifdef CONFIG_ACPI_CPPC_LIB
#include <acpi/cppc_acpi.h>
-void topology_init_cpu_capacity_cppc(void)
+static inline void topology_init_cpu_capacity_cppc(void)
{
u64 capacity, capacity_scale = 0;
struct cppc_perf_caps perf_caps;
@@ -417,6 +417,10 @@ void topology_init_cpu_capacity_cppc(void)
exit:
free_raw_capacity();
}
+void acpi_processor_init_invariance_cppc(void)
+{
+ topology_init_cpu_capacity_cppc();
+}
#endif
#ifdef CONFIG_CPU_FREQ
diff --git a/include/acpi/processor.h b/include/acpi/processor.h
index e6f6074eadbf..a17e97e634a6 100644
--- a/include/acpi/processor.h
+++ b/include/acpi/processor.h
@@ -465,4 +465,6 @@ extern int acpi_processor_ffh_lpi_probe(unsigned int cpu);
extern int acpi_processor_ffh_lpi_enter(struct acpi_lpi_state *lpi);
#endif
+void acpi_processor_init_invariance_cppc(void);
+
#endif
diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h
index b721f360d759..4a952c4885ed 100644
--- a/include/linux/arch_topology.h
+++ b/include/linux/arch_topology.h
@@ -11,10 +11,6 @@
void topology_normalize_cpu_scale(void);
int topology_update_cpu_topology(void);
-#ifdef CONFIG_ACPI_CPPC_LIB
-void topology_init_cpu_capacity_cppc(void);
-#endif
-
struct device_node;
bool topology_parse_cpu_capacity(struct device_node *cpu_node, int cpu);
m%T/tl""iҋ75ߣ`|ss 㼠,2d}bil̍^˿jaF8TXt++ڶatJbO>k}ÏZڑhs[5KmqHN \K /n2KP 35ۏvϮ˰dFa%`~ a`dZ}獛&{Gi`7Buo/BBet ?rB~Y!('k̹ R$it˝aF7 IɨqA;j?./l:Lq[aoSK&yUFM|hiǩ@w׿L8d)"K祇T[>j36ІQtkt;藯}sڮgQo.3*8LaHHú=I(PukcZPe!r*:9ѭz""=@p= Afv@ t^";5(3DKH6XЯϒB' "n{|E6/ɧWHl0L%t][wj Tj{6Kg0"{ _a@7uY3ӕ F=vI߳t׮,}[w`2Q|e q{ { _IF'h<}^:狾B:FCł ?'Eԭۊ""=$#PB{qݯ<8gt|}T2Ы&̀əv5xmpFf b^}Ěm^:>G"E5x [JCs[ K;ا>}? I94RNO2!lxXSrjmjA ?F- xVp뫈Lru(BXsT:";K&PǫRycE ߱XEU? qie#֌901(:8ekt{jA yׯ)u(No*VASE0vp[8~Z$!I,6mGGEz< JyQUUR8r|_q X8~ܢc?VP\hPRӱ c94Sȹ7,O9LTMAso۲ru+hsFэqLlVֆ"f{Mi` P/Yшhq.{Q/z-iwϟN:۟n}pݐ:.ԋo +Ä́@Q:3Gr -.5]nԡWeqEtŪ,#朻7K!L ^au`VnK7i>:v6PHu긤1#[oڈQzL(p RjVmUڰZJ`(4ڹ1l@>C(oB+ xbȀh4Q5c{;S;6a`~ ][QGϖ}X|[,`0}2Go>C Y8IȸLf9'\2rZ+n𞬷ban|mrN L3m`JP/)UnwEXTED`' ߁O} cP5XhE2(-\o#7jAb!L0 9Pn]i; eߤ8W; (9}P>~UFޠ"pޡ^췶Qc߃jRݦvƳZtAq ]izsIuzps8ց~rj ^z焍%mowvվř}|SuI3lbx%>@vjN$>fƸ, q1͂nb#ڽv 90v=ĕp9)~dWxj)nḙP9Xּ`. tw`ˎ|xlB&lH?tZ11}6xoVÇ9 FsgwA=dd9.yU<|̇5V:MW o֛Xh*iD19¤v. Uz\j Q}ackA~qۍ ~իvݞ$%ۼnW/96\]cbn+mww* !k5\`)Bip]'rv&?2n,;Dmy4 ?ۋ=0NB\|^,__nqdJէL_.~IXk<۳3pU@ڵL{iQo^DZGEP$ cm쬍:̞ + p֤vjl: /%NT`FT=ru gIH^N;a!kNgXF 7uilU ;5зٟ4aZrxpuFWc<p1dERo/ɀ9Iƌvc fE[`4'?z_ecoHc/7 1F\!0;B)IOËKLyN0nuj엩9@qW#;wA7}v)S#~& *Y8*3 qx6&[xـ.fjZZ5Ek/,Dm"$)|<cq2tqS"w{c>gfUGD_?V| el&h8Uȋ#!-!F Ep` o b<4ȣܨP+Ryc»}^[~?wG=Nh6׻{usX~QQտ.\:7w_bvv?mj>5<-#ct"ɸ9k+ޜ1g)56P zDB)Dw`1*:Gt (^)뵍+\1vZ*0uՐTɖ rдhR&2󙿖Tv5! [ X+ 6IF ER'Z.u j(Sږ> )fN !5 QZֲ  S1AP&bWFO^I+P76BvceT%x]+P IB%Ρ}cn$O;i"\I*EQ|"B/""6R X-֮dxL]A+:Q{ FZJx-t ~xTh|p{DG\*i1[:"AoXt ;I+ Pu]ؔV*ã[?o3(\dʏ鿾cbjo{.ȵR mvZss47p\u2Uj–r-V1cq !ۑ_cYQ3ڴƗ"n&u`?,ndb1Ė#?\+ְm6+ҥu=?._DP8w#Zq>SLFM t #r}Vsk `=gwHõ!vWcnӆiOMÊDzóqlNp+s!Ɠb)f|x1ds'6,">MF;^+_%LK<\p> fITIW35OmghP=M)5ѡ:; 76!aۂ,\&=yˀ ٣]]n!ݚ~o׭59UKx(rtavȹm7B4ZejtWfE.yy,ª;p%T0f`C\LPx5Zp/Ruq.ӟKdc1DAHcX7͛d23 Xu .KD y -w:CRYX+Gt采Aȍ 4K[h6Rh$9H8*ʽ=W<,7cS$fk i ŕ[R&".Ci˚h[컻Uޢ(asCzZ.fW0y˅oPƇrc5_5)5 d hkcZ]l#vnƌِ<1;h8y w.[#MK:wRi)P\:l+sYӷ_kPTC&JU;CVnsOߣGR5K,"gDܝL@oBb+ylq}ݳ4mN'MQ  \c} p(̪6))BHLufC,%4fWTW/@;sfDk1P ?Yc`EQka(= .PןkDg6KW-YX.;jK]e 9 P :{[pneD0Sg(Yc[XXFL3ͪUi{,m䐬0}B/.ks(%Kg;Ȥ0{~~|/I&)~"q*XJxi&3RP;`E))]+D|?㘓`*/<Rc1YD[|΁.8_-f^4VcܞQS Jܪfo>q2uT1dڗ213@l be |NClP/`7X>.v;w>- A\{mD[X/ƫx!t 5.Q*I k PG?"AY&_lL(R l`! gl@k&>wOt4`%aS( u'vo}6c'2iWϵ;ŧA]CHQ7{?XH75p .CXm!6Cz39 $ B@W"%?x=Tjr{WzH'65RC=0RF#ֿFZRwYʋ&GP&aI5:>=8sY%+g;A 8![x2 e`CVi\]7^3j86㱙51̈́qb_fF2A m<,Zb4^C]{Rͧ@ }aQX%JKޞh }Ӱua(%L<)X`.r"F{Q%PRC/`+R:+f`v[މ5ީ xWB{BkzTeflF7X<aX)Quh(F_T".!+#(R, 1N-/yc,IWΝ;?Y4RyLV@8珍ȳQwH[/Zp&H5jӈ5|WF9-8 o]Ņwݶעj !aATZɁGh#M-f(ȋ(q.|NʼYRSv aGCY=IivZ]5Eac:X10(v:r/lԘűl=Ԩ^SHy-\l| {Z:W^>~UKF([~T/SYrD~Dry{p0͊(iHfLeLAsl/e҇v6V? h|݂Oz8_4ѧt>9ڊH"hRe[@q2&p}\pd@p\vW}Yu8?s$-1&xJv}x.X(4&gm0\| Yv9pͥ:~.Aes[}-HfOΎ`vm|% $3l;N¼)HW%SvnF]x9@{R.ZPV-Jm?g~PkP2ޝ_Yǡ(̈ =7/.ʿ~V YSU4yoN sӗ;F6ri7A*$9w9zaوig%2>뽥ز:ElmJ𞸦8=n C7cӷbMvor܁,9qOb&慊\R/ᨳªxueq H,CF“&-Ϧ=LAІ@P Pa<#bEARҙ'VH*H־+^VAhipZpiUQ0Tn%zv*2Ax|BE@d75\5OGTh<&̰6ͻ)Å.;͛'liQl n{:F<*=IAsNFt؃THGȷEêכӳHIwVpqG+4;>K&H/*Y+Yq6$.;c#88y:EcjX3BIP|=oKE6_݌UcY﷓X5_%&rUrPC H3)1#90;t*|Er4Kűa_I\Z}J, \{xW6Cv.Rp^Lja%V>=!}˾[ny/b3pwwm&ՎX%:[WXzQ-Sj! zݿOk\6!Hfr!qD^~{uY4hw92Y];)\)iX?ayncܵ鵪W=5|56i횴Kk.-M #A|phGx'2ɾGNGVG1wn,6.]EDsy 2XVKX~kI>q:ܹ*l6ZtsPu\BWC<}# JIg{;԰iAq?0DN;lNs?e龶Cϣ%!֫x{X)#νVSQ1)t|S1*~h]l(6l8V4Gk7 < dC;L盖Ƥi]_p7pq'SH0Y[\oU[oL+%}Z!jtws{ :hdj<' F,oߗMO-Ӟj$Ahv 4A.@V!J٪ı#- 'VTA}b,p *yDP1ufv𞡄檈Ql4xx-b֖PC*vFT>Z`8 /h&ͭ!?v^6xEI=(d,;m KORJ pUA u΁ X1KDf{M49S댓A.odX>OU2gaXJ1I{dC: ѐMX<+F#-#\V̞z &/(pd+˰T0/gVǀz 54r4ܭeg[exfJО˸3HwgM4z~qvZы&"ƞntl~u5 Pa*^m[ko-0?~H)b\5 0oTb:Q~ f[R1^S^Q&j< W rKc4,#*"(s3p;)o$]~!{`wH-{4{ܱ#}Itl쳠āw;'UARDCcYp!qT%VWӖ!J$gUYs/Vq-ץZÍ( [x#pxGo1ۣSE#V. hf\̆PËHIܼc'۶Yy>c'S{׿jbOTe;p!r#7l*iDSI,TΨKZ$~xwoSOLK&l#'f5CVDsD];a 0=ڤXؒa/iJnd CBնR|َ;,0s 68Eoe;0F/aw|`Zl'Q](iE)PڑE\+E0PXۜ^`S4 ] "<`'qhwsf.*vo9.L氄+k)Oa+O-N&BQ`ʅ#M[%s幦?+DM|c3B6J?^+,}{b.`g =XKCw`Kh"- Gt:3<Ÿ1ug/kpe7]i=2es1&?=l.nGmLecDC[dvE+~n3z!SE20fr}Zmp98(Q; $B;BvV%5j,]ۂq2rz^0ڶ3(B"{#)'k[ s;ۋ9,?vf ӌew 3XP?Gvt,"$ރ44glgONZ!}ɚf0}Zz#owdٗ<@P;$P?naR9QUQ'R ,SOw8g`\EJsżyg"~Pә8,';z`ijgu",JܑrVj \avV FcM4p-Ewݞ81F"su8u'k8+K'`ac-}OW \ X؛w2A Z=M@hcw9# /iPB}X,9YLA|<# +ptaƒ N9s螂2vt+27\8w½bGO*0naud;<4d,6`KWAi4u<;%++_o4ȃLЈ-SZV2 \RG`}6=s \1pcdc|=g0?`AF$v xģڹRAJτF\<=19h?{9R,oxR .L?MLa(&QϚ)I|+ >/VL݅ 6fa_]fvcTD|SiIQjo죴ujpjigo/%/lޙeӠB#}¾[,9Χ+I,I@WM`SN:Y¾#.S0+9a'nos=BC&O?gQOԘS\^٢ͣE\")U/g4OR[,nz9j7EoRt)2yh$y(Hŵ#ih0|JĿu\X8+6Lxi.ʎs|l^M.@>0|X@ T0]{WSl_CƃHHJ}ӝ&7og,f q0iYk8/ ?xor,YW;NU战/LT"fQRY $ '*p(H% N3sÈ-ʖG9tx(Q4ҽgD`:yq./ah*a\SVDpJw1k?7ZFcl c\=N<|Ln0ysHR@`Kgt|wT-k>5)Aa=F#{[LNMeX9XWy]16-\\Y]SYEjGDFǦ}&4;u,ףӻMS~5tsU(O8zD'6{8,& #t@@omEN ~n|$;~\ln [̗C-`nbYʶkjQsC6'&߂bGї+ww:A꒘)[{`z6E9!̣%,~ u;MyZWw$kQ4Zjc1逎`&us ɪ&"B+ }1B39`&nM^6$ (ekuA6WklCu܅sYVe>닦~uhzU>lQD;&*GnDr R>*W퓟K6'zU,\ `s혟S yD=dp*UG*a]! q2 1H0\̕"4g,W'm_~s*w~⣷^uL%?&ܪh[&ݧj{Z!fs:/krq-#|ζhB|ǓKޠ2/y ^ϠI'QB\V=p Ah'In-T>4"d5Bpw^8w Si8MI,xc>/}\5x<Px7(gVuvoE 3p:z|\U(;PɐH(FWE]G]}EO=X/04pr6,$ae}nR8KǏ]OJ B [sT1InB'aI>~Qת)YP$U`:#TAG*qfzZMcPk2vqm[㙐6ߋ?%|U*{EAQpÝb28|6d氽?'+^Yl4{MooxA"믗zLQxcp )CV^t? J/LazF#'>ApGxJk5wb07!zP8чJԖcXۦ30p{-~"̘$#PH"#){"'P('6&pz$ݏJ.y\񖼧6C0њ{՘խZ;JX~C:㠁nN-2b8TcW_ ,N4fjXW f1{ ZڜZ<%Xty+'H4t>kttTXt#vfX/ 'Ԝ!`)7(LFom ؇U[m'blXFRBl+@$?:KX95"Duu':IDKt;$,2Zmi )|/D˧e|}U3☼b7Q Nolп^Ǣ-9rc$Г.&>{U@5-ߌ< k}E3*^># .=NAAHD`mT Uh%\'o糌E=Yf|?涏;Q `/V|y |7U.u\h^؋mhfQSyv4dάvtqJm) ZXJǞE[\ms>l\7?׭0nRD]# hoCxD u7sJXv<jZaێT ׻?ԛ7cUK[蠏GV<Ҏ`ɓ\_=FP"'/\ Ȇ/ls 0ۀt8+Az[;{wO/0?'i 9*G=C߷,}܆0ҡcaEzaF}isΤS:(;N6!3p٘ ܝJF&5_=Y2j|4S쐓R }CH<mCAR} ~7& uϵBgcdk5 ˕GX+3.dFCr+r;Kq<*IϕS ^Zfi;nLM\ GoY|ӟ>.HPIXm @ɽ{I*^@xNW27WT$.A#Mw) o|;Θ}>~ sMLh!Í*n*u}"R9)>>hTf@Mhަe"Q!?Yqw5%\%=͒vW7/ o4"c7uT۟יYiqBCޡ*/Ur8{<~IċL](a>X9 uCU4 ;*Pq GwqXܕ §R:4)^>`E<`g>ȜɈuM֭㖅Ұop1 #}9q2iDN<70c$'R /B5g"m!LvLI=YrmX. V1J\NT&CIyg1N^yDwf̴ RkhI&.NH0IxA/DGbxxNo.`ӻnc#[5Әu )g$;!&0bݳ/\~|L~ĵgsmCO)ni[DrLKu11x %"nPwbYa\Npqfr's^,ZaB d5)tg۳7"}zuI5S-L&ʕ/21}/+3kc ;]'(A[yA!'m~8Zy1Tc둁eO4/w=z uﲒN7DӋSiJO>YzP/`RVQxEG35i{U6Q8bS$[^x4u%^iGd!Mf8633wb*|,w0hut:GXU/(ʒW ^1m(ѷ: 9(uyU.}]ϔB*ZOl 6Tߋ"4p!F ѹюpRB,nHxukDXnc\-` .ib~5e> ~;<OӠrSL hx Q̷&k9("S>⎟ e(|ys"$}0`?__񟉒 _-t|XOï5Er+u^#W-οEnn>3`Q>] ]=YԷ2(n^C'6ћhˎ*J7;R k::[zJB{ۅ4#;>/ING e }/>6\jjD |ΪQ:yz4B[dd=f-BۭVbϭ:N07ǡ7NE!q~ȖP7RGQ_H*^Z1["AtIbm0 ^OZ5<%z!</5pmcG4 [%q6Cv@P7c7g Tg.'~Fx hs,!+=Pv3p;t[ȈDљ#M>9EcV/-MPMUjuK(]ާϻb<^iwRH53dڶ#iz+.{*4'o8﯆(ߩL\{ pQ!y}T%n=×͈ٚShEqOQ)'x, {=8u@s7  g\6H3"gW3y als˯pܙL0Wf{X~AJXbx܏ih-g Lf|wXf;BIFi+N r 2OC3FKd4;C}n'S*@8)A7;XC#$@cpt1qU\< }.l5cE*Φ/EHK6U kH(Ym!Dee?GBnktHΊiLҴ+īT"UhP %Le'5舴b!\[X;tMC.f&G`@k/݈}br6Ihm808%Gxr{mX[k{=',3- /VqzSRz- qkc:o盎\UX0:u+i-|D>Gwʄ|(2@ '2^eWLө/|U& ׇskZh,\_S.)׾iPd+$J"jC7T֙N{C{>lPedn=S{]->ǡx'Ι\/i)v0ߑ. ׄ)ia;1g,ǣ8Z d߮X{a; -L lQ x# ";7KYڨPT7hiY6! 9IF/Q>1A/t@_x g3.!WGS]TL42o;>zĢ .:{}a|%PAl81 B! ˋ٣=Mdf'[]Zv\p2`R ] G47](@չ(\UY{z9sTjeCA8iJbLВdfTrAhfıf2j=9? s2 g >Ga5n3218qz[#UNsϏRԏ=Bw~.%+CkYZ~=CJCHBFz4Am][G9}Qx4vQ$2% \!"s ?/d?mKOPQC~3Tz'Ka4V83)^HB 1=:*QW6F^> zag_.8oou9~5S^*K!%gc5gsBNTV\xpG&VȺz bCau3#}FŽFlϴi$ߎ \EMR`':!҂iDŽ XFV?v L8Z Ϭ|c9AOJݦmX.9ὼizTD2@`s=! hDܜ6V{;o7ae+{ ]_IDQ2-tr>wV9.9Ŝ9 j[cT*1~9 D΍9 _3yvmn BnY4M""}s`&QÔF'}\[W% #&A%&y`Q5;!9qYDsæ(;#_b~|m8Lh3wJ0@]{ ,!lX<9I  #CbֺOE 즲R,PNp0`ή FvKN+4)8L" l!~ZTY,#⋡*6'B䚁٤UpXa6+&X,*Q5U\oZs^^jn*U }=OOs'Z3N|.2Ǣ>_nI[i3BAOGsŐ]h#zrvUPĎCP9 _5'n.pRISb:!6KYfC~M'^x1[#d%DŽ:ng?SW FofmI,-%~irw@˴*iˬk7Yr#db noy}s[1vv[[9/&nz)|-;tYsap aYesR;|#L10qDƙrKVS?i6UZͮ˥'gUY87wә6c/g3H03 )ۋΖ?G|7Bjۋ'*㍿\YPaûpq83FhdQK*jSb/~?w\NZ\864 ES}vEaȲZOϧ0?sпC.z(LXAēیb,0(N*nH]Cڹ;ʘӆ;HA{r7X14RTQ+i{!9.uEn/%aQh&inc] _&^Y6UI+ݬA9gy#'+H{/nN]0MR8zafY7fіB/z[[K'q f z7D?:i]q/ZJ{i˅6&W4$I;5%z0sXl31fOO|n.O‚b><5'njoNkNٶc˽C Zf61& }GtyWE/vxsl@.ͮ<<'ܘcHFAE"yfT*-GRWE RCdht5&$ˏ[ &UWE qKϧ0ΣОV${K痲8:1LcS 0}%=Kl&qDgo7[6I ELFj0"5Nf'NHW2SѶ)]Ω=c5oXs M': ;^3:<eW;̢/m[86J`vewZ+43fł-Ixp\ vpQ%_f-Z_G|1 3T ^{w滪'|$n\k=\oPA/g4Ѥe^ wΥ.fvRVpyX)68rmKϔS;{TVtsɼ4r1cLqǫ]7׊Z9t.X(ĦꦎٝoQ)* amϓt˱x/#:\v|rΛ8Q\9Ǵ4SH5!B|߈-fn4ֶYٖHR=l)<8lDNĿ noM\aP˞ #'ZP?n{HYgnFhai&Zу{մ&;GEcu#w |m6ZƱ55b(fMZy\/E R OCD44,K-x)fU v:5`LUO 3Ik)\k/'jj1#50U$c [x)<:8Ӽi7 {:Y?ű3G(4K.>OXz3ܭ51)#EggZO߮Q:%{ȎF9g4fhyY6bSv?+!q8D_٩kHbX %9 ˆ&P793ag}O#;DmMOϨi",3Ó8ЍإIq]4۵4fu}S'9׬wֳEor' DNJ+c'#/g;O-|o% Ni"Je~|] q׵~VweB;:d~nܹnr 1/!1p{pZk\ Mk׾VF.1pԎ$6C,nTM"^69!ǵxzʿ.=|m'k{F T4~=㵍m.\IY1C $xHB9/9nɡ>|O犋iv.ֶ A8*RHk{_V7[C d.#zEjڬ\Mch\md=YB}5t[KXbѤ.Hi6nGv9g7HyFLh`R Pɿ12uLpE0?)(:{Hё2({vï?|۾ _௠~z($"ons,XKXWjg Kr+LV踟O_DxwkZ&=xQbxPc0{^%@v3~s7 Cgbm2;oz#B&Gt%ȇJzgY'|=n6SXiZ@zԸflw B¢2@sd$K]__Vr37>Fϧr/_D>DL?\0f}?gCOQeunwm8a AǶɅ7_7͐C^e?HR#p2qI8m.t*' s8}gT\u< o "EXh6 D;/ÏШʼ"u҉T?u2"xm\+%*9  V{ݑ ]+ٻ:l(459-9ML66 ÓLgTse챽iӼv{J|걆`eOHiYg6+qQC毯ߠ[l%!7=By[j9TǾ"wӝA㞐8̡' ;!x-f[l .-|9io7 P !:9ǫ%6h]W>n 0JdD2A`J-=PLr L %k `^YXdA]tRX`@[cpgAktasH>񡞝<\4ξEx#WЄ-wl_4tO6$9IƑQ[WpaumlPEV0E4 ϮG~ 8xa|,UKNCg5"nF9?"CZ Pu! @sL.vZ˖W-q>/,vK J7)f0aq;AoT/X%MPw_Y:ŘP̃,Y݄<"²n>1;>A]Y` XahJ qv<̍'ΪJv~2@H@מ:(aXn"ߕk0e6[q| ŵn(XyĉneVqHB jXJ(g6VpҨÁ%)7kLe Luօ OvMI߳T$X GՁdC! p' Qvsgtt^+?W ^ymg*Uv]q~0 _FL\{`G;£KhVc(X2_ PJG:yT.mG^7庝ܤ!*f~;тB>,l^-W6}ڏ"amQIq2F6m,fqλ1m{s,q=zok6YjZ,L]6,މ E' N9YR(/Ф?3u;nlZTM5E|^`wa.q=̄W 8ɂVԨمw{4H+ :sHs7UP# Zy"a#.L&tn-Աp`W0H%' ս m8;6`;MA)Bz<{}B>rf{eہD&[v%pڏ6YsӴ2H2xܳoE Fv# ?U&mJҶ=JODNODDy=A.5Y6o95?>5OY!r[爅9a}) F(ETBv+_(ǓAEGkr?nfA!>ړ0ˏtч靺mux8:>'~ Qfߨ?ҜG^]]Hzv90um"3H9ciNcTq$dYgAe*x;dTiXLr#0S!91 JE/d |C ̞`g:U5^RN(38xtDKƗoI&4?/hBE3P/3! oyyU/O .$Dpz=@61`ƸMQ@_+$k83[L};l@ۯ/PC"ㆮK>KpeMDszi5>_TǵcC\d(^H,;Őq\ه/fJJG'sNڨ >`X᣿(w\oS?_eeTzEM6 ֛2лnTrraZ (e$1S. 75Qs3.YH~!E*(g D\0,B60Z6{RFM〺rD(k3=V!_|<>[R 8ח{Bsb]+Gt~x^u#7'|A%ei=٥aBO7G׾U #W 㞶g9)\1. Wn!1[t-;Z~J/%d:î` 3{]/nCո7}_l!N>"߸%''`v>Zd@ooϬw2>#V"ቀ'k{Nc}0CTN޽s\"txZn'GH:M[7(*Zy= ,dF&s!!3t?75HDzv?wV1t)`>'LH9粢},}{xAO)\G0RjR;x̮޾ߩo+O.Oُ $=jRJ!&MbJZ C0R JҔq CNs#C11!CA+`axk+@(FmIsȃ'i R"FrʟmmXO\fT@ebOyoo՗u @u 4$^|Y_mp9  ̳yh=PRYJ]]:E1C_9g(]GQVP}?RZ. 5w??p'ۧonYn,y46'jϰ/I~T:li/\pf:%taDe i)9^\SC:f1fBO3l9.\l%!ll򘍃9D>w <ORN ^3bč^n(ӯ ^{&k% g:q?hlzG?C8AD<>]r'3$e?I$\@$K.05~6Lc P9Nm/zڟV~|y'( sD挡@ÛGC-iӭ4{Ť)P9|ු=AQz X) w_a'/IE2ױ&ώTU36') GG]gQ\0jWfOC4 ђh)8H$*@"`"bODVH/ΐP43 *:$% ;#ˤ;(8 dK/ U+o" l; \[=!ֱyΟw5Ӿq/f sˡѪLGWc[;1\aݼvqcW(Lk=tkx9p0a?zd2d?G*YKͶ~+w=g?Ԟ, NU@釷I!2Hiq2LEfbF?gblgOOi,@m1(O h˶T(B@RQ]xx$WoBjg)i'Wѻט:؟'~=E 3aZw|]a}ĹӾ<,4;=HK_!Qռ7=4$7骾ayozr|4 ;+ y~;0~Eߧ77_޾opr0u/ǘ Y}(5IiE|m= Ϟ)C]ǗlxI%ct\4 o\#:̔ڱ8mËٯ$5ڥbBYuui3ug{yݖ~p_keP̔?@v+o5P|£ȣ"\ (zʧ0 ڨ/K9Cy[ZH ̤b~Igs! yq;X%Jg2!vf =xNu 2_! 80 <>%:U+ʖqFSE2̋&kuDOPAS;~6VICXH_b~/pubEP_0xm+N0W2WfJ2?es=XTI Y=w3Jj'5k]])ZC;諟䩟8-(I(,En!ߟ ?s]58-(<_߆oWzt!.N?\zkkVykuO~deobo2Ý8VmZ K@YqީOOxhr8{t.p}z R:ZfyuF;ǞEvLt/jbAwc1n뽷r7Uy>]+l5~ _7Xǎg\I2Wdz{%]ߣ8.M(͗x'gJ,,WW6ٖt_Ytݕ,gjكJ>Daw5>kn}#iGd}aNuдM"j22?( Lu @<||[Xw/ݗ2RIXk#3V_g4`h,VYS`*<}o}jul3F杰!vԊ0pO\  [c$y\{}cv!ϒ;C]=>R|dQ1n#On0߸A~ s$7\9swzF rp%fUx}X-0Y'V:PT>g*8Xkq?46wڃ[}SH̫,V_|7:>XIɸ=?cƈ&o߬19ф!t> 2؁Gz*:ua|!p.{s۞Gwbudwf<iW_(頇R>KU+{GUE0m_f]VDae҇3plBuZ|ꥳ/nEPY]']MO ?1r?IoP31Li}}@`ʊNiMzǢiGv~c2k|m$[lKWÙGcØ t9Ӆ^ma:@`_Y~ sU3 B'UB, {E|<Xm. }[{ػ+:&0cF*|#tJr+o'oT6R-`2O.. )hDId(ELOAP4DZ:.C837 D1/^,>ӈ LЍ `SZ(C?c}x~_;W Bf0wМbK FU%=0|>G,Iw}1,7oч=+x_l?v_?m^p_GG՞;h 3ʏ0w磯f頤Xl.dPw$Mk'$Ԝmkay0+cOށuL{RZ_mx5},I=vpPS~T=6ݧ;W}P} [PMyjLM 0U>ZQ666ב Pkhx~@.׳kwOXD՘OrH@>*ePJh3#+@D[s)(pV|21ۭi OF~UxSWC׸ S DDњ@`l;8DuDbqơiT~G-oXɀ7'C-\>cn7k`q鄜̇M<nᴑ,8*W0$8;v$_}4&mݫt"a` mn(8~&p qit !U"*G5-:8#kdHE!5#ѨJsA@o9~4z0~nwО>u.|{cob5˞/ 7bhK|:|H'yץA^$ϰz$ *ڜSs;@ֻ1-l! " @X1~f\dw[H $Q4ٟ^fZ5ѭ%`#"q2u+v|/l;]nc>t &6/dQQdCT,h?;$Au`@z' c9gaSd*ՍzJ[xA#| ǧR@zye(b3~)ܼHHXFB0@o{XU5y"qᗐHXR9͊-fD[e GySAgE3%b*lࣲ sDsUe2ݤ[f*_Oʅ :ި9;"Y[ӦZ ~o}>ϗD4ӻ:JRik9m=+&*\\bnEbhNlυ!p78>;QKUv:eŐH ɺCfJ*YP|ú5P7!\pc̆3<$~ o_ѪP¤3$ G#mH@C Q[SjݟGbqb?5(fH{HKc&򯜈ELA-3m޺A:'.@X{W{ GvCb-  rp׬I}  #بH6(~ o4: ]GM"Z yINm K@-+ EنH0y+Gog^ч44Ssο|#0ɰcƬimQDW-uwOgr֮qZ5g*ƻvw?Jb)ֻ~UopNq4dW7Z'nS9_{pYkR[f='c8vA_lM/=p33fvmf=_e)IL4.[~m\1iXK:Ynk[&,'CLc^:eU"W\5kj7mubkk7ק y4N6ΩAV}x=5`i0GJ24\BXqlpŸS=g.]QUˋB'μcnѬajw'0R/pj>sY^1?`u/EeU$UF hUFK6HڸtCɄeTyJQɵja0ڛ$Ɯ8ދ?M-5>S.NUbԮL5ڥ۩-Q ** %RPaXgjuDOyÚԁ#I'_yR&Wދ?}mnWUm Ʒy[j|~8'VR0(WuIHȂgY]pH ]OdQVe r|粕-uR%]0"Kv_ A-6: j ۃ:aV=o, gBNE_~~k)~6a axY*h`UAU @$[[u&¢/YZHγ+H׶ /WΡ뵫  4[Ҏg[В$2TK:)[U,5|+wWG ;A%].DΌ~P}:t'9L@1Ƌ^Un4Km6>Xzq1r$97?7G_VPTM?5T8J SSMu; !j1!+cSĎ>IcAKUZA֬珆6 2aP7`HIUEzlS Q [E'r#´J:g RLܰW+RJ܉%F2RVQ=X$ucǩ<\u7ܐ q͟u\mʆ:?"CL'; ~y|;[l_qfHDs ;Ca |7Oͳ+.97@zkr ܇;H/knߨ)rPuo.su2nKG4lpasX}i?'KikvMY5GUVy1O^:ȋˈiUH`^*56[qeGsf]gݒ}o?V|R W(֭(K YkAOڊ68,G\JWw=m`AgFǥc'! Ś>;ZNǁ( x8J\ ڕ.h&J|qh\.Ԇ"Qߊ]d`9/k!/QI]woQ?@{10Svޯ" ~L {n_ #VU=D^-. A37@ sG]Q??(Ksc" wQoATtj! BYRH0@=*7?5A΢ A7hGA$@ƒX.m&c>g#2Je 2$6n?jBtZ* c]U1ܼ*R;K ANq $%AI \0A^o7U˘D qֈGD yXﯟсl4lbagVjKк1!Ԩ?) @ 'Ҟb1XM`T;{-(_ H` MkhDvĜp k]H* =uLJg?=aP!Vm,[mXpeGG?C m =Nr sMk``7RHa}^D4iOiYtt2 {29RxYaDtO_İ>Xy"4%O~;2?% C Ϋ@:T":[]h5 wvsg?,$#":GEBy7:0/Dƴ.ڐ̍?lJ#=5灟>>R_뼮gV0, 2 uǪ ;6.-ߺmnZo43:E׋s$6b-w;v盍GП_~p>[߬7*˷ >e2;ɴPvl‘TWAzʶ;ӠBTfНHl,<0gP;U=HΏ>}80ܕb^$!#Ж|},O_D}d1WAkrm$<.1G>{ ]瓭_3$<V##NwƨzlQPegեwG::)I<gWƽEs/!$(i Rdf*"&hi `(GݳW=CDHLA$$CCCC.-1JR+$~mD4KH#DHD!QPITE!HP!HPUPDE>oe4t]LB 3xp+|vÕjP/`"3-$J웚|sFUmtskzUn, xUB^:hD5\r!rl1+af|^+ޮIM{ç/#ga|A41`$9\QV_Ӧ^],֚BNfer;72TȎMG'0Խ@Q!2s_3/GN@Fq<O÷bنЀuq!6.ܴF;et5eE-Й4+@x]Z2jʀʐ_ud%ЛMsMJDi}+M*Naey C,:ZL Ԃ|=B s=X^6rl-W8=s̀ea*&֝{%R1wJ m<$7,ӭ72Ɂ)HixUih(r$5tnO@6#iOfͣj@?a-<=a,DD @QqDI1] ߩʉ9E#F[o2C}v)#3xvI-BI; *fWc&޳YpAh/Tk\=S*[Zn;V} yPQPUШXDhB J Ii9  AАtU"$)4Xh 6B)*4 t&ҋ1RHpSd5U#5tvA%S|sG U|*`Bî4Fak{}#@v|a~Sfi$/NUw* "71WTr&MwÅh[l TIhNϴ.gV=YdK&m$:@20-U}/zҋ%╉uUm? B/*6fߴ<3*3Cga{uyH֯\4"^6F*`bэ~y2K7Hp`bt)X:ǤڑШn)aHYLs09IԶz֛nJNk~ֈh8H!}g_T1a gk #R3 h7[s \Z+rB׈v|Q:BKΔZΒ46ѓ'h{&/۷1"r;uAաC2>~|E[wDvv9GXtפ7 a5a" 4;:Un6F;[Aa, 5T. QZU"4^J>W ECi쁠'q '57z86 e#_3雯dA|r z'Ciz_/l\uTJ/Nh1MfkFO|*>a Q= (ȉ9n@F@2,X|FBk%q{(~ճۑ^NPjbѺ񼃞x cm:[+g}=j83fsk2xq27(`a'W%%9Xͣh$ث,?'7__#_x[k\Q﫭 4<[t 1Ww=?~Z??ϢڪZj:իo4s] r(Km&3/Z]-V2iϻV[vڛ*znc L.N}:2ծtV~'?UNc!^,;i=_=^H/@ " BP"++͂o^oZܦI4T$=55W B.mv #2T zuwGw5x+@k(/75G3 V3\Oo.0Ǒ 40i.SJ6R@qPrW$k@W_*'ʂ}^v:6'9PАlʶIxw$=]#zuFč!F HnRё]Ly$0@  $4=}P.6LoK4yT7(f7>lPPÝ^Ǚѽw59=KY>O?qop=F%WkwKN5ֱL-yl0wL뷬&Pn分۴ɸn;(]A>,$FPuȑ\a]@*Duڟl(#yVul)2_ HVJQ㗠,}z::=NQJQ(g.eU*24NWDtUšQ(9ǹ0G](P4F F_90(.a6Cwq#̶Ъ;xc=A!o:߯M;o\ Х°OC׀"ȘP?ZSzY`KywDzC\̫^󋧋{,Mԧeɂ[ݦhh싃ܵTIQ&e:=El1៻=LTFDJ D`Fն,o:)+̷IiJ/#ڥ)@!cVn|ln)nFSP#Zd)N2RPMuo,I!0pJ03l{+[]0T@X#.ŏSa(K7:ǭ /\OBel"1@OzC/DMW_FS p:8u(E >y ZMYލޯ1!rȘ.vIp] $ IȍDo4D@砵*50}ߺ6r2$CI#;^ʊ1,i0 _BRb@:ȸ2b. A&HG>M3^8?K*6v"+-uG\߀W1Ճ#`i3g=I !$X>X!?GÎ+qe:{! )Wđ-gUb3Zlrs5;l^ dAyߎP9} Ck6`"iws{\:M]1β(t50p@ T9o6=7+F;;x-1 0"I(LHL./pr h{E2Bx, p?L +#UV@H:1)P>pA74ssa=Gf%"ms{0LʀΞ&){}I|q|][_ZD84D| \f|Sd$jJhaŻ1$3^a&f7jqH ?$(m V}{>5'ժ(xcd U9 0Fn6h-#ijIRJ\NtsǤ 8H wV(L#~iیInGNT$.^pc>bl罝of]&ڔ2G⢦P2޽lےwu<e@d;E >7 Ձ)BMֆ .g#!-|B0 GB^i=Go Q@#/B}(:c&{>/wy O )]$j0^DԺ©"ԟ}=[JmIA(D<vckϖ'\Jn51.W: <[< Ac&F-b6s"Րlܷ5-2!z,;T݄BvҕϾG |ѬW+ lw*xu']+pnx<$-T0ѓjqJ8;Z&ԘJ0A0H TŠ6y~y^VꧽI=@0\d1|N7N:M(bc-Q<m; txa3u6/iɆQSs"s$3/H*S 0{)KXl1jo=b=QvpJ'-(/%S }!ݞz`A.W=/ޭͨWe q@u^Krȇ39.6m[aЮIges{6C w!P уB ^4iOgҝhЖ+iud ޗnV4F| !d>`]iw}[0