summaryrefslogtreecommitdiff
path: root/cpu/74xx_7xx
diff options
context:
space:
mode:
Diffstat (limited to 'cpu/74xx_7xx')
-rw-r--r--cpu/74xx_7xx/cpu.c24
-rw-r--r--cpu/74xx_7xx/cpu_init.c9
-rw-r--r--cpu/74xx_7xx/speed.c106
-rw-r--r--cpu/74xx_7xx/start.S7
4 files changed, 104 insertions, 42 deletions
diff --git a/cpu/74xx_7xx/cpu.c b/cpu/74xx_7xx/cpu.c
index 30a2091..629ed66 100644
--- a/cpu/74xx_7xx/cpu.c
+++ b/cpu/74xx_7xx/cpu.c
@@ -79,6 +79,10 @@ get_cpu_type(void)
type = CPU_750FX;
break;
+ case 0x7002:
+ type = CPU_750GX;
+ break;
+
case 0x800C:
type = CPU_7410;
break;
@@ -87,6 +91,14 @@ get_cpu_type(void)
type = CPU_7450;
break;
+ case 0x8001:
+ type = CPU_7455;
+ break;
+
+ case 0x8002:
+ type = CPU_7457;
+ break;
+
default:
break;
}
@@ -124,6 +136,10 @@ int checkcpu (void)
str = "750FX";
break;
+ case CPU_750GX:
+ str = "750GX";
+ break;
+
case CPU_755:
str = "755";
break;
@@ -140,6 +156,14 @@ int checkcpu (void)
str = "MPC7450";
break;
+ case CPU_7455:
+ str = "MPC7455";
+ break;
+
+ case CPU_7457:
+ str = "MPC7457";
+ break;
+
default:
printf("Unknown CPU -- PVR: 0x%08x\n", pvr);
return -1;
diff --git a/cpu/74xx_7xx/cpu_init.c b/cpu/74xx_7xx/cpu_init.c
index 2843e26..93f180f 100644
--- a/cpu/74xx_7xx/cpu_init.c
+++ b/cpu/74xx_7xx/cpu_init.c
@@ -39,9 +39,16 @@
void
cpu_init_f (void)
{
- if (get_cpu_type() == CPU_7450) {
+ switch (get_cpu_type()) {
+ case CPU_7450:
+ case CPU_7455:
+ case CPU_7457:
/* enable the timebase bit in HID0 */
set_hid0(get_hid0() | 0x4000000);
+ break;
+ default:
+ /* do nothing */
+ break;
}
}
diff --git a/cpu/74xx_7xx/speed.c b/cpu/74xx_7xx/speed.c
index 12bdf37..f94ff78 100644
--- a/cpu/74xx_7xx/speed.c
+++ b/cpu/74xx_7xx/speed.c
@@ -12,7 +12,7 @@
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
@@ -49,29 +49,29 @@ static const int hid1_multipliers_x_10[] = {
};
static const int hid1_fx_multipliers_x_10[] = {
- 00, /* 0000 - off */
- 00, /* 0001 - off */
- 10, /* 0010 - bypass */
- 10, /* 0011 - bypass */
- 20, /* 0100 - 2x */
- 25, /* 0101 - 2.5x */
- 30, /* 0110 - 3x */
- 35, /* 0111 - 3.5x */
- 40, /* 1000 - 4x */
- 45, /* 1001 - 4.5x */
- 50, /* 1010 - 5x */
- 55, /* 1011 - 5.5x */
- 60, /* 1100 - 6x */
- 65, /* 1101 - 6.5x */
- 70, /* 1110 - 7x */
- 75, /* 1111 - 7.5 */
- 80, /* 10000 - 8x */
- 85, /* 10001 - 8.5x */
- 90, /* 10010 - 9x */
- 95, /* 10011 - 9.5x */
- 100, /* 10100 - 10x */
- 110, /* 10101 - 11x */
- 120, /* 10110 - 12x */
+ 00, /* 0000 - off */
+ 00, /* 0001 - off */
+ 10, /* 0010 - bypass */
+ 10, /* 0011 - bypass */
+ 20, /* 0100 - 2x */
+ 25, /* 0101 - 2.5x */
+ 30, /* 0110 - 3x */
+ 35, /* 0111 - 3.5x */
+ 40, /* 1000 - 4x */
+ 45, /* 1001 - 4.5x */
+ 50, /* 1010 - 5x */
+ 55, /* 1011 - 5.5x */
+ 60, /* 1100 - 6x */
+ 65, /* 1101 - 6.5x */
+ 70, /* 1110 - 7x */
+ 75, /* 1111 - 7.5 */
+ 80, /* 10000 - 8x */
+ 85, /* 10001 - 8.5x */
+ 90, /* 10010 - 9x */
+ 95, /* 10011 - 9.5x */
+ 100, /* 10100 - 10x */
+ 110, /* 10101 - 11x */
+ 120, /* 10110 - 12x */
};
@@ -86,13 +86,48 @@ static const int hid1_fx_multipliers_x_10[] = {
int get_clocks (void)
{
DECLARE_GLOBAL_DATA_PTR;
-#ifdef CONFIG_750FX
- ulong clock = CFG_BUS_CLK * \
- hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
-#else
- ulong clock = CFG_BUS_CLK * \
- hid1_multipliers_x_10[get_hid1 () >> 28] / 10;
-#endif
+ ulong clock = 0;
+
+ /* calculate the clock frequency based upon the CPU type */
+ switch (get_cpu_type()) {
+ case CPU_7455:
+ case CPU_7457:
+ /*
+ * It is assumed that the PLL_EXT line is zero.
+ * Make sure division is done before multiplication to prevent 32-bit
+ * arithmetic overflows which will cause a negative number
+ */
+ clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF];
+ break;
+
+ case CPU_750GX:
+ case CPU_750FX:
+ clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;
+ break;
+
+ case CPU_7450:
+ case CPU_740:
+ case CPU_740P:
+ case CPU_745:
+ case CPU_750CX:
+ case CPU_750:
+ case CPU_750P:
+ case CPU_755:
+ case CPU_7400:
+ case CPU_7410:
+ /*
+ * Make sure division is done before multiplication to prevent 32-bit
+ * arithmetic overflows which will cause a negative number
+ */
+ clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[get_hid1 () >> 28];
+ break;
+
+ case CPU_UNKNOWN:
+ printf ("get_gclk_freq(): unknown CPU type\n");
+ clock = 0;
+ return (1);
+ }
+
gd->cpu_clk = clock;
gd->bus_clk = CFG_BUS_CLK;
@@ -100,12 +135,3 @@ int get_clocks (void)
}
/* ------------------------------------------------------------------------- */
-
-#if 0 /* disabled XXX - use global data instead */
-ulong get_bus_freq (ulong gclk_freq)
-{
- return CFG_BUS_CLK;
-}
-#endif /* 0 */
-
-/* ------------------------------------------------------------------------- */
diff --git a/cpu/74xx_7xx/start.S b/cpu/74xx_7xx/start.S
index 7d7a493..e8854f0 100644
--- a/cpu/74xx_7xx/start.S
+++ b/cpu/74xx_7xx/start.S
@@ -42,7 +42,10 @@
#include <asm/cache.h>
#include <asm/mmu.h>
+#if !defined(CONFIG_DB64360) && \
+ !defined(CONFIG_DB64460)
#include <galileo/gt64260R.h>
+#endif
#ifndef CONFIG_IDENT_STRING
#define CONFIG_IDENT_STRING ""
@@ -749,7 +752,9 @@ in_ram:
bne 5b
6:
mr r3, r10 /* Destination Address */
-#ifdef CONFIG_AMIGAONEG3SE
+#if defined(CONFIG_AMIGAONEG3SE) || \
+ defined(CONFIG_DB64360) || \
+ defined(CONFIG_DB64460)
mr r4, r9 /* Use RAM copy of the global data */
#endif
bl after_reloc