Hi,

        I'm trying to monkey with cputable. It is hanging after printing:

Preparing BATs

on the console (PowerMac 8600 with PowerLogix 750GX card, 2.6.24 YDL 4.0).

I am guessing I am doing this PTRRELOC() thing wrong? Can someone explain what is going on here:

        *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;

Up above both s and t needed reloccing? This is from identify_cpu(). Does this have something to do with data items in different sections (i.e. initdata)?

I also welcome comments on where else the data I'm trying to graft into cputable might go (i.e. cpu_freq driver).

Thanks!

kevin
--- cputable-old_c      2008-02-25 18:24:23.000000000 -0800
+++ cputable-new_c      2008-04-30 14:31:37.000000000 -0700
@@ -38,11 +38,13 @@
 extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_750cx(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_750fx(unsigned long offset, struct cpu_spec* spec);
+extern void __setup_cpu_750gx(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
+
 #endif /* CONFIG_PPC32 */
 #ifdef CONFIG_PPC64
 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
@@ -70,8 +72,25 @@
                                 PPC_FEATURE_HAS_ALTIVEC_COMP)
 #define COMMON_USER_BOOKE      (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
                                 PPC_FEATURE_BOOKE)
 
+#ifdef CONFIG_PPC32
+static struct ppc_misc_750fgx __initdata ppc_misc_750fx={
+       .misc_cp=ppc_misc_cp_750fgx,
+       .min_ratio=2,           /* min bus ratio */
+       .max_ratio=20,          /* max bus ratio */
+       .min_core=400000,       /* min core frequency per spec */
+       .max_core=800000,       /* max core frequency per spec */
+};
+static struct ppc_misc_750fgx __initdata ppc_misc_750gx={
+       .misc_cp=ppc_misc_cp_750fgx,
+       .min_ratio=2,           /* min bus ratio */
+       .max_ratio=20,          /* max bus ratio */
+       .min_core=500000,       /* min core frequency per spec */
+       .max_core=1000000,      /* max core frequency per spec */
+};
+#endif /* CONFIG_PPC32 */
+
 static struct cpu_spec __initdata cpu_specs[] = {
 #ifdef CONFIG_PPC64
        {       /* Power3 */
                .pvr_mask               = 0xffff0000,
@@ -590,8 +609,9 @@
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
                .cpu_setup              = __setup_cpu_750,
+               .misc                   = (void *) &ppc_misc_750fx,
                .platform               = "ppc750",
        },
        {       /* 750FX rev 2.0 must disable HID0[DPM] */
                .pvr_mask               = 0xffffffff,
@@ -602,8 +622,9 @@
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
                .cpu_setup              = __setup_cpu_750,
+               .misc                   = (void *) &ppc_misc_750fx,
                .platform               = "ppc750",
        },
        {       /* 750FX (All revs except 2.0) */
                .pvr_mask               = 0xffff0000,
@@ -614,20 +635,48 @@
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
                .cpu_setup              = __setup_cpu_750fx,
+               .misc                   = (void *) &ppc_misc_750fx,
                .platform               = "ppc750",
        },
-       {       /* 750GX */
+       {       /* 750GX rev 1.x */
                .pvr_mask               = 0xffff0000,
                .pvr_value              = 0x70020000,
                .cpu_name               = "750GX",
                .cpu_features           = CPU_FTRS_750GX,
                .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
                .icache_bsize           = 32,
                .dcache_bsize           = 32,
                .num_pmcs               = 4,
-               .cpu_setup              = __setup_cpu_750fx,
+               .cpu_setup              = __setup_cpu_750gx,
+               .misc                   = (void *) &ppc_misc_750gx,
+               .platform               = "ppc750",
+       },
+       {       /* 750GX (rev 2.3, as used on PowerLogix 750GX upgrade card */
+               .pvr_mask               = 0xffffffff,
+               .pvr_value              = 0x00080203,
+               .cpu_name               = "750GX",
+               .cpu_features           = CPU_FTRS_750GX,
+               .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+               .num_pmcs               = 4,
+               .cpu_setup              = __setup_cpu_750gx,
+               .misc                   = (void *) &ppc_misc_750gx,
+               .platform               = "ppc750",
+       },
+       {       /* 750GX (All revs >= 2.0) */
+               .pvr_mask               = 0xffffff00,
+               .pvr_value              = 0x70020200,
+               .cpu_name               = "750GX",
+               .cpu_features           = CPU_FTRS_750GX,
+               .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
+               .num_pmcs               = 4,
+               .cpu_setup              = __setup_cpu_750gx,
+               .misc                   = (void *) &ppc_misc_750gx,
                .platform               = "ppc750",
        },
        {       /* 740/750 (L2CR bit need fixup for 740) */
                .pvr_mask               = 0xffff0000,
@@ -1331,8 +1380,34 @@
 #endif /* CONFIG_PPC32 */
 };
 
 static struct cpu_spec the_cpu_spec;
+#ifdef CONFIG_PPC32
+/*
+ * Used to hold misc data structure
+ */
+static int ppc_misc_space[4];
+
+void * __init ppc_misc_cp_750fgx(void *miscp)
+{
+struct ppc_misc_750fgx *s=(struct ppc_misc_750fgx *)miscp;
+struct ppc_misc_750fgx *t=(struct ppc_misc_750fgx *)&ppc_misc_space;
+
+       /*
+        * Make sure we have enough static space!
+        */
+       if(sizeof(struct ppc_misc_750fgx)>sizeof(ppc_misc_space)) return NULL;
+
+       s=PTRRELOC(s);
+//     t=PTRRELOC(t);
+
+       *t=*s;
+       t->misc_cp=NULL;
+
+       return &ppc_misc_space;
+}
+
+#endif /* CONFIG_PPC32 */
 
 struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
 {
        struct cpu_spec *s = cpu_specs;
@@ -1373,8 +1448,17 @@
                        if (s->cpu_setup) {
                                s->cpu_setup(offset, s);
                        }
 #endif /* CONFIG_PPC64 || CONFIG_BOOKE */
+#if 0
+                       if(s->misc) *PTRRELOC(&t->misc)=((struct ppc_misc_any *)
+                               (s->misc))->misc_cp(s->misc);
+                       else *PTRRELOC(&t->misc)=NULL;
+#else
+                       if(s->misc) t->misc=((struct ppc_misc_any *)
+                               (s->misc))->misc_cp(s->misc);
+                       else t->misc=NULL;
+#endif
                        return s;
                }
        BUG();
        return NULL;
--- cputable-old_h      2008-02-25 18:24:47.000000000 -0800
+++ cputable-new_h      2008-04-30 06:45:14.000000000 -0700
@@ -56,8 +56,20 @@
        PPC_PMC_IBM = 1,
        PPC_PMC_PA6T = 2,
 };
 
+struct ppc_misc_any {
+       void * (*misc_cp)(void *);
+};
+
+struct ppc_misc_750fgx {
+       void * (*misc_cp)(void *);
+       unsigned short min_ratio;
+       unsigned short max_ratio;
+       int min_core;
+       int max_core;
+};
+
 /* NOTE WELL: Update identify_cpu() if fields are added or removed! */
 struct cpu_spec {
        /* CPU is matched via (PVR & pvr_mask) == pvr_value */
        unsigned int    pvr_mask;
@@ -96,8 +108,12 @@
        unsigned long   oprofile_mmcra_clear;
 
        /* Name of processor class, for the ELF AT_PLATFORM entry */
        char            *platform;
+
+       /* miscellaneous catch all for various data (like min and max core
+        * frequencies for dual pll cpus) */
+       void *misc;
 };
 
 extern struct cpu_spec         *cur_cpu_spec;
 
@@ -249,9 +265,9 @@
 #define CPU_FTRS_750FX1        (CPU_FTRS_750 | CPU_FTR_DUAL_PLL_750FX | 
CPU_FTR_NO_DPM)
 #define CPU_FTRS_750FX2        (CPU_FTRS_750 | CPU_FTR_NO_DPM)
 #define CPU_FTRS_750FX (CPU_FTRS_750 | CPU_FTR_DUAL_PLL_750FX | \
                CPU_FTR_HAS_HIGH_BATS)
-#define CPU_FTRS_750GX (CPU_FTRS_750FX)
+#define CPU_FTRS_750GX (CPU_FTRS_750FX | CPU_FTR_DUAL_PLL_750FX)
 #define CPU_FTRS_7400_NOTAU    (CPU_FTR_COMMON | \
            CPU_FTR_MAYBE_CAN_DOZE | CPU_FTR_USE_TB | CPU_FTR_L2CR | \
            CPU_FTR_ALTIVEC_COMP | CPU_FTR_HPTE_TABLE | \
            CPU_FTR_MAYBE_CAN_NAP | CPU_FTR_PPC_LE)
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to