[U-Boot] [PATCH V2] Add display cpuinfo for Atmel at91 arm926ejs based cores
Remy Bohmer
linux at bohmer.net
Mon Jun 1 20:21:42 CEST 2009
Signed-off-by: Remy Bohmer <linux at bohmer.net>
---
V2 reworked comments from Jean-Christophe PLAGNIOL-VILLARD
cpu/arm926ejs/at91/Makefile | 1 +
cpu/arm926ejs/at91/cpuinfo.c | 65 +++++++++++++++++++++
include/asm-arm/arch-at91/at91_dbgu.h | 69 +++++++++++++++++++++++
include/asm-arm/arch-at91/cpu.h | 99 +++++++++++++++++++++++++++++++++
4 files changed, 234 insertions(+), 0 deletions(-)
create mode 100644 cpu/arm926ejs/at91/cpuinfo.c
create mode 100644 include/asm-arm/arch-at91/at91_dbgu.h
create mode 100644 include/asm-arm/arch-at91/cpu.h
diff --git a/cpu/arm926ejs/at91/Makefile b/cpu/arm926ejs/at91/Makefile
index 71acb0b..5c970a1 100644
--- a/cpu/arm926ejs/at91/Makefile
+++ b/cpu/arm926ejs/at91/Makefile
@@ -32,6 +32,7 @@ COBJS-$(CONFIG_AT91SAM9261) += at91sam9261_devices.o
COBJS-$(CONFIG_AT91SAM9263) += at91sam9263_devices.o
COBJS-$(CONFIG_AT91SAM9RL) += at91sam9rl_devices.o
COBJS-$(CONFIG_AT91_LED) += led.o
+COBJS-$(CONFIG_DISPLAY_CPUINFO) +=cpuinfo.o
COBJS-y += clock.o
COBJS-y += cpu.o
COBJS-y += timer.o
diff --git a/cpu/arm926ejs/at91/cpuinfo.c b/cpu/arm926ejs/at91/cpuinfo.c
new file mode 100644
index 0000000..1c6abad
--- /dev/null
+++ b/cpu/arm926ejs/at91/cpuinfo.c
@@ -0,0 +1,65 @@
+#include <command.h>
+#include <common.h>
+#include <arm926ejs.h>
+#include <asm/hardware.h>
+#include <asm/arch/at91_dbgu.h>
+#include <asm/arch/io.h>
+
+int print_cpuinfo(void)
+{
+ unsigned long cidr;
+ const char *txt;
+
+ cidr = at91_sys_read(AT91_DBGU_CIDR);
+
+ switch ((cidr & AT91_CIDR_EPROC) >> 5) {
+ /* 0x1 = ARM946ES, 0x2 = ARM7TDMI, 0x4 = ARM920T */
+ case 0x5: txt = "ARM926EJS"; break;
+ default: txt = "undefined"; break;
+ }
+ printf("Embedded Processor: %s\n", txt);
+
+ switch ((cidr & AT91_CIDR_ARCH) >> 20) {
+ case 0x19: txt = "AT91SAM9xx"; break;
+ case 0x29: txt = "AT91SAM9XExx"; break;
+ case 0x39: txt = "CAP9"; break;
+ default: txt = "undefined"; break;
+ }
+ printf("Architecture: %s Series\n", txt);
+
+ printf("CPU-revision: %c\n", (char)('A' + (cidr & AT91_CIDR_VERSION)));
+
+ switch ((cidr & AT91_CIDR_NVPTYP) >> 28) {
+ case 0x0: txt = "ROM"; break;
+ case 0x1: txt = "ROMless or onchip flash"; break;
+ case 0x2: txt = "Embedded flash memory"; break;
+ case 0x3: txt = "ROM and Embedded flash memory"; break;
+ case 0x4: txt = "SRAM emulating ROM"; break;
+ default: txt = "undefined"; break;
+ }
+ printf("NonVolatile Program Memory type: %s\n", txt);
+
+ switch (cidr & AT91_CIDR_SRAMSIZ) {
+ case AT91_CIDR_SRAMSIZ_1K: txt = "1K"; break;
+ case AT91_CIDR_SRAMSIZ_2K: txt = "2K"; break;
+ case AT91_CIDR_SRAMSIZ_112K: txt = "112K"; break;
+ case AT91_CIDR_SRAMSIZ_4K: txt = "4K"; break;
+ case AT91_CIDR_SRAMSIZ_80K: txt = "80K"; break;
+ case AT91_CIDR_SRAMSIZ_160K: txt = "160K"; break;
+ case AT91_CIDR_SRAMSIZ_8K: txt = "8K"; break;
+ case AT91_CIDR_SRAMSIZ_16K: txt = "16K"; break;
+ case AT91_CIDR_SRAMSIZ_32K: txt = "32K"; break;
+ case AT91_CIDR_SRAMSIZ_64K: txt = "64K"; break;
+ case AT91_CIDR_SRAMSIZ_128K: txt = "128K"; break;
+ case AT91_CIDR_SRAMSIZ_256K: txt = "256K"; break;
+ case AT91_CIDR_SRAMSIZ_96K: txt = "96K"; break;
+ case AT91_CIDR_SRAMSIZ_512K: txt = "512K"; break;
+ default: txt = "undefined"; break;
+ }
+ printf("Internal SRAM size: %s\n", txt);
+
+ if (cidr & AT91_CIDR_EXT)
+ printf("Extension ID: 0x%x\n", at91_sys_read(AT91_DBGU_EXID));
+
+ return 0;
+}
diff --git a/include/asm-arm/arch-at91/at91_dbgu.h b/include/asm-arm/arch-at91/at91_dbgu.h
new file mode 100644
index 0000000..55210da
--- /dev/null
+++ b/include/asm-arm/arch-at91/at91_dbgu.h
@@ -0,0 +1,69 @@
+/*
+ * include/asm-arm/arch-at91/at91_dbgu.h
+ *
+ * Copyright (C) 2005 Ivan Kokshaysky
+ * Copyright (C) SAN People
+ *
+ * Debug Unit (DBGU) - System peripherals registers.
+ * Based on AT91RM9200 datasheet revision E.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef AT91_DBGU_H
+#define AT91_DBGU_H
+
+#ifdef AT91_DBGU
+#define AT91_DBGU_CR (AT91_DBGU + 0x00) /* Control Register */
+#define AT91_DBGU_MR (AT91_DBGU + 0x04) /* Mode Register */
+#define AT91_DBGU_IER (AT91_DBGU + 0x08) /* Interrupt Enable */
+#define AT91_DBGU_TXRDY (1 << 1) /* Transmitter Ready */
+#define AT91_DBGU_TXEMPTY (1 << 9) /* Transmitter Empty */
+#define AT91_DBGU_IDR (AT91_DBGU + 0x0c) /* Interrupt Disable */
+#define AT91_DBGU_IMR (AT91_DBGU + 0x10) /* Interrupt Mask */
+#define AT91_DBGU_SR (AT91_DBGU + 0x14) /* Status Register */
+#define AT91_DBGU_RHR (AT91_DBGU + 0x18) /* Receiver Holding */
+#define AT91_DBGU_THR (AT91_DBGU + 0x1c) /* Transmitter Holding */
+#define AT91_DBGU_BRGR (AT91_DBGU + 0x20) /* Baud Rate Generator */
+
+#define AT91_DBGU_CIDR (AT91_DBGU + 0x40) /* Chip ID Register */
+#define AT91_DBGU_EXID (AT91_DBGU + 0x44) /* Chip ID Extension */
+#define AT91_DBGU_FNR (AT91_DBGU + 0x48) /* Force NTRST [SAM9 only] */
+#define AT91_DBGU_FNTRST (1 << 0) /* Force NTRST */
+
+#endif /* AT91_DBGU */
+
+/*
+ * Some AT91 parts that don't have full DEBUG units still support the ID
+ * and extensions register.
+ */
+#define AT91_CIDR_VERSION (0x1f << 0) /* Version of the Device */
+#define AT91_CIDR_EPROC (7 << 5) /* Embedded Processor */
+#define AT91_CIDR_NVPSIZ (0xf << 8) /* Nonvolatile Program
+ Memory Size */
+#define AT91_CIDR_NVPSIZ2 (0xf << 12) /* Second Nonvolatile
+ Program Memory Size */
+#define AT91_CIDR_SRAMSIZ (0xf << 16) /* Internal SRAM Size */
+#define AT91_CIDR_SRAMSIZ_1K (1 << 16)
+#define AT91_CIDR_SRAMSIZ_2K (2 << 16)
+#define AT91_CIDR_SRAMSIZ_112K (4 << 16)
+#define AT91_CIDR_SRAMSIZ_4K (5 << 16)
+#define AT91_CIDR_SRAMSIZ_80K (6 << 16)
+#define AT91_CIDR_SRAMSIZ_160K (7 << 16)
+#define AT91_CIDR_SRAMSIZ_8K (8 << 16)
+#define AT91_CIDR_SRAMSIZ_16K (9 << 16)
+#define AT91_CIDR_SRAMSIZ_32K (10 << 16)
+#define AT91_CIDR_SRAMSIZ_64K (11 << 16)
+#define AT91_CIDR_SRAMSIZ_128K (12 << 16)
+#define AT91_CIDR_SRAMSIZ_256K (13 << 16)
+#define AT91_CIDR_SRAMSIZ_96K (14 << 16)
+#define AT91_CIDR_SRAMSIZ_512K (15 << 16)
+#define AT91_CIDR_ARCH (0xff << 20) /* Architecture Id */
+#define AT91_CIDR_NVPTYP (7 << 28) /* Nonvolatile Program
+ Memory Type */
+#define AT91_CIDR_EXT (1 << 31) /* Extension Flag */
+
+#endif
diff --git a/include/asm-arm/arch-at91/cpu.h b/include/asm-arm/arch-at91/cpu.h
new file mode 100644
index 0000000..b5e5715
--- /dev/null
+++ b/include/asm-arm/arch-at91/cpu.h
@@ -0,0 +1,99 @@
+/*
+ * include/asm-arm/arch-at91/cpu.h
+ *
+ * Copyright (C) 2006 SAN People
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#ifndef __ASM_ARCH_CPU_H
+#define __ASM_ARCH_CPU_H
+
+#include <asm/hardware.h>
+#include <asm/arch/at91_dbgu.h>
+#include <asm/arch/io.h>
+
+
+#define ARCH_ID_AT91RM9200 0x09290780
+#define ARCH_ID_AT91SAM9260 0x019803a0
+#define ARCH_ID_AT91SAM9261 0x019703a0
+#define ARCH_ID_AT91SAM9263 0x019607a0
+#define ARCH_ID_AT91SAM9RL64 0x019b03a0
+#define ARCH_ID_AT91CAP9 0x039A03A0
+
+#define ARCH_ID_AT91SAM9XE128 0x329973a0
+#define ARCH_ID_AT91SAM9XE256 0x329a93a0
+#define ARCH_ID_AT91SAM9XE512 0x329aa3a0
+
+#define ARCH_ID_AT91M40800 0x14080044
+#define ARCH_ID_AT91R40807 0x44080746
+#define ARCH_ID_AT91M40807 0x14080745
+#define ARCH_ID_AT91R40008 0x44000840
+
+static inline unsigned long at91_cpu_identify(void)
+{
+ return (at91_sys_read(AT91_DBGU_CIDR) & ~AT91_CIDR_VERSION);
+}
+
+
+#define ARCH_FAMILY_AT91X92 0x09200000
+#define ARCH_FAMILY_AT91SAM9 0x01900000
+#define ARCH_FAMILY_AT91SAM9XE 0x02900000
+
+static inline unsigned long at91_arch_identify(void)
+{
+ return (at91_sys_read(AT91_DBGU_CIDR) & AT91_CIDR_ARCH);
+}
+
+
+#ifdef CONFIG_AT91RM9200
+/* no actual detection for this architecture */
+#define cpu_is_at91rm9200() (1)
+#else
+#define cpu_is_at91rm9200() (0)
+#endif
+
+#ifdef CONFIG_AT91SAM9261
+#define cpu_is_at91sam9xe() (at91_arch_identify() == ARCH_FAMILY_AT91SAM9XE)
+#define cpu_is_at91sam9260() ((at91_cpu_identify() == ARCH_ID_AT91SAM9260) \
+ || cpu_is_at91sam9xe())
+#else
+#define cpu_is_at91sam9xe() (0)
+#define cpu_is_at91sam9260() (0)
+#endif
+
+#ifdef CONFIG_AT91SAM9261
+#define cpu_is_at91sam9261() (at91_cpu_identify() == ARCH_ID_AT91SAM9261)
+#else
+#define cpu_is_at91sam9261() (0)
+#endif
+
+#ifdef CONFIG_AT91SAM9261
+#define cpu_is_at91sam9263() (at91_cpu_identify() == ARCH_ID_AT91SAM9263)
+#else
+#define cpu_is_at91sam9263() (0)
+#endif
+
+#ifdef CONFIG_AT91SAM9RL
+#define cpu_is_at91sam9rl() (at91_cpu_identify() == ARCH_ID_AT91SAM9RL64)
+#else
+#define cpu_is_at91sam9rl() (0)
+#endif
+
+#ifdef CONFIG_AT91CAP9
+#define cpu_is_at91cap9() (at91_cpu_identify() == ARCH_ID_AT91CAP9)
+#else
+#define cpu_is_at91cap9() (0)
+#endif
+
+/*
+ * Since this is ARM, we will never run on any AVR32 CPU. But these
+ * definitions may reduce clutter in common drivers.
+ */
+#define cpu_is_at32ap7000() (0)
+
+#endif
--
1.6.0.4
More information about the U-Boot
mailing list