提交 54cebc68 编写于 作者: L Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/blackfin-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/blackfin-2.6: (60 commits)
  Blackfin arch: make sure we include the fix for SPORT hysteresis when reprogramming clocks
  Blackfin arch: Fix bogus str_ident check in gpio code
  Blackfin arch: AD7879 Touchscreen driver
  Blackfin arch: introducing bfin_addr_dcachable
  Blackfin arch: fix a typo in comments
  Blackfin arch: Remove useless head file
  Blackfin arch: make sure L2 start and length are always defined (fixes building on BF542)
  Blackfin arch: use the Blackfin on-chip ROM to do software reset when possible
  Blackfin arch: update anomaly headers to match the latest sheet
  Blackfin arch: bfin_reset() is an internal reboot function ... everyone should go through machine_restart()
  Blackfin arch: print out error/warning if you are running on the incorrect CPU type
  Blackfin arch: remove non-bf54x ifdef logic since this file is only compiled on bf54x parts
  Blackfin arch: update board defconfigs
  Blackfin arch: Add optional verbose debug
  Blackfin arch: emulate a TTY over the EMUDAT/JTAG interface
  Blackfin arch: have is_user_addr_valid() check for overflows (like when address is -1)
  Blackfin arch: ptrace - fix off-by-one check on end of memory regions
  Blackfin arch: Enable framebuffer support for the BF526-EZkit TFT LCD display
  Blackfin arch: flash memory map and dm9000 resources updating
  Blackfin arch: early prink code still use uart core console functions to parse and set configure option string
  ...
A Simple Guide to Configure KGDB
Sonic Zhang <sonic.zhang@analog.com>
Aug. 24th 2006
This KGDB patch enables the kernel developer to do source level debugging on
the kernel for the Blackfin architecture. The debugging works over either the
ethernet interface or one of the uarts. Both software breakpoints and
hardware breakpoints are supported in this version.
http://docs.blackfin.uclinux.org/doku.php?id=kgdb
2 known issues:
1. This bug:
http://blackfin.uclinux.org/tracker/index.php?func=detail&aid=544&group_id=18&atid=145
The GDB client for Blackfin uClinux causes incorrect values of local
variables to be displayed when the user breaks the running of kernel in GDB.
2. Because of a hardware bug in Blackfin 533 v1.0.3:
05000067 - Watchpoints (Hardware Breakpoints) are not supported
Hardware breakpoints cannot be set properly.
Debug over Ethernet:
1. Compile and install the cross platform version of gdb for blackfin, which
can be found at $(BINROOT)/bfin-elf-gdb.
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
With this selected, option "Full Symbolic/Source Debugging support" and
"Compile the kernel with frame pointers" are also selected.
3. Select option "KGDB: connect over (Ethernet)". Add "kgdboe=@target-IP/,@host-IP/" to
the option "Compiled-in Kernel Boot Parameter" under "Kernel hacking".
4. Connect minicom to the serial port and boot the kernel image.
5. Configure the IP "/> ifconfig eth0 target-IP"
6. Start GDB client "bfin-elf-gdb vmlinux".
7. Connect to the target "(gdb) target remote udp:target-IP:6443".
8. Set software breakpoint "(gdb) break sys_open".
9. Continue "(gdb) c".
10. Run ls in the target console "/> ls".
11. Breakpoint hits. "Breakpoint 1: sys_open(..."
12. Display local variables and function paramters.
(*) This operation gives wrong results, see known issue 1.
13. Single stepping "(gdb) si".
14. Remove breakpoint 1. "(gdb) del 1"
15. Set hardware breakpoint "(gdb) hbreak sys_open".
16. Continue "(gdb) c".
17. Run ls in the target console "/> ls".
18. Hardware breakpoint hits. "Breakpoint 1: sys_open(...".
(*) This hardware breakpoint will not be hit, see known issue 2.
19. Continue "(gdb) c".
20. Interrupt the target in GDB "Ctrl+C".
21. Detach from the target "(gdb) detach".
22. Exit GDB "(gdb) quit".
Debug over the UART:
1. Compile and install the cross platform version of gdb for blackfin, which
can be found at $(BINROOT)/bfin-elf-gdb.
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
With this selected, option "Full Symbolic/Source Debugging support" and
"Compile the kernel with frame pointers" are also selected.
3. Select option "KGDB: connect over (UART)". Set "KGDB: UART port number" to be
a different one from the console. Don't forget to change the mode of
blackfin serial driver to PIO. Otherwise kgdb works incorrectly on UART.
4. If you want connect to kgdb when the kernel boots, enable
"KGDB: Wait for gdb connection early"
5. Compile kernel.
6. Connect minicom to the serial port of the console and boot the kernel image.
7. Start GDB client "bfin-elf-gdb vmlinux".
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
9. Connect to the target on the second serial port "(gdb) target remote /dev/ttyS1".
10. Set software breakpoint "(gdb) break sys_open".
11. Continue "(gdb) c".
12. Run ls in the target console "/> ls".
13. A breakpoint is hit. "Breakpoint 1: sys_open(..."
14. All other operations are the same as that in KGDB over Ethernet.
Debug over the same UART as console:
1. Compile and install the cross platform version of gdb for blackfin, which
can be found at $(BINROOT)/bfin-elf-gdb.
2. Apply this patch to the 2.6.x kernel. Select the menuconfig option under
"Kernel hacking" -> "Kernel debugging" -> "KGDB: kernel debug with remote gdb".
With this selected, option "Full Symbolic/Source Debugging support" and
"Compile the kernel with frame pointers" are also selected.
3. Select option "KGDB: connect over UART". Set "KGDB: UART port number" to console.
Don't forget to change the mode of blackfin serial driver to PIO.
Otherwise kgdb works incorrectly on UART.
4. If you want connect to kgdb when the kernel boots, enable
"KGDB: Wait for gdb connection early"
5. Connect minicom to the serial port and boot the kernel image.
6. (Optional) Ask target to wait for gdb connection by entering Ctrl+A. In minicom, you should enter Ctrl+A+A.
7. Start GDB client "bfin-elf-gdb vmlinux".
8. Set the baud rate in GDB "(gdb) set remotebaud 57600".
9. Connect to the target "(gdb) target remote /dev/ttyS0".
10. Set software breakpoint "(gdb) break sys_open".
11. Continue "(gdb) c". Then enter Ctrl+C twice to stop GDB connection.
12. Run ls in the target console "/> ls". Dummy string can be seen on the console.
13. Then connect the gdb to target again. "(gdb) target remote /dev/ttyS0".
Now you will find a breakpoint is hit. "Breakpoint 1: sys_open(..."
14. All other operations are the same as that in KGDB over Ethernet. The only
difference is that after continue command in GDB, please stop GDB
connection by 2 "Ctrl+C"s and connect again after breakpoints are hit or
Ctrl+A is entered.
...@@ -162,16 +162,28 @@ config BF549 ...@@ -162,16 +162,28 @@ config BF549
config BF561 config BF561
bool "BF561" bool "BF561"
help help
Not Supported Yet - Work in progress - BF561 Processor Support. BF561 Processor Support.
endchoice endchoice
config BF_REV_MIN
int
default 0 if (BF52x || BF54x)
default 2 if (BF537 || BF536 || BF534)
default 3 if (BF561 ||BF533 || BF532 || BF531)
config BF_REV_MAX
int
default 2 if (BF52x || BF54x)
default 3 if (BF537 || BF536 || BF534)
default 5 if (BF561)
default 6 if (BF533 || BF532 || BF531)
choice choice
prompt "Silicon Rev" prompt "Silicon Rev"
default BF_REV_0_1 if BF527 default BF_REV_0_1 if (BF52x || BF54x)
default BF_REV_0_2 if BF537 default BF_REV_0_2 if (BF534 || BF536 || BF537)
default BF_REV_0_3 if BF533 default BF_REV_0_3 if (BF531 || BF532 || BF533 || BF561)
default BF_REV_0_0 if BF549
config BF_REV_0_0 config BF_REV_0_0
bool "0.0" bool "0.0"
...@@ -183,7 +195,7 @@ config BF_REV_0_1 ...@@ -183,7 +195,7 @@ config BF_REV_0_1
config BF_REV_0_2 config BF_REV_0_2
bool "0.2" bool "0.2"
depends on (BF537 || BF536 || BF534) depends on (BF52x || BF537 || BF536 || BF534 || BF54x)
config BF_REV_0_3 config BF_REV_0_3
bool "0.3" bool "0.3"
...@@ -197,6 +209,10 @@ config BF_REV_0_5 ...@@ -197,6 +209,10 @@ config BF_REV_0_5
bool "0.5" bool "0.5"
depends on (BF561 || BF533 || BF532 || BF531) depends on (BF561 || BF533 || BF532 || BF531)
config BF_REV_0_6
bool "0.6"
depends on (BF533 || BF532 || BF531)
config BF_REV_ANY config BF_REV_ANY
bool "any" bool "any"
...@@ -249,7 +265,7 @@ config MEM_MT48LC8M32B2B5_7 ...@@ -249,7 +265,7 @@ config MEM_MT48LC8M32B2B5_7
config MEM_MT48LC32M16A2TG_75 config MEM_MT48LC32M16A2TG_75
bool bool
depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP) depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP || BFIN526_EZBRD)
default y default y
source "arch/blackfin/mach-bf527/Kconfig" source "arch/blackfin/mach-bf527/Kconfig"
...@@ -286,13 +302,20 @@ config BOOT_LOAD ...@@ -286,13 +302,20 @@ config BOOT_LOAD
memory region is used to capture NULL pointer references as well memory region is used to capture NULL pointer references as well
as some core kernel functions. as some core kernel functions.
config ROM_BASE
hex "Kernel ROM Base"
default "0x20040000"
range 0x20000000 0x20400000 if !(BF54x || BF561)
range 0x20000000 0x30000000 if (BF54x || BF561)
help
comment "Clock/PLL Setup" comment "Clock/PLL Setup"
config CLKIN_HZ config CLKIN_HZ
int "Frequency of the crystal on the board in Hz" int "Frequency of the crystal on the board in Hz"
default "11059200" if BFIN533_STAMP default "11059200" if BFIN533_STAMP
default "27000000" if BFIN533_EZKIT default "27000000" if BFIN533_EZKIT
default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP) default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD)
default "30000000" if BFIN561_EZKIT default "30000000" if BFIN561_EZKIT
default "24576000" if PNAV10 default "24576000" if PNAV10
default "10000000" if BFIN532_IP0X default "10000000" if BFIN532_IP0X
...@@ -332,7 +355,7 @@ config VCO_MULT ...@@ -332,7 +355,7 @@ config VCO_MULT
default "22" if BFIN533_BLUETECHNIX_CM default "22" if BFIN533_BLUETECHNIX_CM
default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM)
default "20" if BFIN561_EZKIT default "20" if BFIN561_EZKIT
default "16" if (H8606_HVSISTEMAS || BLACKSTAMP) default "16" if (H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD)
help help
This controls the frequency of the on-chip PLL. This can be between 1 and 64. This controls the frequency of the on-chip PLL. This can be between 1 and 64.
PLL Frequency = (Crystal Frequency) * (this setting) PLL Frequency = (Crystal Frequency) * (this setting)
...@@ -368,14 +391,6 @@ config SCLK_DIV ...@@ -368,14 +391,6 @@ config SCLK_DIV
This can be between 1 and 15 This can be between 1 and 15
System Clock = (PLL frequency) / (this setting) System Clock = (PLL frequency) / (this setting)
config MAX_MEM_SIZE
int "Max SDRAM Memory Size in MBytes"
depends on !MPU
default 512
help
This is the max memory size that the kernel will create CPLB
tables for. Your system will not be able to handle any more.
choice choice
prompt "DDR SDRAM Chip Type" prompt "DDR SDRAM Chip Type"
depends on BFIN_KERNEL_CLOCK depends on BFIN_KERNEL_CLOCK
...@@ -389,6 +404,14 @@ config MEM_MT46V32M16_5B ...@@ -389,6 +404,14 @@ config MEM_MT46V32M16_5B
bool "MT46V32M16_5B" bool "MT46V32M16_5B"
endchoice endchoice
config MAX_MEM_SIZE
int "Max SDRAM Memory Size in MBytes"
depends on !MPU
default 512
help
This is the max memory size that the kernel will create CPLB
tables for. Your system will not be able to handle any more.
# #
# Max & Min Speeds for various Chips # Max & Min Speeds for various Chips
# #
...@@ -455,8 +478,6 @@ config CYCLES_CLOCKSOURCE ...@@ -455,8 +478,6 @@ config CYCLES_CLOCKSOURCE
source kernel/time/Kconfig source kernel/time/Kconfig
comment "Memory Setup"
comment "Misc" comment "Misc"
choice choice
...@@ -622,6 +643,15 @@ config CPLB_SWITCH_TAB_L1 ...@@ -622,6 +643,15 @@ config CPLB_SWITCH_TAB_L1
If enabled, the CPLB Switch Tables are linked If enabled, the CPLB Switch Tables are linked
into L1 data memory. (less latency) into L1 data memory. (less latency)
config APP_STACK_L1
bool "Support locating application stack in L1 Scratch Memory"
default y
help
If enabled the application stack can be located in L1
scratch memory (less latency).
Currently only works with FLAT binaries.
comment "Speed Optimizations" comment "Speed Optimizations"
config BFIN_INS_LOWOVERHEAD config BFIN_INS_LOWOVERHEAD
bool "ins[bwl] low overhead, higher interrupt latency" bool "ins[bwl] low overhead, higher interrupt latency"
...@@ -755,6 +785,13 @@ config BFIN_WT ...@@ -755,6 +785,13 @@ config BFIN_WT
endchoice endchoice
config BFIN_L2_CACHEABLE
bool "Cache L2 SRAM"
depends on (BFIN_DCACHE || BFIN_ICACHE) && (BF54x || BF561)
default n
help
Select to make L2 SRAM cacheable in L1 data and instruction cache.
config MPU config MPU
bool "Enable the memory protection unit (EXPERIMENTAL)" bool "Enable the memory protection unit (EXPERIMENTAL)"
default n default n
......
...@@ -2,6 +2,22 @@ menu "Kernel hacking" ...@@ -2,6 +2,22 @@ menu "Kernel hacking"
source "lib/Kconfig.debug" source "lib/Kconfig.debug"
config HAVE_ARCH_KGDB
def_bool y
config DEBUG_VERBOSE
bool "Verbose fault messages"
default y
select PRINTK
help
When a program crashes due to an exception, or the kernel detects
an internal error, the kernel can print a not so brief message
explaining what the problem was. This debugging information is
useful to developers and kernel hackers when tracking down problems,
but mostly meaningless to other people. This is always helpful for
debugging but serves no purpose on a production system.
Most people should say N here.
config DEBUG_MMRS config DEBUG_MMRS
bool "Generate Blackfin MMR tree" bool "Generate Blackfin MMR tree"
select DEBUG_FS select DEBUG_FS
...@@ -22,6 +38,44 @@ config DEBUG_HWERR ...@@ -22,6 +38,44 @@ config DEBUG_HWERR
hardware error interrupts and need to know where they are coming hardware error interrupts and need to know where they are coming
from. from.
config DEBUG_DOUBLEFAULT
bool "Debug Double Faults"
default n
help
If an exception is caused while executing code within the exception
handler, the NMI handler, the reset vector, or in emulator mode,
a double fault occurs. On the Blackfin, this is a unrecoverable
event. You have two options:
- RESET exactly when double fault occurs. The excepting
instruction address is stored in RETX, where the next kernel
boot will print it out.
- Print debug message. This is much more error prone, although
easier to handle. It is error prone since:
- The excepting instruction is not committed.
- All writebacks from the instruction are prevented.
- The generated exception is not taken.
- The EXCAUSE field is updated with an unrecoverable event
The only way to check this is to see if EXCAUSE contains the
unrecoverable event value at every exception return. By selecting
this option, you are skipping over the faulting instruction, and
hoping things stay together enough to print out a debug message.
This does add a little kernel code, but is the only method to debug
double faults - if unsure say "Y"
choice
prompt "Double Fault Failure Method"
default DEBUG_DOUBLEFAULT_PRINT
depends on DEBUG_DOUBLEFAULT
config DEBUG_DOUBLEFAULT_PRINT
bool "Print"
config DEBUG_DOUBLEFAULT_RESET
bool "Reset"
endchoice
config DEBUG_ICACHE_CHECK config DEBUG_ICACHE_CHECK
bool "Check Instruction cache coherency" bool "Check Instruction cache coherency"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
...@@ -143,6 +197,7 @@ config DEBUG_BFIN_NO_KERN_HWTRACE ...@@ -143,6 +197,7 @@ config DEBUG_BFIN_NO_KERN_HWTRACE
config EARLY_PRINTK config EARLY_PRINTK
bool "Early printk" bool "Early printk"
default n default n
select SERIAL_CORE_CONSOLE
help help
This option enables special console drivers which allow the kernel This option enables special console drivers which allow the kernel
to print messages very early in the bootup process. to print messages very early in the bootup process.
......
...@@ -67,6 +67,7 @@ rev-$(CONFIG_BF_REV_0_2) := 0.2 ...@@ -67,6 +67,7 @@ rev-$(CONFIG_BF_REV_0_2) := 0.2
rev-$(CONFIG_BF_REV_0_3) := 0.3 rev-$(CONFIG_BF_REV_0_3) := 0.3
rev-$(CONFIG_BF_REV_0_4) := 0.4 rev-$(CONFIG_BF_REV_0_4) := 0.4
rev-$(CONFIG_BF_REV_0_5) := 0.5 rev-$(CONFIG_BF_REV_0_5) := 0.5
rev-$(CONFIG_BF_REV_0_6) := 0.6
rev-$(CONFIG_BF_REV_NONE) := none rev-$(CONFIG_BF_REV_NONE) := none
rev-$(CONFIG_BF_REV_ANY) := any rev-$(CONFIG_BF_REV_ANY) := any
......
此差异已折叠。
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.22.12 # Linux kernel version: 2.6.22.14
# #
# CONFIG_MMU is not set # CONFIG_MMU is not set
# CONFIG_FPU is not set # CONFIG_FPU is not set
...@@ -192,7 +192,7 @@ CONFIG_CLKIN_HZ=25000000 ...@@ -192,7 +192,7 @@ CONFIG_CLKIN_HZ=25000000
# CONFIG_BFIN_KERNEL_CLOCK is not set # CONFIG_BFIN_KERNEL_CLOCK is not set
CONFIG_MAX_VCO_HZ=400000000 CONFIG_MAX_VCO_HZ=400000000
CONFIG_MIN_VCO_HZ=50000000 CONFIG_MIN_VCO_HZ=50000000
CONFIG_MAX_SCLK_HZ=133000000 CONFIG_MAX_SCLK_HZ=133333333
CONFIG_MIN_SCLK_HZ=27000000 CONFIG_MIN_SCLK_HZ=27000000
# #
...@@ -516,7 +516,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y ...@@ -516,7 +516,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
# #
# CONFIG_MTD_DATAFLASH is not set # CONFIG_MTD_DATAFLASH is not set
CONFIG_MTD_M25P80=y CONFIG_MTD_M25P80=y
CONFIG_M25PXX_USE_FAST_READ=y # CONFIG_M25PXX_USE_FAST_READ is not set
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_PHRAM is not set # CONFIG_MTD_PHRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
...@@ -635,25 +635,25 @@ CONFIG_INPUT=y ...@@ -635,25 +635,25 @@ CONFIG_INPUT=y
# CONFIG_INPUT_MOUSEDEV is not set # CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set # CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_TSDEV is not set # CONFIG_INPUT_TSDEV is not set
CONFIG_INPUT_EVDEV=m CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
# #
# Input Device Drivers # Input Device Drivers
# #
# CONFIG_INPUT_KEYBOARD is not set CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ATKBD is not set
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
CONFIG_KEYBOARD_GPIO=y
# CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_MOUSE is not set
# CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set # CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y # CONFIG_INPUT_MISC is not set
# CONFIG_INPUT_ATI_REMOTE is not set
# CONFIG_INPUT_ATI_REMOTE2 is not set
# CONFIG_INPUT_KEYSPAN_REMOTE is not set
# CONFIG_INPUT_POWERMATE is not set
# CONFIG_INPUT_YEALINK is not set
# CONFIG_INPUT_UINPUT is not set
# CONFIG_BF53X_PFBUTTONS is not set
# #
# Hardware I/O ports # Hardware I/O ports
...@@ -681,7 +681,15 @@ CONFIG_BFIN_TIMER_LATENCY=y ...@@ -681,7 +681,15 @@ CONFIG_BFIN_TIMER_LATENCY=y
# #
# Serial drivers # Serial drivers
# #
# CONFIG_SERIAL_8250 is not set CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
CONFIG_SERIAL_8250_NR_UARTS=4
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
# CONFIG_SERIAL_8250_MANY_PORTS is not set
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_RSA is not set
# #
# Non-8250 serial port support # Non-8250 serial port support
......
...@@ -63,7 +63,6 @@ extern void bfin_dcache_init(void); ...@@ -63,7 +63,6 @@ extern void bfin_dcache_init(void);
extern void init_exception_vectors(void); extern void init_exception_vectors(void);
extern void program_IAR(void); extern void program_IAR(void);
extern void bfin_reset(void);
extern asmlinkage void lower_to_irq14(void); extern asmlinkage void lower_to_irq14(void);
extern asmlinkage void bfin_return_from_exception(void); extern asmlinkage void bfin_return_from_exception(void);
extern asmlinkage void evt14_softirq(void); extern asmlinkage void evt14_softirq(void);
...@@ -92,6 +91,8 @@ extern int sram_free(const void*); ...@@ -92,6 +91,8 @@ extern int sram_free(const void*);
extern void *sram_alloc_with_lsl(size_t, unsigned long); extern void *sram_alloc_with_lsl(size_t, unsigned long);
extern int sram_free_with_lsl(const void*); extern int sram_free_with_lsl(const void*);
extern void *isram_memcpy(void *dest, const void *src, size_t n);
extern const char bfin_board_name[]; extern const char bfin_board_name[];
extern unsigned long bfin_sic_iwr[]; extern unsigned long bfin_sic_iwr[];
...@@ -104,7 +105,7 @@ extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], ...@@ -104,7 +105,7 @@ extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
_stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[],
_ebss_l2[], _l2_lma_start[]; _ebss_l2[], _l2_lma_start[];
/* only used when CONFIG_MTD_UCLINUX */ /* only used when MTD_UCLINUX */
extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size;
#ifdef CONFIG_BFIN_ICACHE_LOCK #ifdef CONFIG_BFIN_ICACHE_LOCK
......
/* Blackfin on-chip ROM API
*
* Copyright 2008 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef __BFROM_H__
#define __BFROM_H__
#include <linux/types.h>
/* Possible syscontrol action flags */
#define SYSCTRL_READ 0x00000000 /* read registers */
#define SYSCTRL_WRITE 0x00000001 /* write registers */
#define SYSCTRL_SYSRESET 0x00000002 /* perform system reset */
#define SYSCTRL_CORERESET 0x00000004 /* perform core reset */
#define SYSCTRL_SOFTRESET 0x00000006 /* perform core and system reset */
#define SYSCTRL_VRCTL 0x00000010 /* read/write VR_CTL register */
#define SYSCTRL_EXTVOLTAGE 0x00000020 /* VDDINT supplied externally */
#define SYSCTRL_INTVOLTAGE 0x00000000 /* VDDINT generated by on-chip regulator */
#define SYSCTRL_OTPVOLTAGE 0x00000040 /* For Factory Purposes Only */
#define SYSCTRL_PLLCTL 0x00000100 /* read/write PLL_CTL register */
#define SYSCTRL_PLLDIV 0x00000200 /* read/write PLL_DIV register */
#define SYSCTRL_LOCKCNT 0x00000400 /* read/write PLL_LOCKCNT register */
#define SYSCTRL_PLLSTAT 0x00000800 /* read/write PLL_STAT register */
typedef struct ADI_SYSCTRL_VALUES {
uint16_t uwVrCtl;
uint16_t uwPllCtl;
uint16_t uwPllDiv;
uint16_t uwPllLockCnt;
uint16_t uwPllStat;
} ADI_SYSCTRL_VALUES;
static uint32_t (* const bfrom_SysControl)(uint32_t action_flags, ADI_SYSCTRL_VALUES *power_settings, void *reserved) = (void *)0xEF000038;
/* We need a dedicated function since we need to screw with the stack pointer
* when resetting. The on-chip ROM will save/restore registers on the stack
* when doing a system reset, so the stack cannot be outside of the chip.
*/
__attribute__((__noreturn__))
static inline void bfrom_SoftReset(void *new_stack)
{
while (1)
__asm__ __volatile__(
"sp = %[stack];"
"jump (%[bfrom_syscontrol]);"
: : [bfrom_syscontrol] "p"(bfrom_SysControl),
"q0"(SYSCTRL_SOFTRESET),
"q1"(0),
"q2"(NULL),
[stack] "p"(new_stack)
);
}
/* OTP Functions */
static uint32_t (* const bfrom_OtpCommand)(uint32_t command, uint32_t value) = (void *)0xEF000018;
static uint32_t (* const bfrom_OtpRead)(uint32_t page, uint32_t flags, uint64_t *page_content) = (void *)0xEF00001A;
static uint32_t (* const bfrom_OtpWrite)(uint32_t page, uint32_t flags, uint64_t *page_content) = (void *)0xEF00001C;
/* otp command: defines for "command" */
#define OTP_INIT 0x00000001
#define OTP_CLOSE 0x00000002
/* otp read/write: defines for "flags" */
#define OTP_LOWER_HALF 0x00000000 /* select upper/lower 64-bit half (bit 0) */
#define OTP_UPPER_HALF 0x00000001
#define OTP_NO_ECC 0x00000010 /* do not use ECC */
#define OTP_LOCK 0x00000020 /* sets page protection bit for page */
#define OTP_CHECK_FOR_PREV_WRITE 0x00000080
/* Return values for all functions */
#define OTP_SUCCESS 0x00000000
#define OTP_MASTER_ERROR 0x001
#define OTP_WRITE_ERROR 0x003
#define OTP_READ_ERROR 0x005
#define OTP_ACC_VIO_ERROR 0x009
#define OTP_DATA_MULT_ERROR 0x011
#define OTP_ECC_MULT_ERROR 0x021
#define OTP_PREV_WR_ERROR 0x041
#define OTP_DATA_SB_WARN 0x100
#define OTP_ECC_SB_WARN 0x200
#endif
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
#ifndef _BLACKFIN_CACHEFLUSH_H #ifndef _BLACKFIN_CACHEFLUSH_H
#define _BLACKFIN_CACHEFLUSH_H #define _BLACKFIN_CACHEFLUSH_H
#include <asm/cplb.h>
extern void blackfin_icache_dcache_flush_range(unsigned int, unsigned int); extern void blackfin_icache_dcache_flush_range(unsigned int, unsigned int);
extern void blackfin_icache_flush_range(unsigned int, unsigned int); extern void blackfin_icache_flush_range(unsigned int, unsigned int);
extern void blackfin_dcache_flush_range(unsigned int, unsigned int); extern void blackfin_dcache_flush_range(unsigned int, unsigned int);
......
...@@ -55,7 +55,13 @@ ...@@ -55,7 +55,13 @@
#endif #endif
#define L1_DMEMORY (CPLB_LOCK | CPLB_COMMON) #define L1_DMEMORY (CPLB_LOCK | CPLB_COMMON)
#define L2_MEMORY (CPLB_COMMON) #ifdef CONFIG_BFIN_L2_CACHEABLE
#define L2_IMEMORY (SDRAM_IGENERIC)
#define L2_DMEMORY (SDRAM_DGENERIC)
#else
#define L2_IMEMORY (CPLB_COMMON)
#define L2_DMEMORY (CPLB_COMMON)
#endif
#define SDRAM_DNON_CHBL (CPLB_COMMON) #define SDRAM_DNON_CHBL (CPLB_COMMON)
#define SDRAM_EBIU (CPLB_COMMON) #define SDRAM_EBIU (CPLB_COMMON)
#define SDRAM_OOPS (CPLB_VALID | ANOMALY_05000158_WORKAROUND | CPLB_LOCK | CPLB_DIRTY) #define SDRAM_OOPS (CPLB_VALID | ANOMALY_05000158_WORKAROUND | CPLB_LOCK | CPLB_DIRTY)
......
...@@ -90,6 +90,20 @@ extern u_long dpdt_swapcount_table[]; ...@@ -90,6 +90,20 @@ extern u_long dpdt_swapcount_table[];
extern unsigned long reserved_mem_dcache_on; extern unsigned long reserved_mem_dcache_on;
extern unsigned long reserved_mem_icache_on; extern unsigned long reserved_mem_icache_on;
extern void generate_cpl_tables(void); extern void generate_cplb_tables(void);
static inline int bfin_addr_dcachable(unsigned long addr)
{
#ifdef CONFIG_BFIN_DCACHE
if (addr < (_ramend - DMA_UNCACHED_REGION))
return 1;
#endif
if (reserved_mem_dcache_on &&
addr >= _ramend && addr < physical_mem_end)
return 1;
return 0;
}
#endif #endif
#ifndef _ASM_BLACKFIN_CPUMASK_H
#define _ASM_BLACKFIN_CPUMASK_H
#include <asm-generic/cpumask.h>
#endif /* _ASM_BLACKFIN_CPUMASK_H */
...@@ -80,4 +80,15 @@ extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, ...@@ -80,4 +80,15 @@ extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg, extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
int nhwentries, enum dma_data_direction direction); int nhwentries, enum dma_data_direction direction);
static inline void dma_sync_single_for_cpu(struct device *dev,
dma_addr_t handle, size_t size,
enum dma_data_direction dir)
{
}
static inline void dma_sync_single_for_device(struct device *dev,
dma_addr_t handle, size_t size,
enum dma_data_direction dir)
{
}
#endif /* _BLACKFIN_DMA_MAPPING_H */ #endif /* _BLACKFIN_DMA_MAPPING_H */
...@@ -124,9 +124,16 @@ enum regnames { ...@@ -124,9 +124,16 @@ enum regnames {
/* Number of bytes of registers. */ /* Number of bytes of registers. */
#define NUMREGBYTES BFIN_NUM_REGS*4 #define NUMREGBYTES BFIN_NUM_REGS*4
#define BREAKPOINT() asm(" EXCPT 2;"); static inline void arch_kgdb_breakpoint(void)
#define BREAK_INSTR_SIZE 2 {
#define HW_BREAKPOINT_NUM 6 asm(" EXCPT 2;");
}
#define BREAK_INSTR_SIZE 2
#define CACHE_FLUSH_IS_SAFE 1
#define HW_INST_WATCHPOINT_NUM 6
#define HW_WATCHPOINT_NUM 8
#define TYPE_INST_WATCHPOINT 0
#define TYPE_DATA_WATCHPOINT 1
/* Instruction watchpoint address control register bits mask */ /* Instruction watchpoint address control register bits mask */
#define WPPWR 0x1 #define WPPWR 0x1
...@@ -163,10 +170,11 @@ enum regnames { ...@@ -163,10 +170,11 @@ enum regnames {
#define WPDAEN1 0x8 #define WPDAEN1 0x8
#define WPDCNTEN0 0x10 #define WPDCNTEN0 0x10
#define WPDCNTEN1 0x20 #define WPDCNTEN1 0x20
#define WPDSRC0 0xc0 #define WPDSRC0 0xc0
#define WPDACC0 0x300 #define WPDACC0_OFFSET 8
#define WPDSRC1 0xc00 #define WPDSRC1 0xc00
#define WPDACC1 0x3000 #define WPDACC1_OFFSET 12
/* Watchpoint status register bits mask */ /* Watchpoint status register bits mask */
#define STATIA0 0x1 #define STATIA0 0x1
...@@ -178,7 +186,4 @@ enum regnames { ...@@ -178,7 +186,4 @@ enum regnames {
#define STATDA0 0x40 #define STATDA0 0x40
#define STATDA1 0x80 #define STATDA1 0x80
extern void kgdb_print(const char *fmt, ...);
extern void init_kgdb_uart(void);
#endif #endif
...@@ -45,49 +45,12 @@ extern unsigned long l1_stack_len; ...@@ -45,49 +45,12 @@ extern unsigned long l1_stack_len;
extern int l1sram_free(const void*); extern int l1sram_free(const void*);
extern void *l1sram_alloc_max(void*); extern void *l1sram_alloc_max(void*);
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
{
}
/* Called when creating a new context during fork() or execve(). */
static inline int
init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
#ifdef CONFIG_MPU
unsigned long p = __get_free_pages(GFP_KERNEL, page_mask_order);
mm->context.page_rwx_mask = (unsigned long *)p;
memset(mm->context.page_rwx_mask, 0,
page_mask_nelts * 3 * sizeof(long));
#endif
return 0;
}
static inline void free_l1stack(void) static inline void free_l1stack(void)
{ {
nr_l1stack_tasks--; nr_l1stack_tasks--;
if (nr_l1stack_tasks == 0) if (nr_l1stack_tasks == 0)
l1sram_free(l1_stack_base); l1sram_free(l1_stack_base);
} }
static inline void destroy_context(struct mm_struct *mm)
{
struct sram_list_struct *tmp;
if (current_l1_stack_save == mm->context.l1_stack_save)
current_l1_stack_save = NULL;
if (mm->context.l1_stack_save)
free_l1stack();
while ((tmp = mm->context.sram_list)) {
mm->context.sram_list = tmp->next;
sram_free(tmp->addr);
kfree(tmp);
}
#ifdef CONFIG_MPU
if (current_rwx_mask == mm->context.page_rwx_mask)
current_rwx_mask = NULL;
free_pages((unsigned long)mm->context.page_rwx_mask, page_mask_order);
#endif
}
static inline unsigned long static inline unsigned long
alloc_l1stack(unsigned long length, unsigned long *stack_base) alloc_l1stack(unsigned long length, unsigned long *stack_base)
...@@ -134,6 +97,7 @@ static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_m ...@@ -134,6 +97,7 @@ static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_m
} }
#endif #endif
#ifdef CONFIG_APP_STACK_L1
/* L1 stack switching. */ /* L1 stack switching. */
if (!next_mm->context.l1_stack_save) if (!next_mm->context.l1_stack_save)
return; return;
...@@ -144,6 +108,7 @@ static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_m ...@@ -144,6 +108,7 @@ static inline void switch_mm(struct mm_struct *prev_mm, struct mm_struct *next_m
} }
current_l1_stack_save = next_mm->context.l1_stack_save; current_l1_stack_save = next_mm->context.l1_stack_save;
memcpy(l1_stack_base, current_l1_stack_save, l1_stack_len); memcpy(l1_stack_base, current_l1_stack_save, l1_stack_len);
#endif
} }
#ifdef CONFIG_MPU #ifdef CONFIG_MPU
...@@ -180,4 +145,44 @@ static inline void update_protections(struct mm_struct *mm) ...@@ -180,4 +145,44 @@ static inline void update_protections(struct mm_struct *mm)
} }
#endif #endif
static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
{
}
/* Called when creating a new context during fork() or execve(). */
static inline int
init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
#ifdef CONFIG_MPU
unsigned long p = __get_free_pages(GFP_KERNEL, page_mask_order);
mm->context.page_rwx_mask = (unsigned long *)p;
memset(mm->context.page_rwx_mask, 0,
page_mask_nelts * 3 * sizeof(long));
#endif
return 0;
}
static inline void destroy_context(struct mm_struct *mm)
{
struct sram_list_struct *tmp;
#ifdef CONFIG_APP_STACK_L1
if (current_l1_stack_save == mm->context.l1_stack_save)
current_l1_stack_save = 0;
if (mm->context.l1_stack_save)
free_l1stack();
#endif
while ((tmp = mm->context.sram_list)) {
mm->context.sram_list = tmp->next;
sram_free(tmp->addr);
kfree(tmp);
}
#ifdef CONFIG_MPU
if (current_rwx_mask == mm->context.page_rwx_mask)
current_rwx_mask = NULL;
free_pages((unsigned long)mm->context.page_rwx_mask, page_mask_order);
#endif
}
#endif #endif
...@@ -134,6 +134,12 @@ static inline uint32_t __pure bfin_revid(void) ...@@ -134,6 +134,12 @@ static inline uint32_t __pure bfin_revid(void)
return revid; return revid;
} }
static inline uint16_t __pure bfin_cpuid(void)
{
return (bfin_read_CHIPID() & CHIPID_FAMILY) >> 12;
}
static inline uint32_t __pure bfin_compiled_revid(void) static inline uint32_t __pure bfin_compiled_revid(void)
{ {
#if defined(CONFIG_BF_REV_0_0) #if defined(CONFIG_BF_REV_0_0)
......
...@@ -158,6 +158,8 @@ extern void show_regs(struct pt_regs *); ...@@ -158,6 +158,8 @@ extern void show_regs(struct pt_regs *);
#define PT_SEQSTAT 8 #define PT_SEQSTAT 8
#define PT_IPEND 4 #define PT_IPEND 4
#define PT_ORIG_R0 208
#define PT_ORIG_P0 212
#define PT_SYSCFG 216 #define PT_SYSCFG 216
#define PT_TEXT_ADDR 220 #define PT_TEXT_ADDR 220
#define PT_TEXT_END_ADDR 224 #define PT_TEXT_END_ADDR 224
......
...@@ -59,6 +59,9 @@ ...@@ -59,6 +59,9 @@
level " or a 16-bit register is accessed with a 32-bit instruction.\n" level " or a 16-bit register is accessed with a 32-bit instruction.\n"
#define HWC_x3(level) \ #define HWC_x3(level) \
"External Memory Addressing Error\n" "External Memory Addressing Error\n"
#define EXC_0x04(level) \
"Unimplmented exception occured\n" \
level " - Maybe you forgot to install a custom exception handler?\n"
#define HWC_x12(level) \ #define HWC_x12(level) \
"Performance Monitor Overflow\n" "Performance Monitor Overflow\n"
#define HWC_x18(level) \ #define HWC_x18(level) \
...@@ -84,7 +87,7 @@ ...@@ -84,7 +87,7 @@
level " a particular processor implementation.\n" level " a particular processor implementation.\n"
#define EXC_0x22(level) \ #define EXC_0x22(level) \
"Illegal instruction combination\n" \ "Illegal instruction combination\n" \
level " - See section for multi-issue rules in the ADSP-BF53x Blackfin\n" \ level " - See section for multi-issue rules in the Blackfin\n" \
level " Processor Instruction Set Reference.\n" level " Processor Instruction Set Reference.\n"
#define EXC_0x23(level) \ #define EXC_0x23(level) \
"Data access CPLB protection violation\n" \ "Data access CPLB protection violation\n" \
......
...@@ -60,6 +60,7 @@ int main(void) ...@@ -60,6 +60,7 @@ int main(void)
DEFINE(KERNEL_STACK_SIZE, THREAD_SIZE); DEFINE(KERNEL_STACK_SIZE, THREAD_SIZE);
/* offsets into the pt_regs */ /* offsets into the pt_regs */
DEFINE(PT_ORIG_R0, offsetof(struct pt_regs, orig_r0));
DEFINE(PT_ORIG_P0, offsetof(struct pt_regs, orig_p0)); DEFINE(PT_ORIG_P0, offsetof(struct pt_regs, orig_p0));
DEFINE(PT_ORIG_PC, offsetof(struct pt_regs, orig_pc)); DEFINE(PT_ORIG_PC, offsetof(struct pt_regs, orig_pc));
DEFINE(PT_R0, offsetof(struct pt_regs, r0)); DEFINE(PT_R0, offsetof(struct pt_regs, r0));
......
...@@ -231,14 +231,14 @@ inline int check_gpio(unsigned gpio) ...@@ -231,14 +231,14 @@ inline int check_gpio(unsigned gpio)
} }
#endif #endif
void gpio_error(unsigned gpio) static void gpio_error(unsigned gpio)
{ {
printk(KERN_ERR "bfin-gpio: GPIO %d wasn't requested!\n", gpio); printk(KERN_ERR "bfin-gpio: GPIO %d wasn't requested!\n", gpio);
} }
static void set_label(unsigned short ident, const char *label) static void set_label(unsigned short ident, const char *label)
{ {
if (label && str_ident) { if (label) {
strncpy(str_ident[ident].name, label, strncpy(str_ident[ident].name, label,
RESOURCE_LABEL_SIZE); RESOURCE_LABEL_SIZE);
str_ident[ident].name[RESOURCE_LABEL_SIZE - 1] = 0; str_ident[ident].name[RESOURCE_LABEL_SIZE - 1] = 0;
...@@ -247,9 +247,6 @@ static void set_label(unsigned short ident, const char *label) ...@@ -247,9 +247,6 @@ static void set_label(unsigned short ident, const char *label)
static char *get_label(unsigned short ident) static char *get_label(unsigned short ident)
{ {
if (!str_ident)
return "UNKNOWN";
return (*str_ident[ident].name ? str_ident[ident].name : "UNKNOWN"); return (*str_ident[ident].name ? str_ident[ident].name : "UNKNOWN");
} }
...@@ -260,7 +257,7 @@ static int cmp_label(unsigned short ident, const char *label) ...@@ -260,7 +257,7 @@ static int cmp_label(unsigned short ident, const char *label)
printk(KERN_ERR "Please provide none-null label\n"); printk(KERN_ERR "Please provide none-null label\n");
} }
if (label && str_ident) if (label)
return strncmp(str_ident[ident].name, return strncmp(str_ident[ident].name,
label, strlen(label)); label, strlen(label));
else else
......
...@@ -36,7 +36,7 @@ struct cplb_entry dcplb_tbl[MAX_CPLBS]; ...@@ -36,7 +36,7 @@ struct cplb_entry dcplb_tbl[MAX_CPLBS];
int first_switched_icplb, first_switched_dcplb; int first_switched_icplb, first_switched_dcplb;
int first_mask_dcplb; int first_mask_dcplb;
void __init generate_cpl_tables(void) void __init generate_cplb_tables(void)
{ {
int i_d, i_i; int i_d, i_i;
unsigned long addr; unsigned long addr;
...@@ -83,8 +83,18 @@ void __init generate_cpl_tables(void) ...@@ -83,8 +83,18 @@ void __init generate_cpl_tables(void)
dcplb_tbl[i_d].addr = L1_DATA_A_START; dcplb_tbl[i_d].addr = L1_DATA_A_START;
dcplb_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB; dcplb_tbl[i_d++].data = L1_DMEMORY | PAGE_SIZE_4MB;
#endif #endif
#if L1_CODE_LENGTH > 0
icplb_tbl[i_i].addr = L1_CODE_START; icplb_tbl[i_i].addr = L1_CODE_START;
icplb_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB; icplb_tbl[i_i++].data = L1_IMEMORY | PAGE_SIZE_4MB;
#endif
/* Cover L2 memory */
#if L2_LENGTH > 0
dcplb_tbl[i_d].addr = L2_START;
dcplb_tbl[i_d++].data = L2_DMEMORY | PAGE_SIZE_1MB;
icplb_tbl[i_i].addr = L2_START;
icplb_tbl[i_i++].data = L2_IMEMORY | PAGE_SIZE_1MB;
#endif
first_mask_dcplb = i_d; first_mask_dcplb = i_d;
first_switched_dcplb = i_d + (1 << page_mask_order); first_switched_dcplb = i_d + (1 << page_mask_order);
......
...@@ -322,9 +322,11 @@ int cplb_hdr(int seqstat, struct pt_regs *regs) ...@@ -322,9 +322,11 @@ int cplb_hdr(int seqstat, struct pt_regs *regs)
void flush_switched_cplbs(void) void flush_switched_cplbs(void)
{ {
int i; int i;
unsigned long flags;
nr_cplb_flush++; nr_cplb_flush++;
local_irq_save(flags);
disable_icplb(); disable_icplb();
for (i = first_switched_icplb; i < MAX_CPLBS; i++) { for (i = first_switched_icplb; i < MAX_CPLBS; i++) {
icplb_tbl[i].data = 0; icplb_tbl[i].data = 0;
...@@ -338,6 +340,8 @@ void flush_switched_cplbs(void) ...@@ -338,6 +340,8 @@ void flush_switched_cplbs(void)
bfin_write32(DCPLB_DATA0 + i * 4, 0); bfin_write32(DCPLB_DATA0 + i * 4, 0);
} }
enable_dcplb(); enable_dcplb();
local_irq_restore(flags);
} }
void set_mask_dcplbs(unsigned long *masks) void set_mask_dcplbs(unsigned long *masks)
...@@ -345,10 +349,15 @@ void set_mask_dcplbs(unsigned long *masks) ...@@ -345,10 +349,15 @@ void set_mask_dcplbs(unsigned long *masks)
int i; int i;
unsigned long addr = (unsigned long)masks; unsigned long addr = (unsigned long)masks;
unsigned long d_data; unsigned long d_data;
current_rwx_mask = masks; unsigned long flags;
if (!masks) if (!masks) {
current_rwx_mask = masks;
return; return;
}
local_irq_save(flags);
current_rwx_mask = masks;
d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB;
#ifdef CONFIG_BFIN_DCACHE #ifdef CONFIG_BFIN_DCACHE
...@@ -367,4 +376,5 @@ void set_mask_dcplbs(unsigned long *masks) ...@@ -367,4 +376,5 @@ void set_mask_dcplbs(unsigned long *masks)
addr += PAGE_SIZE; addr += PAGE_SIZE;
} }
enable_dcplb(); enable_dcplb();
local_irq_restore(flags);
} }
...@@ -168,8 +168,8 @@ static struct cplb_desc cplb_data[] = { ...@@ -168,8 +168,8 @@ static struct cplb_desc cplb_data[] = {
.end = L2_START + L2_LENGTH, .end = L2_START + L2_LENGTH,
.psize = SIZE_1M, .psize = SIZE_1M,
.attr = SWITCH_T | I_CPLB | D_CPLB, .attr = SWITCH_T | I_CPLB | D_CPLB,
.i_conf = L2_MEMORY, .i_conf = L2_IMEMORY,
.d_conf = L2_MEMORY, .d_conf = L2_DMEMORY,
.valid = (L2_LENGTH > 0), .valid = (L2_LENGTH > 0),
.name = "L2 Memory", .name = "L2 Memory",
}, },
...@@ -308,7 +308,7 @@ __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end) ...@@ -308,7 +308,7 @@ __fill_data_cplbtab(struct cplb_tab *t, int i, u32 a_start, u32 a_end)
} }
} }
void __init generate_cpl_tables(void) void __init generate_cplb_tables(void)
{ {
u16 i, j, process; u16 i, j, process;
......
...@@ -35,6 +35,9 @@ ...@@ -35,6 +35,9 @@
extern struct console *bfin_earlyserial_init(unsigned int port, extern struct console *bfin_earlyserial_init(unsigned int port,
unsigned int cflag); unsigned int cflag);
#endif #endif
#ifdef CONFIG_BFIN_JTAG_COMM
extern struct console *bfin_jc_early_init(void);
#endif
static struct console *early_console; static struct console *early_console;
...@@ -142,6 +145,15 @@ int __init setup_early_printk(char *buf) ...@@ -142,6 +145,15 @@ int __init setup_early_printk(char *buf)
early_console = earlyserial_init(buf); early_console = earlyserial_init(buf);
} }
#endif #endif
#ifdef CONFIG_BFIN_JTAG_COMM
/* Check for Blackfin JTAG */
if (!strncmp(buf, "jtag", 4)) {
buf += 4;
early_console = bfin_jc_early_init();
}
#endif
#ifdef CONFIG_FB #ifdef CONFIG_FB
/* TODO: add framebuffer console support */ /* TODO: add framebuffer console support */
#endif #endif
......
此差异已折叠。
...@@ -46,7 +46,6 @@ ...@@ -46,7 +46,6 @@
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/fixed_code.h> #include <asm/fixed_code.h>
#define MAX_SHARED_LIBS 3
#define TEXT_OFFSET 0 #define TEXT_OFFSET 0
/* /*
* does not yet catch signals sent when the child dies. * does not yet catch signals sent when the child dies.
...@@ -161,21 +160,32 @@ static inline int is_user_addr_valid(struct task_struct *child, ...@@ -161,21 +160,32 @@ static inline int is_user_addr_valid(struct task_struct *child,
struct vm_list_struct *vml; struct vm_list_struct *vml;
struct sram_list_struct *sraml; struct sram_list_struct *sraml;
/* overflow */
if (start + len < start)
return -EIO;
for (vml = child->mm->context.vmlist; vml; vml = vml->next) for (vml = child->mm->context.vmlist; vml; vml = vml->next)
if (start >= vml->vma->vm_start && start + len <= vml->vma->vm_end) if (start >= vml->vma->vm_start && start + len < vml->vma->vm_end)
return 0; return 0;
for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next) for (sraml = child->mm->context.sram_list; sraml; sraml = sraml->next)
if (start >= (unsigned long)sraml->addr if (start >= (unsigned long)sraml->addr
&& start + len <= (unsigned long)sraml->addr + sraml->length) && start + len < (unsigned long)sraml->addr + sraml->length)
return 0; return 0;
if (start >= FIXED_CODE_START && start + len <= FIXED_CODE_END) if (start >= FIXED_CODE_START && start + len < FIXED_CODE_END)
return 0; return 0;
return -EIO; return -EIO;
} }
void ptrace_enable(struct task_struct *child)
{
unsigned long tmp;
tmp = get_reg(child, PT_SYSCFG) | (TRACE_BITS);
put_reg(child, PT_SYSCFG, tmp);
}
/* /*
* Called by kernel/ptrace.c when detaching.. * Called by kernel/ptrace.c when detaching..
* *
...@@ -192,14 +202,12 @@ void ptrace_disable(struct task_struct *child) ...@@ -192,14 +202,12 @@ void ptrace_disable(struct task_struct *child)
long arch_ptrace(struct task_struct *child, long request, long addr, long data) long arch_ptrace(struct task_struct *child, long request, long addr, long data)
{ {
int ret; int ret;
int add = 0;
unsigned long __user *datap = (unsigned long __user *)data; unsigned long __user *datap = (unsigned long __user *)data;
switch (request) { switch (request) {
/* when I and D space are separate, these will need to be fixed. */ /* when I and D space are separate, these will need to be fixed. */
case PTRACE_PEEKDATA: case PTRACE_PEEKDATA:
pr_debug("ptrace: PEEKDATA\n"); pr_debug("ptrace: PEEKDATA\n");
add = MAX_SHARED_LIBS * 4; /* space between text and data */
/* fall through */ /* fall through */
case PTRACE_PEEKTEXT: /* read word at location addr. */ case PTRACE_PEEKTEXT: /* read word at location addr. */
{ {
...@@ -207,40 +215,35 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -207,40 +215,35 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
int copied; int copied;
ret = -EIO; ret = -EIO;
pr_debug("ptrace: PEEKTEXT at addr 0x%08lx + add %d %ld\n", addr, add, pr_debug("ptrace: PEEKTEXT at addr 0x%08lx + %ld\n", addr, sizeof(data));
sizeof(data)); if (is_user_addr_valid(child, addr, sizeof(tmp)) < 0)
if (is_user_addr_valid(child, addr + add, sizeof(tmp)) < 0)
break; break;
pr_debug("ptrace: user address is valid\n"); pr_debug("ptrace: user address is valid\n");
#if L1_CODE_LENGTH != 0 if (L1_CODE_LENGTH != 0 && addr >= L1_CODE_START
if (addr + add >= L1_CODE_START && addr + sizeof(tmp) <= L1_CODE_START + L1_CODE_LENGTH) {
&& addr + add + sizeof(tmp) <= L1_CODE_START + L1_CODE_LENGTH) { safe_dma_memcpy (&tmp, (const void *)(addr), sizeof(tmp));
safe_dma_memcpy (&tmp, (const void *)(addr + add), sizeof(tmp));
copied = sizeof(tmp); copied = sizeof(tmp);
} else
#endif } else if (L1_DATA_A_LENGTH != 0 && addr >= L1_DATA_A_START
#if L1_DATA_A_LENGTH != 0 && addr + sizeof(tmp) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
if (addr + add >= L1_DATA_A_START memcpy(&tmp, (const void *)(addr), sizeof(tmp));
&& addr + add + sizeof(tmp) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
memcpy(&tmp, (const void *)(addr + add), sizeof(tmp));
copied = sizeof(tmp); copied = sizeof(tmp);
} else
#endif } else if (L1_DATA_B_LENGTH != 0 && addr >= L1_DATA_B_START
#if L1_DATA_B_LENGTH != 0 && addr + sizeof(tmp) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
if (addr + add >= L1_DATA_B_START memcpy(&tmp, (const void *)(addr), sizeof(tmp));
&& addr + add + sizeof(tmp) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
memcpy(&tmp, (const void *)(addr + add), sizeof(tmp));
copied = sizeof(tmp); copied = sizeof(tmp);
} else
#endif } else if (addr >= FIXED_CODE_START
if (addr + add >= FIXED_CODE_START && addr + sizeof(tmp) <= FIXED_CODE_END) {
&& addr + add + sizeof(tmp) <= FIXED_CODE_END) { memcpy(&tmp, (const void *)(addr), sizeof(tmp));
memcpy(&tmp, (const void *)(addr + add), sizeof(tmp));
copied = sizeof(tmp); copied = sizeof(tmp);
} else } else
copied = access_process_vm(child, addr + add, &tmp, copied = access_process_vm(child, addr, &tmp,
sizeof(tmp), 0); sizeof(tmp), 0);
pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp); pr_debug("ptrace: copied size %d [0x%08lx]\n", copied, tmp);
if (copied != sizeof(tmp)) if (copied != sizeof(tmp))
break; break;
...@@ -284,47 +287,43 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -284,47 +287,43 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
/* when I and D space are separate, this will have to be fixed. */ /* when I and D space are separate, this will have to be fixed. */
case PTRACE_POKEDATA: case PTRACE_POKEDATA:
printk(KERN_NOTICE "ptrace: PTRACE_PEEKDATA\n"); pr_debug("ptrace: PTRACE_PEEKDATA\n");
/* fall through */ /* fall through */
case PTRACE_POKETEXT: /* write the word at location addr. */ case PTRACE_POKETEXT: /* write the word at location addr. */
{ {
int copied; int copied;
ret = -EIO; ret = -EIO;
pr_debug("ptrace: POKETEXT at addr 0x%08lx + add %d %ld bytes %lx\n", pr_debug("ptrace: POKETEXT at addr 0x%08lx + %ld bytes %lx\n",
addr, add, sizeof(data), data); addr, sizeof(data), data);
if (is_user_addr_valid(child, addr + add, sizeof(data)) < 0) if (is_user_addr_valid(child, addr, sizeof(data)) < 0)
break; break;
pr_debug("ptrace: user address is valid\n"); pr_debug("ptrace: user address is valid\n");
#if L1_CODE_LENGTH != 0 if (L1_CODE_LENGTH != 0 && addr >= L1_CODE_START
if (addr + add >= L1_CODE_START && addr + sizeof(data) <= L1_CODE_START + L1_CODE_LENGTH) {
&& addr + add + sizeof(data) <= L1_CODE_START + L1_CODE_LENGTH) { safe_dma_memcpy ((void *)(addr), &data, sizeof(data));
safe_dma_memcpy ((void *)(addr + add), &data, sizeof(data));
copied = sizeof(data); copied = sizeof(data);
} else
#endif } else if (L1_DATA_A_LENGTH != 0 && addr >= L1_DATA_A_START
#if L1_DATA_A_LENGTH != 0 && addr + sizeof(data) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
if (addr + add >= L1_DATA_A_START memcpy((void *)(addr), &data, sizeof(data));
&& addr + add + sizeof(data) <= L1_DATA_A_START + L1_DATA_A_LENGTH) {
memcpy((void *)(addr + add), &data, sizeof(data));
copied = sizeof(data); copied = sizeof(data);
} else
#endif } else if (L1_DATA_B_LENGTH != 0 && addr >= L1_DATA_B_START
#if L1_DATA_B_LENGTH != 0 && addr + sizeof(data) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
if (addr + add >= L1_DATA_B_START memcpy((void *)(addr), &data, sizeof(data));
&& addr + add + sizeof(data) <= L1_DATA_B_START + L1_DATA_B_LENGTH) {
memcpy((void *)(addr + add), &data, sizeof(data));
copied = sizeof(data); copied = sizeof(data);
} else
#endif } else if (addr >= FIXED_CODE_START
if (addr + add >= FIXED_CODE_START && addr + sizeof(data) <= FIXED_CODE_END) {
&& addr + add + sizeof(data) <= FIXED_CODE_END) { memcpy((void *)(addr), &data, sizeof(data));
memcpy((void *)(addr + add), &data, sizeof(data));
copied = sizeof(data); copied = sizeof(data);
} else } else
copied = access_process_vm(child, addr + add, &data, copied = access_process_vm(child, addr, &data,
sizeof(data), 1); sizeof(data), 1);
pr_debug("ptrace: copied size %d\n", copied); pr_debug("ptrace: copied size %d\n", copied);
if (copied != sizeof(data)) if (copied != sizeof(data))
break; break;
...@@ -351,29 +350,22 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -351,29 +350,22 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
break; break;
case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */
case PTRACE_CONT: case PTRACE_CONT: /* restart after signal. */
{ /* restart after signal. */ pr_debug("ptrace: syscall/cont\n");
long tmp;
pr_debug("ptrace_cont\n"); ret = -EIO;
if (!valid_signal(data))
ret = -EIO;
if (!valid_signal(data))
break;
if (request == PTRACE_SYSCALL)
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
else
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
child->exit_code = data;
/* make sure the single step bit is not set. */
tmp = get_reg(child, PT_SYSCFG) & ~(TRACE_BITS);
put_reg(child, PT_SYSCFG, tmp);
pr_debug("before wake_up_process\n");
wake_up_process(child);
ret = 0;
break; break;
} if (request == PTRACE_SYSCALL)
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
else
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
child->exit_code = data;
ptrace_disable(child);
pr_debug("ptrace: before wake_up_process\n");
wake_up_process(child);
ret = 0;
break;
/* /*
* make the child exit. Best I can do is send it a sigkill. * make the child exit. Best I can do is send it a sigkill.
...@@ -381,55 +373,37 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -381,55 +373,37 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
* exit. * exit.
*/ */
case PTRACE_KILL: case PTRACE_KILL:
{ ret = 0;
long tmp; if (child->exit_state == EXIT_ZOMBIE) /* already dead */
ret = 0;
if (child->exit_state == EXIT_ZOMBIE) /* already dead */
break;
child->exit_code = SIGKILL;
/* make sure the single step bit is not set. */
tmp = get_reg(child, PT_SYSCFG) & ~(TRACE_BITS);
put_reg(child, PT_SYSCFG, tmp);
wake_up_process(child);
break; break;
} child->exit_code = SIGKILL;
ptrace_disable(child);
case PTRACE_SINGLESTEP: wake_up_process(child);
{ /* set the trap flag. */ break;
long tmp;
pr_debug("single step\n");
ret = -EIO;
if (!valid_signal(data))
break;
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
tmp = get_reg(child, PT_SYSCFG) | (TRACE_BITS);
put_reg(child, PT_SYSCFG, tmp);
child->exit_code = data; case PTRACE_SINGLESTEP: /* set the trap flag. */
/* give it a chance to run. */ pr_debug("ptrace: single step\n");
wake_up_process(child); ret = -EIO;
ret = 0; if (!valid_signal(data))
break; break;
} clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
ptrace_enable(child);
child->exit_code = data;
wake_up_process(child);
ret = 0;
break;
case PTRACE_GETREGS: case PTRACE_GETREGS:
{ /* Get all gp regs from the child. */
ret = ptrace_getregs(child, datap);
/* Get all gp regs from the child. */ break;
ret = ptrace_getregs(child, datap);
break;
}
case PTRACE_SETREGS: case PTRACE_SETREGS:
{ printk(KERN_WARNING "ptrace: SETREGS: **** NOT IMPLEMENTED ***\n");
printk(KERN_NOTICE /* Set all gp regs in the child. */
"ptrace: SETREGS: **** NOT IMPLEMENTED ***\n"); ret = 0;
/* Set all gp regs in the child. */ break;
ret = 0;
break;
}
default: default:
ret = ptrace_request(child, request, addr, data); ret = ptrace_request(child, request, addr, data);
break; break;
...@@ -440,7 +414,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -440,7 +414,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
asmlinkage void syscall_trace(void) asmlinkage void syscall_trace(void)
{ {
if (!test_thread_flag(TIF_SYSCALL_TRACE)) if (!test_thread_flag(TIF_SYSCALL_TRACE))
return; return;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <asm/bfin-global.h> #include <asm/bfin-global.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/bfrom.h>
/* A system soft reset makes external memory unusable so force /* A system soft reset makes external memory unusable so force
* this function into L1. We use the compiler ssync here rather * this function into L1. We use the compiler ssync here rather
...@@ -20,7 +21,7 @@ ...@@ -20,7 +21,7 @@
* the core reset. * the core reset.
*/ */
__attribute__((l1_text)) __attribute__((l1_text))
void bfin_reset(void) static void bfin_reset(void)
{ {
/* Wait for completion of "system" events such as cache line /* Wait for completion of "system" events such as cache line
* line fills so that we avoid infinite stalls later on as * line fills so that we avoid infinite stalls later on as
...@@ -34,15 +35,15 @@ void bfin_reset(void) ...@@ -34,15 +35,15 @@ void bfin_reset(void)
bfin_write_SWRST(0x7); bfin_write_SWRST(0x7);
/* Due to the way reset is handled in the hardware, we need /* Due to the way reset is handled in the hardware, we need
* to delay for 7 SCLKS. The only reliable way to do this is * to delay for 10 SCLKS. The only reliable way to do this is
* to calculate the CCLK/SCLK ratio and multiply 7. For now, * to calculate the CCLK/SCLK ratio and multiply 10. For now,
* we'll assume worse case which is a 1:15 ratio. * we'll assume worse case which is a 1:15 ratio.
*/ */
asm( asm(
"LSETUP (1f, 1f) LC0 = %0\n" "LSETUP (1f, 1f) LC0 = %0\n"
"1: nop;" "1: nop;"
: :
: "a" (15 * 7) : "a" (15 * 10)
: "LC0", "LB0", "LT0" : "LC0", "LB0", "LT0"
); );
...@@ -74,7 +75,14 @@ void machine_restart(char *cmd) ...@@ -74,7 +75,14 @@ void machine_restart(char *cmd)
{ {
native_machine_restart(cmd); native_machine_restart(cmd);
local_irq_disable(); local_irq_disable();
bfin_reset(); if (ANOMALY_05000353 || ANOMALY_05000386)
bfin_reset();
else
/* the bootrom checks to see how it was reset and will
* automatically perform a software reset for us when
* it starts executing boot
*/
asm("raise 1;");
} }
__attribute__((weak)) __attribute__((weak))
......
...@@ -42,6 +42,7 @@ EXPORT_SYMBOL(memory_start); ...@@ -42,6 +42,7 @@ EXPORT_SYMBOL(memory_start);
EXPORT_SYMBOL(memory_end); EXPORT_SYMBOL(memory_end);
EXPORT_SYMBOL(physical_mem_end); EXPORT_SYMBOL(physical_mem_end);
EXPORT_SYMBOL(_ramend); EXPORT_SYMBOL(_ramend);
EXPORT_SYMBOL(reserved_mem_dcache_on);
#ifdef CONFIG_MTD_UCLINUX #ifdef CONFIG_MTD_UCLINUX
unsigned long memory_mtd_end, memory_mtd_start, mtd_size; unsigned long memory_mtd_end, memory_mtd_start, mtd_size;
...@@ -52,7 +53,8 @@ EXPORT_SYMBOL(mtd_size); ...@@ -52,7 +53,8 @@ EXPORT_SYMBOL(mtd_size);
#endif #endif
char __initdata command_line[COMMAND_LINE_SIZE]; char __initdata command_line[COMMAND_LINE_SIZE];
unsigned int __initdata *__retx; void __initdata *init_retx, *init_saved_retx, *init_saved_seqstat,
*init_saved_icplb_fault_addr, *init_saved_dcplb_fault_addr;
/* boot memmap, for parsing "memmap=" */ /* boot memmap, for parsing "memmap=" */
#define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */
...@@ -77,10 +79,10 @@ static struct change_member *change_point[2*BFIN_MEMMAP_MAX] __initdata; ...@@ -77,10 +79,10 @@ static struct change_member *change_point[2*BFIN_MEMMAP_MAX] __initdata;
static struct bfin_memmap_entry *overlap_list[BFIN_MEMMAP_MAX] __initdata; static struct bfin_memmap_entry *overlap_list[BFIN_MEMMAP_MAX] __initdata;
static struct bfin_memmap_entry new_map[BFIN_MEMMAP_MAX] __initdata; static struct bfin_memmap_entry new_map[BFIN_MEMMAP_MAX] __initdata;
void __init bf53x_cache_init(void) void __init bfin_cache_init(void)
{ {
#if defined(CONFIG_BFIN_DCACHE) || defined(CONFIG_BFIN_ICACHE) #if defined(CONFIG_BFIN_DCACHE) || defined(CONFIG_BFIN_ICACHE)
generate_cpl_tables(); generate_cplb_tables();
#endif #endif
#ifdef CONFIG_BFIN_ICACHE #ifdef CONFIG_BFIN_ICACHE
...@@ -100,7 +102,7 @@ void __init bf53x_cache_init(void) ...@@ -100,7 +102,7 @@ void __init bf53x_cache_init(void)
#endif #endif
} }
void __init bf53x_relocate_l1_mem(void) void __init bfin_relocate_l1_mem(void)
{ {
unsigned long l1_code_length; unsigned long l1_code_length;
unsigned long l1_data_a_length; unsigned long l1_data_a_length;
...@@ -410,7 +412,7 @@ static __init void parse_cmdline_early(char *cmdline_p) ...@@ -410,7 +412,7 @@ static __init void parse_cmdline_early(char *cmdline_p)
* [_rambase, _ramstart]: kernel image * [_rambase, _ramstart]: kernel image
* [memory_start, memory_end]: dynamic memory managed by kernel * [memory_start, memory_end]: dynamic memory managed by kernel
* [memory_end, _ramend]: reserved memory * [memory_end, _ramend]: reserved memory
* [meory_mtd_start(memory_end), * [memory_mtd_start(memory_end),
* memory_mtd_start + mtd_size]: rootfs (if any) * memory_mtd_start + mtd_size]: rootfs (if any)
* [_ramend - DMA_UNCACHED_REGION, * [_ramend - DMA_UNCACHED_REGION,
* _ramend]: uncached DMA region * _ramend]: uncached DMA region
...@@ -782,16 +784,25 @@ void __init setup_arch(char **cmdline_p) ...@@ -782,16 +784,25 @@ void __init setup_arch(char **cmdline_p)
_bfin_swrst = bfin_read_SWRST(); _bfin_swrst = bfin_read_SWRST();
/* If we double fault, reset the system - otherwise we hang forever */ #ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
bfin_write_SWRST(DOUBLE_FAULT); bfin_write_SWRST(_bfin_swrst & ~DOUBLE_FAULT);
#endif
#ifdef CONFIG_DEBUG_DOUBLEFAULT_RESET
bfin_write_SWRST(_bfin_swrst | DOUBLE_FAULT);
#endif
if (_bfin_swrst & RESET_DOUBLE) if (_bfin_swrst & RESET_DOUBLE) {
/* printk(KERN_EMERG "Recovering from DOUBLE FAULT event\n");
* don't decode the address, since you don't know if this #ifdef CONFIG_DEBUG_DOUBLEFAULT
* kernel's symbol map is the same as the crashing kernel /* We assume the crashing kernel, and the current symbol table match */
*/ printk(KERN_EMERG " While handling exception (EXCAUSE = 0x%x) at %pF\n",
printk(KERN_INFO "Recovering from Double Fault event at %pF\n", __retx); (int)init_saved_seqstat & SEQSTAT_EXCAUSE, init_saved_retx);
else if (_bfin_swrst & RESET_WDOG) printk(KERN_NOTICE " DCPLB_FAULT_ADDR: %pF\n", init_saved_dcplb_fault_addr);
printk(KERN_NOTICE " ICPLB_FAULT_ADDR: %pF\n", init_saved_icplb_fault_addr);
#endif
printk(KERN_NOTICE " The instruction at %pF caused a double exception\n",
init_retx);
} else if (_bfin_swrst & RESET_WDOG)
printk(KERN_INFO "Recovering from Watchdog event\n"); printk(KERN_INFO "Recovering from Watchdog event\n");
else if (_bfin_swrst & RESET_SOFTWARE) else if (_bfin_swrst & RESET_SOFTWARE)
printk(KERN_NOTICE "Reset caused by Software reset\n"); printk(KERN_NOTICE "Reset caused by Software reset\n");
...@@ -803,17 +814,24 @@ void __init setup_arch(char **cmdline_p) ...@@ -803,17 +814,24 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "Compiled for ADSP-%s Rev none\n", CPU); printk(KERN_INFO "Compiled for ADSP-%s Rev none\n", CPU);
else else
printk(KERN_INFO "Compiled for ADSP-%s Rev 0.%d\n", CPU, bfin_compiled_revid()); printk(KERN_INFO "Compiled for ADSP-%s Rev 0.%d\n", CPU, bfin_compiled_revid());
if (bfin_revid() != bfin_compiled_revid()) {
if (bfin_compiled_revid() == -1) if (unlikely(CPUID != bfin_cpuid()))
printk(KERN_ERR "Warning: Compiled for Rev none, but running on Rev %d\n", printk(KERN_ERR "ERROR: Not running on ADSP-%s: unknown CPUID 0x%04x Rev 0.%d\n",
bfin_revid()); CPU, bfin_cpuid(), bfin_revid());
else if (bfin_compiled_revid() != 0xffff) else {
printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n", if (bfin_revid() != bfin_compiled_revid()) {
bfin_compiled_revid(), bfin_revid()); if (bfin_compiled_revid() == -1)
printk(KERN_ERR "Warning: Compiled for Rev none, but running on Rev %d\n",
bfin_revid());
else if (bfin_compiled_revid() != 0xffff)
printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
bfin_compiled_revid(), bfin_revid());
}
if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
CPU, bfin_revid());
} }
if (bfin_revid() < SUPPORTED_REVID)
printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
CPU, bfin_revid());
printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n"); printk(KERN_INFO "Blackfin Linux support by http://blackfin.uclinux.org/\n");
printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n", printk(KERN_INFO "Processor Speed: %lu MHz core clock and %lu MHz System Clock\n",
...@@ -850,7 +868,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -850,7 +868,7 @@ void __init setup_arch(char **cmdline_p)
!= SAFE_USER_INSTRUCTION - FIXED_CODE_START); != SAFE_USER_INSTRUCTION - FIXED_CODE_START);
init_exception_vectors(); init_exception_vectors();
bf53x_cache_init(); bfin_cache_init();
} }
static int __init topology_init(void) static int __init topology_init(void)
...@@ -986,13 +1004,18 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -986,13 +1004,18 @@ static int show_cpuinfo(struct seq_file *m, void *v)
} }
seq_printf(m, "processor\t: %d\n" seq_printf(m, "processor\t: %d\n"
"vendor_id\t: %s\n" "vendor_id\t: %s\n",
"cpu family\t: 0x%x\n" *(unsigned int *)v,
"model name\t: ADSP-%s %lu(MHz CCLK) %lu(MHz SCLK) (%s)\n" vendor);
if (CPUID == bfin_cpuid())
seq_printf(m, "cpu family\t: 0x%04x\n", CPUID);
else
seq_printf(m, "cpu family\t: Compiled for:0x%04x, running on:0x%04x\n",
CPUID, bfin_cpuid());
seq_printf(m, "model name\t: ADSP-%s %lu(MHz CCLK) %lu(MHz SCLK) (%s)\n"
"stepping\t: %d\n", "stepping\t: %d\n",
0,
vendor,
(bfin_read_CHIPID() & CHIPID_FAMILY),
cpu, cclk/1000000, sclk/1000000, cpu, cclk/1000000, sclk/1000000,
#ifdef CONFIG_MPU #ifdef CONFIG_MPU
"mpu on", "mpu on",
...@@ -1038,7 +1061,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -1038,7 +1061,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
if ((bfin_read_DMEM_CONTROL() & (ENDCPLB | DMC_ENABLE)) != (ENDCPLB | DMC_ENABLE)) if ((bfin_read_DMEM_CONTROL() & (ENDCPLB | DMC_ENABLE)) != (ENDCPLB | DMC_ENABLE))
dcache_size = 0; dcache_size = 0;
if ((bfin_read_IMEM_CONTROL() & (IMC | ENICPLB)) == (IMC | ENICPLB)) if ((bfin_read_IMEM_CONTROL() & (IMC | ENICPLB)) != (IMC | ENICPLB))
icache_size = 0; icache_size = 0;
seq_printf(m, "cache size\t: %d KB(L1 icache) " seq_printf(m, "cache size\t: %d KB(L1 icache) "
...@@ -1127,12 +1150,18 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -1127,12 +1150,18 @@ static int show_cpuinfo(struct seq_file *m, void *v)
static void *c_start(struct seq_file *m, loff_t *pos) static void *c_start(struct seq_file *m, loff_t *pos)
{ {
return *pos < NR_CPUS ? ((void *)0x12345678) : NULL; if (*pos == 0)
*pos = first_cpu(cpu_online_map);
if (*pos >= num_online_cpus())
return NULL;
return pos;
} }
static void *c_next(struct seq_file *m, void *v, loff_t *pos) static void *c_next(struct seq_file *m, void *v, loff_t *pos)
{ {
++*pos; *pos = next_cpu(*pos, cpu_online_map);
return c_start(m, pos); return c_start(m, pos);
} }
......
此差异已折叠。
...@@ -14,4 +14,9 @@ config BFIN527_BLUETECHNIX_CM ...@@ -14,4 +14,9 @@ config BFIN527_BLUETECHNIX_CM
help help
CM-BF527 support for EVAL- and DEV-Board. CM-BF527 support for EVAL- and DEV-Board.
config BFIN526_EZBRD
bool "BF526-EZBRD"
help
BF526-EZBRD/EZKIT Lite board support.
endchoice endchoice
...@@ -4,3 +4,4 @@ ...@@ -4,3 +4,4 @@
obj-$(CONFIG_BFIN527_EZKIT) += ezkit.o obj-$(CONFIG_BFIN527_EZKIT) += ezkit.o
obj-$(CONFIG_BFIN527_BLUETECHNIX_CM) += cm_bf527.o obj-$(CONFIG_BFIN527_BLUETECHNIX_CM) += cm_bf527.o
obj-$(CONFIG_BFIN526_EZBRD) += ezbrd.o
...@@ -43,10 +43,7 @@ ...@@ -43,10 +43,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/usb/sl811.h> #include <linux/usb/sl811.h>
#if defined(CONFIG_USB_MUSB_HDRC) || defined(CONFIG_USB_MUSB_HDRC_MODULE)
#include <linux/usb/musb.h> #include <linux/usb/musb.h>
#endif
#include <asm/cplb.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/bfin5xx_spi.h> #include <asm/bfin5xx_spi.h>
#include <asm/reboot.h> #include <asm/reboot.h>
...@@ -130,6 +127,16 @@ static struct resource musb_resources[] = { ...@@ -130,6 +127,16 @@ static struct resource musb_resources[] = {
}, },
}; };
static struct musb_hdrc_config musb_config = {
.multipoint = 0,
.dyn_fifo = 0,
.soft_con = 1,
.dma = 1,
.num_eps = 7,
.dma_channels = 7,
.gpio_vrsel = GPIO_PF11,
};
static struct musb_hdrc_platform_data musb_plat = { static struct musb_hdrc_platform_data musb_plat = {
#if defined(CONFIG_USB_MUSB_OTG) #if defined(CONFIG_USB_MUSB_OTG)
.mode = MUSB_OTG, .mode = MUSB_OTG,
...@@ -138,7 +145,7 @@ static struct musb_hdrc_platform_data musb_plat = { ...@@ -138,7 +145,7 @@ static struct musb_hdrc_platform_data musb_plat = {
#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) #elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
.mode = MUSB_PERIPHERAL, .mode = MUSB_PERIPHERAL,
#endif #endif
.multipoint = 0, .config = &musb_config,
}; };
static u64 musb_dmamask = ~(u32)0; static u64 musb_dmamask = ~(u32)0;
...@@ -201,7 +208,7 @@ static struct mtd_partition partition_info[] = { ...@@ -201,7 +208,7 @@ static struct mtd_partition partition_info[] = {
{ {
.name = "linux kernel(nand)", .name = "linux kernel(nand)",
.offset = 0, .offset = 0,
.size = 4 * SIZE_1M, .size = 4 * 1024 * 1024,
}, },
{ {
.name = "file system(nand)", .name = "file system(nand)",
......
此差异已折叠。
...@@ -42,10 +42,7 @@ ...@@ -42,10 +42,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/usb/sl811.h> #include <linux/usb/sl811.h>
#if defined(CONFIG_USB_MUSB_HDRC) || defined(CONFIG_USB_MUSB_HDRC_MODULE)
#include <linux/usb/musb.h> #include <linux/usb/musb.h>
#endif
#include <asm/cplb.h>
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/bfin5xx_spi.h> #include <asm/bfin5xx_spi.h>
#include <asm/reboot.h> #include <asm/reboot.h>
...@@ -129,6 +126,16 @@ static struct resource musb_resources[] = { ...@@ -129,6 +126,16 @@ static struct resource musb_resources[] = {
}, },
}; };
static struct musb_hdrc_config musb_config = {
.multipoint = 0,
.dyn_fifo = 0,
.soft_con = 1,
.dma = 1,
.num_eps = 7,
.dma_channels = 7,
.gpio_vrsel = GPIO_PG13,
};
static struct musb_hdrc_platform_data musb_plat = { static struct musb_hdrc_platform_data musb_plat = {
#if defined(CONFIG_USB_MUSB_OTG) #if defined(CONFIG_USB_MUSB_OTG)
.mode = MUSB_OTG, .mode = MUSB_OTG,
...@@ -137,7 +144,7 @@ static struct musb_hdrc_platform_data musb_plat = { ...@@ -137,7 +144,7 @@ static struct musb_hdrc_platform_data musb_plat = {
#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) #elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
.mode = MUSB_PERIPHERAL, .mode = MUSB_PERIPHERAL,
#endif #endif
.multipoint = 0, .config = &musb_config,
}; };
static u64 musb_dmamask = ~(u32)0; static u64 musb_dmamask = ~(u32)0;
...@@ -218,7 +225,7 @@ static struct mtd_partition partition_info[] = { ...@@ -218,7 +225,7 @@ static struct mtd_partition partition_info[] = {
{ {
.name = "linux kernel(nand)", .name = "linux kernel(nand)",
.offset = 0, .offset = 0,
.size = 4 * SIZE_1M, .size = 4 * 1024 * 1024,
}, },
{ {
.name = "file system(nand)", .name = "file system(nand)",
...@@ -846,6 +853,38 @@ static struct platform_device bfin_device_gpiokeys = { ...@@ -846,6 +853,38 @@ static struct platform_device bfin_device_gpiokeys = {
}; };
#endif #endif
#if defined(CONFIG_JOYSTICK_BFIN_ROTARY) || defined(CONFIG_JOYSTICK_BFIN_ROTARY_MODULE)
#include <linux/input.h>
#include <asm/bfin_rotary.h>
static struct bfin_rotary_platform_data bfin_rotary_data = {
/*.rotary_up_key = KEY_UP,*/
/*.rotary_down_key = KEY_DOWN,*/
.rotary_rel_code = REL_WHEEL,
.rotary_button_key = KEY_ENTER,
.debounce = 10, /* 0..17 */
.mode = ROT_QUAD_ENC | ROT_DEBE,
};
static struct resource bfin_rotary_resources[] = {
{
.start = IRQ_CNT,
.end = IRQ_CNT,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device bfin_rotary_device = {
.name = "bfin-rotary",
.id = -1,
.num_resources = ARRAY_SIZE(bfin_rotary_resources),
.resource = bfin_rotary_resources,
.dev = {
.platform_data = &bfin_rotary_data,
},
};
#endif
static struct resource bfin_gpios_resources = { static struct resource bfin_gpios_resources = {
.start = 0, .start = 0,
.end = MAX_BLACKFIN_GPIOS - 1, .end = MAX_BLACKFIN_GPIOS - 1,
...@@ -962,6 +1001,10 @@ static struct platform_device *stamp_devices[] __initdata = { ...@@ -962,6 +1001,10 @@ static struct platform_device *stamp_devices[] __initdata = {
&bfin_device_gpiokeys, &bfin_device_gpiokeys,
#endif #endif
#if defined(CONFIG_JOYSTICK_BFIN_ROTARY) || defined(CONFIG_JOYSTICK_BFIN_ROTARY_MODULE)
&bfin_rotary_device,
#endif
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
&ezkit_flash_device, &ezkit_flash_device,
#endif #endif
......
...@@ -87,6 +87,9 @@ ENTRY(_start_dma_code) ...@@ -87,6 +87,9 @@ ENTRY(_start_dma_code)
r1 = PLL_BYPASS; /* Bypass the PLL? */ r1 = PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */ r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */ r0 = r1 | r0; /* add them all together */
#ifdef ANOMALY_05000265
r0 = BITSET(r0, 15); /* Add 250 mV of hysteresis to SPORT input pins */
#endif
p0.h = hi(PLL_CTL); p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */ p0.l = lo(PLL_CTL); /* Load the address */
......
...@@ -7,12 +7,24 @@ ...@@ -7,12 +7,24 @@
*/ */
/* This file shoule be up to date with: /* This file shoule be up to date with:
* - Revision C, 01/25/2008; ADSP-BF527 Blackfin Processor Anomaly List * - Revision B, 08/12/2008; ADSP-BF526 Blackfin Processor Anomaly List
* - Revision E, 08/18/2008; ADSP-BF527 Blackfin Processor Anomaly List
*/ */
#ifndef _MACH_ANOMALY_H_ #ifndef _MACH_ANOMALY_H_
#define _MACH_ANOMALY_H_ #define _MACH_ANOMALY_H_
#if defined(__ADSPBF522__) || defined(__ADSPBF524__) || defined(__ADSPBF526__)
# define ANOMALY_BF526 1
#else
# define ANOMALY_BF526 0
#endif
#if defined(__ADSPBF523__) || defined(__ADSPBF525__) || defined(__ADSPBF527__)
# define ANOMALY_BF527 1
#else
# define ANOMALY_BF527 0
#endif
/* Multi-Issue Instruction with dsp32shiftimm in slot1 and P-reg Store in slot2 Not Supported */ /* Multi-Issue Instruction with dsp32shiftimm in slot1 and P-reg Store in slot2 Not Supported */
#define ANOMALY_05000074 (1) #define ANOMALY_05000074 (1)
/* DMA_RUN Bit Is Not Valid after a Peripheral Receive Channel DMA Stops */ /* DMA_RUN Bit Is Not Valid after a Peripheral Receive Channel DMA Stops */
...@@ -23,68 +35,124 @@ ...@@ -23,68 +35,124 @@
#define ANOMALY_05000245 (1) #define ANOMALY_05000245 (1)
/* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */ /* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */
#define ANOMALY_05000265 (1) #define ANOMALY_05000265 (1)
/* New Feature: EMAC TX DMA Word Alignment */ /* False Hardware Errors Caused by Fetches at the Boundary of Reserved Memory */
#define ANOMALY_05000285 (1) #define ANOMALY_05000310 (1)
/* Errors when SSYNC, CSYNC, or Loads to LT, LB and LC Registers Are Interrupted */ /* Errors when SSYNC, CSYNC, or Loads to LT, LB and LC Registers Are Interrupted */
#define ANOMALY_05000312 (1) #define ANOMALY_05000312 (ANOMALY_BF527)
/* PPI Is Level-Sensitive on First Transfer In Single Frame Sync Modes */
#define ANOMALY_05000313 (__SILICON_REVISION__ < 2)
/* Incorrect Access of OTP_STATUS During otp_write() Function */ /* Incorrect Access of OTP_STATUS During otp_write() Function */
#define ANOMALY_05000328 (1) #define ANOMALY_05000328 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Disallowed Configuration Prevents Subsequent Allowed Configuration on Host DMA Port */ /* Disallowed Configuration Prevents Subsequent Allowed Configuration on Host DMA Port */
#define ANOMALY_05000337 (1) #define ANOMALY_05000337 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Ethernet MAC MDIO Reads Do Not Meet IEEE Specification */ /* Ethernet MAC MDIO Reads Do Not Meet IEEE Specification */
#define ANOMALY_05000341 (1) #define ANOMALY_05000341 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* TWI May Not Operate Correctly Under Certain Signal Termination Conditions */ /* TWI May Not Operate Correctly Under Certain Signal Termination Conditions */
#define ANOMALY_05000342 (1) #define ANOMALY_05000342 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* USB Calibration Value Is Not Initialized */ /* USB Calibration Value Is Not Initialized */
#define ANOMALY_05000346 (1) #define ANOMALY_05000346 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* USB Calibration Value to use */
#define ANOMALY_05000346_value 0xE510
/* Preboot Routine Incorrectly Alters Reset Value of USB Register */ /* Preboot Routine Incorrectly Alters Reset Value of USB Register */
#define ANOMALY_05000347 (1) #define ANOMALY_05000347 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Security Features Are Not Functional */ /* Security Features Are Not Functional */
#define ANOMALY_05000348 (__SILICON_REVISION__ < 1) #define ANOMALY_05000348 (ANOMALY_BF527 && __SILICON_REVISION__ < 1)
/* bfrom_SysControl() Firmware Function Performs Improper System Reset */
#define ANOMALY_05000353 (ANOMALY_BF526)
/* Regulator Programming Blocked when Hibernate Wakeup Source Remains Active */ /* Regulator Programming Blocked when Hibernate Wakeup Source Remains Active */
#define ANOMALY_05000355 (1) #define ANOMALY_05000355 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Serial Port (SPORT) Multichannel Transmit Failure when Channel 0 Is Disabled */ /* Serial Port (SPORT) Multichannel Transmit Failure when Channel 0 Is Disabled */
#define ANOMALY_05000357 (1) #define ANOMALY_05000357 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Incorrect Revision Number in DSPID Register */ /* Incorrect Revision Number in DSPID Register */
#define ANOMALY_05000364 (__SILICON_REVISION__ > 0) #define ANOMALY_05000364 (ANOMALY_BF527 && __SILICON_REVISION__ == 1)
/* PPI Underflow Error Goes Undetected in ITU-R 656 Mode */ /* PPI Underflow Error Goes Undetected in ITU-R 656 Mode */
#define ANOMALY_05000366 (1) #define ANOMALY_05000366 (1)
/* New Feature: Higher Default CCLK Rate */ /* Incorrect Default CSEL Value in PLL_DIV */
#define ANOMALY_05000368 (1) #define ANOMALY_05000368 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */ /* Possible RETS Register Corruption when Subroutine Is under 5 Cycles in Duration */
#define ANOMALY_05000371 (1) #define ANOMALY_05000371 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Authentication Fails To Initiate */ /* Authentication Fails To Initiate */
#define ANOMALY_05000376 (__SILICON_REVISION__ > 0) #define ANOMALY_05000376 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Data Read From L3 Memory by USB DMA May be Corrupted */ /* Data Read From L3 Memory by USB DMA May be Corrupted */
#define ANOMALY_05000380 (1) #define ANOMALY_05000380 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* USB Full-speed Mode not Fully Tested */ /* 8-Bit NAND Flash Boot Mode Not Functional */
#define ANOMALY_05000381 (1) #define ANOMALY_05000382 (__SILICON_REVISION__ < 2)
/* New Feature: Boot from OTP Memory */ /* Host Must Not Read Back During Host DMA Boot */
#define ANOMALY_05000385 (1) #define ANOMALY_05000384 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: bfrom_SysControl() Routine */ /* Boot from OTP Memory Not Functional */
#define ANOMALY_05000386 (1) #define ANOMALY_05000385 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: Programmable Preboot Settings */ /* bfrom_SysControl() Firmware Routine Not Functional */
#define ANOMALY_05000387 (1) #define ANOMALY_05000386 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Programmable Preboot Settings Not Functional */
#define ANOMALY_05000387 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* CRC32 Checksum Support Not Functional */
#define ANOMALY_05000388 (__SILICON_REVISION__ < 2)
/* Reset Vector Must Not Be in SDRAM Memory Space */ /* Reset Vector Must Not Be in SDRAM Memory Space */
#define ANOMALY_05000389 (1) #define ANOMALY_05000389 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: pTempCurrent Added to ADI_BOOT_DATA Structure */ /* pTempCurrent Not Present in ADI_BOOT_DATA Structure */
#define ANOMALY_05000392 (1) #define ANOMALY_05000392 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: dTempByteCount Value Increased in ADI_BOOT_DATA Structure */ /* Deprecated Value of dTempByteCount in ADI_BOOT_DATA Structure */
#define ANOMALY_05000393 (1) #define ANOMALY_05000393 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: Log Buffer Functionality */ /* Log Buffer Not Functional */
#define ANOMALY_05000394 (1) #define ANOMALY_05000394 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: Hook Routine Functionality */ /* Hook Routine Not Functional */
#define ANOMALY_05000395 (1) #define ANOMALY_05000395 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: Header Indirect Bit */ /* Header Indirect Bit Not Functional */
#define ANOMALY_05000396 (1) #define ANOMALY_05000396 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: BK_ONES, BK_ZEROS, and BK_DATECODE Constants */ /* BK_ONES, BK_ZEROS, and BK_DATECODE Constants Not Functional */
#define ANOMALY_05000397 (1) #define ANOMALY_05000397 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: SWRESET, DFRESET and WDRESET Bits Added to SYSCR Register */ /* SWRESET, DFRESET and WDRESET Bits in the SYSCR Register Not Functional */
#define ANOMALY_05000398 (1) #define ANOMALY_05000398 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* New Feature: BCODE_NOBOOT Added to BCODE Field of SYSCR Register */ /* BCODE_NOBOOT in BCODE Field of SYSCR Register Not Functional */
#define ANOMALY_05000399 (1) #define ANOMALY_05000399 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* PPI Data Signals D0 and D8 do not Tristate After Disabling PPI */ /* PPI Data Signals D0 and D8 do not Tristate After Disabling PPI */
#define ANOMALY_05000401 (1) #define ANOMALY_05000401 (__SILICON_REVISION__ < 2)
/* Level-Sensitive External GPIO Wakeups May Cause Indefinite Stall */
#define ANOMALY_05000403 (__SILICON_REVISION__ < 2)
/* Lockbox SESR Disallows Certain User Interrupts */
#define ANOMALY_05000404 (__SILICON_REVISION__ < 2)
/* Lockbox SESR Firmware Does Not Save/Restore Full Context */
#define ANOMALY_05000405 (1)
/* Lockbox SESR Firmware Arguments Are Not Retained After First Initialization */
#define ANOMALY_05000407 (__SILICON_REVISION__ < 2)
/* Lockbox Firmware Memory Cleanup Routine Does not Clear Registers */
#define ANOMALY_05000408 (1)
/* Lockbox firmware leaves MDMA0 channel enabled */
#define ANOMALY_05000409 (__SILICON_REVISION__ < 2)
/* Incorrect Default Internal Voltage Regulator Setting */
#define ANOMALY_05000410 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* bfrom_SysControl() Firmware Function Cannot be Used to Enter Power Saving Modes */
#define ANOMALY_05000411 (__SILICON_REVISION__ < 2)
/* OTP_CHECK_FOR_PREV_WRITE Bit is Not Functional in bfrom_OtpWrite() API */
#define ANOMALY_05000414 (__SILICON_REVISION__ < 2)
/* DEB2_URGENT Bit Not Functional */
#define ANOMALY_05000415 (__SILICON_REVISION__ < 2)
/* Speculative Fetches Can Cause Undesired External FIFO Operations */
#define ANOMALY_05000416 (1)
/* SPORT0 Ignores External TSCLK0 on PG14 When TMR6 is an Output */
#define ANOMALY_05000417 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* tSFSPE and tHFSPE Do Not Meet Data Sheet Specifications */
#define ANOMALY_05000418 (__SILICON_REVISION__ < 2)
/* USB PLL_STABLE Bit May Not Accurately Reflect the USB PLL's Status */
#define ANOMALY_05000420 (__SILICON_REVISION__ < 2)
/* TWI Fall Time (Tof) May Violate the Minimum I2C Specification */
#define ANOMALY_05000421 (1)
/* TWI Input Capacitance (Ci) May Violate the Maximum I2C Specification */
#define ANOMALY_05000422 (ANOMALY_BF527 && __SILICON_REVISION__ > 1)
/* Certain Ethernet Frames With Errors are Misclassified in RMII Mode */
#define ANOMALY_05000423 (__SILICON_REVISION__ < 2)
/* Internal Voltage Regulator Not Trimmed */
#define ANOMALY_05000424 (ANOMALY_BF527 && __SILICON_REVISION__ < 2)
/* Multichannel SPORT Channel Misalignment Under Specific Configuration */
#define ANOMALY_05000425 (__SILICON_REVISION__ < 2)
/* Speculative Fetches of Indirect-Pointer Instructions Can Cause Spurious Hardware Errors */
#define ANOMALY_05000426 (1)
/* WB_EDGE Bit in NFC_IRQSTAT Incorrectly Reflects Buffer Status Instead of IRQ Status */
#define ANOMALY_05000429 (__SILICON_REVISION__ < 2)
/* Software System Reset Corrupts PLL_LOCKCNT Register */
#define ANOMALY_05000430 (ANOMALY_BF527 && __SILICON_REVISION__ > 1)
/* bfrom_SysControl() Does Not Clear SIC_IWR1 Before Executing PLL Programming Sequence */
#define ANOMALY_05000432 (ANOMALY_BF526)
/* Anomalies that don't exist on this proc */ /* Anomalies that don't exist on this proc */
#define ANOMALY_05000125 (0) #define ANOMALY_05000125 (0)
...@@ -97,6 +165,8 @@ ...@@ -97,6 +165,8 @@
#define ANOMALY_05000263 (0) #define ANOMALY_05000263 (0)
#define ANOMALY_05000266 (0) #define ANOMALY_05000266 (0)
#define ANOMALY_05000273 (0) #define ANOMALY_05000273 (0)
#define ANOMALY_05000285 (0)
#define ANOMALY_05000307 (0)
#define ANOMALY_05000311 (0) #define ANOMALY_05000311 (0)
#define ANOMALY_05000323 (0) #define ANOMALY_05000323 (0)
#define ANOMALY_05000363 (0) #define ANOMALY_05000363 (0)
......
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
#ifndef __MACH_BF527_H__ #ifndef __MACH_BF527_H__
#define __MACH_BF527_H__ #define __MACH_BF527_H__
#define SUPPORTED_REVID 2
#define OFFSET_(x) ((x) & 0x0000FFFF) #define OFFSET_(x) ((x) & 0x0000FFFF)
/*some misc defines*/ /*some misc defines*/
...@@ -112,16 +110,31 @@ ...@@ -112,16 +110,31 @@
#ifdef CONFIG_BF527 #ifdef CONFIG_BF527
#define CPU "BF527" #define CPU "BF527"
#define CPUID 0x27e4
#endif
#ifdef CONFIG_BF526
#define CPU "BF526"
#define CPUID 0x27e4
#endif #endif
#ifdef CONFIG_BF525 #ifdef CONFIG_BF525
#define CPU "BF525" #define CPU "BF525"
#define CPUID 0x27e4
#endif
#ifdef CONFIG_BF524
#define CPU "BF524"
#define CPUID 0x27e4
#endif
#ifdef CONFIG_BF523
#define CPU "BF523"
#define CPUID 0x27e4
#endif #endif
#ifdef CONFIG_BF522 #ifdef CONFIG_BF522
#define CPU "BF522" #define CPU "BF522"
#define CPUID 0x27e4
#endif #endif
#ifndef CPU #ifndef CPU
#define CPU "UNKNOWN" #error Unknown CPU type - This kernel doesn't seem to be configured properly
#define CPUID 0x0
#endif #endif
#endif /* __MACH_BF527_H__ */ #endif /* __MACH_BF527_H__ */
...@@ -1840,6 +1840,33 @@ ...@@ -1840,6 +1840,33 @@
#define DPRESCALE 0xf /* Load Counter Register */ #define DPRESCALE 0xf /* Load Counter Register */
/* CNT_COMMAND bit field options */
#define W1LCNT_ZERO 0x0001 /* write 1 to load CNT_COUNTER with zero */
#define W1LCNT_MIN 0x0004 /* write 1 to load CNT_COUNTER from CNT_MIN */
#define W1LCNT_MAX 0x0008 /* write 1 to load CNT_COUNTER from CNT_MAX */
#define W1LMIN_ZERO 0x0010 /* write 1 to load CNT_MIN with zero */
#define W1LMIN_CNT 0x0020 /* write 1 to load CNT_MIN from CNT_COUNTER */
#define W1LMIN_MAX 0x0080 /* write 1 to load CNT_MIN from CNT_MAX */
#define W1LMAX_ZERO 0x0100 /* write 1 to load CNT_MAX with zero */
#define W1LMAX_CNT 0x0200 /* write 1 to load CNT_MAX from CNT_COUNTER */
#define W1LMAX_MIN 0x0400 /* write 1 to load CNT_MAX from CNT_MIN */
/* CNT_CONFIG bit field options */
#define CNTMODE_QUADENC 0x0000 /* quadrature encoder mode */
#define CNTMODE_BINENC 0x0100 /* binary encoder mode */
#define CNTMODE_UDCNT 0x0200 /* up/down counter mode */
#define CNTMODE_DIRCNT 0x0400 /* direction counter mode */
#define CNTMODE_DIRTMR 0x0500 /* direction timer mode */
#define BNDMODE_COMP 0x0000 /* boundary compare mode */
#define BNDMODE_ZERO 0x1000 /* boundary compare and zero mode */
#define BNDMODE_CAPT 0x2000 /* boundary capture mode */
#define BNDMODE_AEXT 0x3000 /* boundary auto-extend mode */
/* Bit masks for OTP_CONTROL */ /* Bit masks for OTP_CONTROL */
#define FUSE_FADDR 0x1ff /* OTP/Fuse Address */ #define FUSE_FADDR 0x1ff /* OTP/Fuse Address */
......
...@@ -67,6 +67,10 @@ ...@@ -67,6 +67,10 @@
#define P_UART1_RX (P_DEFINED | P_IDENT(GPIO_PG13) | P_FUNCT(1)) #define P_UART1_RX (P_DEFINED | P_IDENT(GPIO_PG13) | P_FUNCT(1))
#endif #endif
#define P_CNT_CZM (P_DEFINED | P_IDENT(GPIO_PF11) | P_FUNCT(3))
#define P_CNT_CDG (P_DEFINED | P_IDENT(GPIO_PF12) | P_FUNCT(3))
#define P_CNT_CUD (P_DEFINED | P_IDENT(GPIO_PF13) | P_FUNCT(3))
#define P_HWAIT (P_DONTCARE) #define P_HWAIT (P_DONTCARE)
#define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0)) #define P_SPI0_SS (P_DEFINED | P_IDENT(GPIO_PG1) | P_FUNCT(0))
......
...@@ -78,6 +78,9 @@ ENTRY(_start_dma_code) ...@@ -78,6 +78,9 @@ ENTRY(_start_dma_code)
r1 = PLL_BYPASS; /* Bypass the PLL? */ r1 = PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */ r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */ r0 = r1 | r0; /* add them all together */
#ifdef ANOMALY_05000265
r0 = BITSET(r0, 15); /* Add 250 mV of hysteresis to SPORT input pins */
#endif
p0.h = hi(PLL_CTL); p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */ p0.l = lo(PLL_CTL); /* Load the address */
......
...@@ -85,7 +85,7 @@ struct bfin_serial_port { ...@@ -85,7 +85,7 @@ struct bfin_serial_port {
unsigned int rx_dma_channel; unsigned int rx_dma_channel;
struct work_struct tx_dma_workqueue; struct work_struct tx_dma_workqueue;
#else #else
# if ANOMALY_05000230 # if ANOMALY_05000363
unsigned int anomaly_threshold; unsigned int anomaly_threshold;
# endif # endif
#endif #endif
......
...@@ -87,6 +87,9 @@ ENTRY(_start_dma_code) ...@@ -87,6 +87,9 @@ ENTRY(_start_dma_code)
r1 = PLL_BYPASS; /* Bypass the PLL? */ r1 = PLL_BYPASS; /* Bypass the PLL? */
r1 = r1 << 8; /* Shift it over */ r1 = r1 << 8; /* Shift it over */
r0 = r1 | r0; /* add them all together */ r0 = r1 | r0; /* add them all together */
#ifdef ANOMALY_05000265
r0 = BITSET(r0, 15); /* Add 250 mV of hysteresis to SPORT input pins */
#endif
p0.h = hi(PLL_CTL); p0.h = hi(PLL_CTL);
p0.l = lo(PLL_CTL); /* Load the address */ p0.l = lo(PLL_CTL); /* Load the address */
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
# arch/blackfin/mm/Makefile # arch/blackfin/mm/Makefile
# #
obj-y := blackfin_sram.o init.o obj-y := sram-alloc.o isram-driver.o init.o
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册