The patch replaces rtas_reset_signals() and rtas_activate_signals()
with pfm_cell_reset_signals() and pfm_cell_activate_signals() respectively
according to the platform identification. Moreover, there is a restriction
in the combination in PM signal group of Cell. The pfm_cell_pmc_check()
for the combination check is registered at the same time.

-- Takaki Azuma

Signed-off-by: Takaki Azuma <[EMAIL PROTECTED]>
Signed-off-by: Takayuki Uchikawa <[EMAIL PROTECTED]>

Index: linux-2.6/include/asm-powerpc/perfmon.h
===================================================================
--- linux-2.6.git/include/asm-powerpc/perfmon.h
+++ linux-2.6/include/asm-powerpc/perfmon.h
@@ -42,6 +42,8 @@ enum powerpc_pmu_type {
        PFM_POWERPC_PMU_CELL,
 };
 
+typedef struct cell_rtas_arg * struct_cell_rtas_arg;
+
 struct pfm_arch_pmu_info {
        enum powerpc_pmu_type pmu_style;
 
@@ -74,6 +76,11 @@ struct pfm_arch_pmu_info {
                             struct task_struct *task);
        int  (*unload_context)(struct pfm_context *ctx,
                               struct task_struct *task);
+
+#ifdef CONFIG_PPC_CELL
+       int (*reset_signals)(u32 cpu);
+       int (*activate_signals)(struct_cell_rtas_arg signals, int num_signals);
+#endif
 };
 
 #ifdef CONFIG_PPC32
@@ -367,5 +374,19 @@ struct pfm_arch_context {
 #define PFM_ARCH_SMPL_ALIGN_SIZE       0
 
 
+static inline int pfm_arch_reset_signals(int cpu)
+{
+       struct pfm_arch_pmu_info *arch_info = pfm_pmu_conf->arch_info;
+
+       return arch_info->reset_signals(cpu);
+}
+
+static inline int pfm_arch_activate_signals(struct_cell_rtas_arg signals, int 
num_signals)
+{
+       struct pfm_arch_pmu_info *arch_info = pfm_pmu_conf->arch_info;
+
+       return arch_info->activate_signals(signals, num_signals);
+}
+
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_PERFMON_H_ */
Index: linux-2.6/arch/powerpc/perfmon/Makefile
===================================================================
--- linux-2.6.git/arch/powerpc/perfmon/Makefile
+++ linux-2.6/arch/powerpc/perfmon/Makefile
@@ -1,4 +1,4 @@
 obj-$(CONFIG_PERFMON)          += perfmon.o
 obj-$(CONFIG_PERFMON_POWER5)   += perfmon_power5.o
 obj-$(CONFIG_PERFMON_PPC32)    += perfmon_ppc32.o
-obj-$(CONFIG_PERFMON_CELL)     += perfmon_cell.o
+obj-$(CONFIG_PERFMON_CELL)     += perfmon_cell.o perfmon_cell_signals.o
Index: linux-2.6/arch/powerpc/perfmon/perfmon_cell.c
===================================================================
--- linux-2.6.git/arch/powerpc/perfmon/perfmon_cell.c
+++ linux-2.6/arch/powerpc/perfmon/perfmon_cell.c
@@ -28,7 +28,10 @@
 #include <asm/cell-pmu.h>
 #include <asm/io.h>
 #include <asm/rtas.h>
+#include <asm/machdep.h>
+#include <asm/firmware.h>
 #include "../platforms/cell/cbe_regs.h"
+#include "./perfmon_cell_signals.h"
 
 MODULE_AUTHOR("Kevin Corry <[EMAIL PROTECTED]>, "
              "Carl Love <[EMAIL PROTECTED]>");
@@ -205,7 +208,7 @@ static void write_pm07_event(int cpu, un
        signal.signal_group = signal_number / 100;
        signal.bit = signal_number % 100;
 
-       rc = rtas_activate_signals(&signal, 1);
+       rc = pfm_arch_activate_signals(&signal, 1);
        if (rc) {
                PFM_WARN("%s(%d, %u, %lu): Error calling "
                         "rtas_activate_signal(): %d\n", __FUNCTION__,
@@ -352,7 +355,7 @@ void pfm_cell_restore_pmcs(struct pfm_ev
                num_used++;
        }
 
-       rc = rtas_activate_signals(signals, num_used);
+       rc = pfm_arch_activate_signals(signals, num_used);
        if (rc) {
                PFM_WARN("Error calling rtas_activate_signal(): %d\n", rc);
                /* FIX: We will also need this routine to be able to return
@@ -382,7 +385,7 @@ static int pfm_cell_unload_context(struc
                                   struct task_struct *task)
 {
        if (task == current || ctx->flags.system) {
-               rtas_reset_signals(smp_processor_id());
+               pfm_arch_reset_signals(smp_processor_id());
        }
        return 0;
 }
@@ -397,7 +400,7 @@ static int pfm_cell_unload_context(struc
 int pfm_cell_ctxswout_thread(struct task_struct *task,
                             struct pfm_context *ctx, struct pfm_event_set *set)
 {
-       rtas_reset_signals(smp_processor_id());
+       pfm_arch_reset_signals(smp_processor_id());
        return 0;
 }
 
@@ -553,6 +556,10 @@ static struct pfm_arch_pmu_info pfm_cell
        .restore_pmcs     = pfm_cell_restore_pmcs,
        .ctxswout_thread  = pfm_cell_ctxswout_thread,
        .unload_context   = pfm_cell_unload_context,
+#ifdef CONFIG_PPC_CELL
+       .reset_signals    = rtas_reset_signals,
+       .activate_signals = rtas_activate_signals,
+#endif
 };
 
 static struct pfm_pmu_config pfm_cell_pmu_conf = {
@@ -569,8 +576,25 @@ static struct pfm_pmu_config pfm_cell_pm
        .owner = THIS_MODULE,
 };
 
+static inline void pfm_cell_platform_probe(void)
+{
+       if (machine_is(celleb)) {
+               int cnum;
+
+               pfm_cell_pmu_info.reset_signals = pfm_cell_reset_signals;
+               pfm_cell_pmu_info.activate_signals = pfm_cell_activate_signals;
+               pfm_cell_pmu_conf.pmc_write_check = pfm_cell_pmc_check;
+               for (cnum = NR_CTRS; cnum < (NR_CTRS * 2); cnum++)
+                       pfm_cell_pmc_desc[cnum].type |= PFM_REG_WC;
+       }
+}
+
 static int __init pfm_cell_pmu_init_module(void)
 {
+#ifdef CONFIG_PPC_CELL
+       pfm_cell_platform_probe();
+#endif
+
        return pfm_pmu_register(&pfm_cell_pmu_conf);
 }
 

_______________________________________________
perfmon mailing list
[email protected]
http://www.hpl.hp.com/hosted/linux/mail-archives/perfmon/

Reply via email to