[PATCH] ppc64: Move ppc64_enable_pmcs() logic into a ppc_md function
Michael Ellerman
michael at ellerman.id.au
Mon Aug 8 18:47:08 EST 2005
Sorry, I should add this depends on Stephen's firmware feature patches.
On Mon, 8 Aug 2005 18:45, Michael Ellerman wrote:
> Ok, here's an updated version.
>
> I've tested it on P5 LPAR and P4. It does what it used to.
>
> It still doesn't seem to actually work on P5, with or without this patch,
> ie. the counters never increment. I take it that's normal.
>
> Signed-off-by: Michael Ellerman <michael at ellerman.id.au>
>
> arch/ppc64/kernel/iSeries_setup.c | 2 +
> arch/ppc64/kernel/pSeries_setup.c | 20 ++++++++++++
> arch/ppc64/kernel/pmac_setup.c | 1
> arch/ppc64/kernel/sysfs.c | 54
> ++-------------------------------- arch/ppc64/oprofile/op_model_power4.c |
> 21 +++++++++++++
> include/asm-ppc64/machdep.h | 5 +++
> 6 files changed, 53 insertions(+), 50 deletions(-)
>
> Index: work/arch/ppc64/kernel/iSeries_setup.c
> ===================================================================
> --- work.orig/arch/ppc64/kernel/iSeries_setup.c
> +++ work/arch/ppc64/kernel/iSeries_setup.c
> @@ -947,6 +947,8 @@ void __init iSeries_early_setup(void)
> ppc_md.calibrate_decr = iSeries_calibrate_decr;
> ppc_md.progress = iSeries_progress;
>
> + /* XXX Implement enable_pmcs for iSeries */
> +
> if (get_paca()->lppaca.shared_proc) {
> ppc_md.idle_loop = iseries_shared_idle;
> printk(KERN_INFO "Using shared processor idle loop\n");
> Index: work/arch/ppc64/kernel/pSeries_setup.c
> ===================================================================
> --- work.orig/arch/ppc64/kernel/pSeries_setup.c
> +++ work/arch/ppc64/kernel/pSeries_setup.c
> @@ -187,6 +187,21 @@ static void __init pSeries_setup_mpic(vo
> " MPIC ");
> }
>
> +static void pseries_lpar_enable_pmcs(void)
> +{
> + unsigned long set, reset;
> +
> + power4_enable_pmcs();
> +
> + set = 1UL << 63;
> + reset = 0;
> + plpar_hcall_norets(H_PERFMON, set, reset);
> +
> + /* instruct hypervisor to maintain PMCs */
> + if (firmware_has_feature(FW_FEATURE_SPLPAR))
> + get_paca()->lppaca.pmcregs_in_use = 1;
> +}
> +
> static void __init pSeries_setup_arch(void)
> {
> /* Fixup ppc_md depending on the type of interrupt controller */
> @@ -245,6 +260,11 @@ static void __init pSeries_setup_arch(vo
> printk(KERN_INFO "Using default idle loop\n");
> ppc_md.idle_loop = default_idle;
> }
> +
> + if (systemcfg->platform & PLATFORM_LPAR)
> + ppc_md.enable_pmcs = pseries_lpar_enable_pmcs;
> + else
> + ppc_md.enable_pmcs = power4_enable_pmcs;
> }
>
> static int __init pSeries_init_panel(void)
> Index: work/arch/ppc64/kernel/pmac_setup.c
> ===================================================================
> --- work.orig/arch/ppc64/kernel/pmac_setup.c
> +++ work/arch/ppc64/kernel/pmac_setup.c
> @@ -511,4 +511,5 @@ struct machdep_calls __initdata pmac_md
> .progress = pmac_progress,
> .check_legacy_ioport = pmac_check_legacy_ioport,
> .idle_loop = native_idle,
> + .enable_pmcs = power4_enable_cpus,
> };
> Index: work/arch/ppc64/kernel/sysfs.c
> ===================================================================
> --- work.orig/arch/ppc64/kernel/sysfs.c
> +++ work/arch/ppc64/kernel/sysfs.c
> @@ -101,6 +101,8 @@ static int __init setup_smt_snooze_delay
> }
> __setup("smt-snooze-delay=", setup_smt_snooze_delay);
>
> +#endif /* CONFIG_PPC_MULTIPLATFORM */
> +
> /*
> * Enabling PMCs will slow partition context switch times so we only do
> * it the first time we write to the PMCs.
> @@ -110,63 +112,15 @@ static DEFINE_PER_CPU(char, pmcs_enabled
>
> void ppc64_enable_pmcs(void)
> {
> - unsigned long hid0;
> -#ifdef CONFIG_PPC_PSERIES
> - unsigned long set, reset;
> -#endif /* CONFIG_PPC_PSERIES */
> -
> /* Only need to enable them once */
> if (__get_cpu_var(pmcs_enabled))
> return;
>
> __get_cpu_var(pmcs_enabled) = 1;
>
> - switch (systemcfg->platform) {
> - case PLATFORM_PSERIES:
> - case PLATFORM_POWERMAC:
> - hid0 = mfspr(HID0);
> - hid0 |= 1UL << (63 - 20);
> -
> - /* POWER4 requires the following sequence */
> - asm volatile(
> - "sync\n"
> - "mtspr %1, %0\n"
> - "mfspr %0, %1\n"
> - "mfspr %0, %1\n"
> - "mfspr %0, %1\n"
> - "mfspr %0, %1\n"
> - "mfspr %0, %1\n"
> - "mfspr %0, %1\n"
> - "isync" : "=&r" (hid0) : "i" (HID0), "0" (hid0):
> - "memory");
> - break;
> -
> -#ifdef CONFIG_PPC_PSERIES
> - case PLATFORM_PSERIES_LPAR:
> - set = 1UL << 63;
> - reset = 0;
> - plpar_hcall_norets(H_PERFMON, set, reset);
> - break;
> -#endif /* CONFIG_PPC_PSERIES */
> -
> - default:
> - break;
> - }
> -
> - /* instruct hypervisor to maintain PMCs */
> - if (firmware_has_feature(FW_FEATURE_SPLPAR))
> - get_paca()->lppaca.pmcregs_in_use = 1;
> + if (ppc_md.enable_pmcs)
> + ppc_md.enable_pmcs();
> }
> -
> -#else
> -
> -/* PMC stuff */
> -void ppc64_enable_pmcs(void)
> -{
> - /* XXX Implement for iseries */
> -}
> -#endif /* CONFIG_PPC_MULTIPLATFORM */
> -
> EXPORT_SYMBOL(ppc64_enable_pmcs);
>
> /* XXX convert to rusty's on_one_cpu */
> Index: work/arch/ppc64/oprofile/op_model_power4.c
> ===================================================================
> --- work.orig/arch/ppc64/oprofile/op_model_power4.c
> +++ work/arch/ppc64/oprofile/op_model_power4.c
> @@ -83,6 +83,27 @@ static void power4_reg_setup(struct op_c
> mmcr0_val |= MMCR0_PROBLEM_DISABLE;
> }
>
> +void power4_enable_pmcs(void)
> +{
> + unsigned long hid0;
> +
> + hid0 = mfspr(HID0);
> + hid0 |= 1UL << (63 - 20);
> +
> + /* POWER4 requires the following sequence */
> + asm volatile(
> + "sync\n"
> + "mtspr %1, %0\n"
> + "mfspr %0, %1\n"
> + "mfspr %0, %1\n"
> + "mfspr %0, %1\n"
> + "mfspr %0, %1\n"
> + "mfspr %0, %1\n"
> + "mfspr %0, %1\n"
> + "isync" : "=&r" (hid0) : "i" (HID0), "0" (hid0):
> + "memory");
> +}
> +
> extern void ppc64_enable_pmcs(void);
>
> static void power4_cpu_setup(void *unused)
> Index: work/include/asm-ppc64/machdep.h
> ===================================================================
> --- work.orig/include/asm-ppc64/machdep.h
> +++ work/include/asm-ppc64/machdep.h
> @@ -140,11 +140,16 @@ struct machdep_calls {
>
> /* Idle loop for this platform, leave empty for default idle loop */
> int (*idle_loop)(void);
> +
> + /* Function to enable pmcs for this platform, called once per cpu. */
> + void (*enable_pmcs)(void);
> };
>
> extern int default_idle(void);
> extern int native_idle(void);
>
> +extern void power4_enable_pmcs(void);
> +
> extern struct machdep_calls ppc_md;
> extern char cmd_line[COMMAND_LINE_SIZE];
>
> _______________________________________________
> Linuxppc64-dev mailing list
> Linuxppc64-dev at ozlabs.org
> https://ozlabs.org/mailman/listinfo/linuxppc64-dev
--
Michael Ellerman
IBM OzLabs
email: michael:ellerman.id.au
inmsg: mpe:jabber.org
wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)
We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://ozlabs.org/pipermail/linuxppc64-dev/attachments/20050808/85ff0d73/attachment.pgp
More information about the Linuxppc64-dev
mailing list