From 4bf3f3cbb6add01d3e6a18c73f594b73113b14f2 Mon Sep 17 00:00:00 2001 From: Robin Getz Date: Thu, 21 Jun 2007 11:34:16 +0800 Subject: Blackfin arch: update ANOMALY handling update lists for 533, 537, and add SSYNC workaround into assembly files. Signed-off-by: Robin Getz Signed-off-by: Bryan Wu --- include/asm-blackfin/blackfin.h | 33 ++++++++- include/asm-blackfin/mach-bf533/anomaly.h | 84 ++++++++++++++++++++-- include/asm-blackfin/mach-bf537/anomaly.h | 21 +++++- include/asm-blackfin/mach-common/cdef_LPBlackfin.h | 27 +++++++ 4 files changed, 156 insertions(+), 9 deletions(-) (limited to 'include/asm-blackfin') diff --git a/include/asm-blackfin/blackfin.h b/include/asm-blackfin/blackfin.h index db3b615ffba..25b934b7f82 100644 --- a/include/asm-blackfin/blackfin.h +++ b/include/asm-blackfin/blackfin.h @@ -39,7 +39,9 @@ static inline void SSYNC (void) #elif !defined(ANOMALY_05000312) && defined(ANOMALY_05000244) static inline void SSYNC (void) { - __builtin_bfin_ssync(); + __asm__ __volatile__ ("nop; nop; nop;\n\t" + "ssync;\n\t" + ::); } #elif !defined(ANOMALY_05000312) && !defined(ANOMALY_05000244) static inline void SSYNC (void) @@ -71,7 +73,9 @@ static inline void CSYNC (void) #elif !defined(ANOMALY_05000312) && defined(ANOMALY_05000244) static inline void CSYNC (void) { - __builtin_bfin_csync(); + __asm__ __volatile__ ("nop; nop; nop;\n\t" + "ssync;\n\t" + ::); } #elif !defined(ANOMALY_05000312) && !defined(ANOMALY_05000244) static inline void CSYNC (void) @@ -80,6 +84,31 @@ static inline void CSYNC (void) } #endif +#else /* __ASSEMBLY__ */ + +/* SSYNC & CSYNC implementations for assembly files */ + +#define ssync(x) SSYNC(x) +#define csync(x) CSYNC(x) + +#if defined(ANOMALY_05000312) && defined(ANOMALY_05000244) +#define SSYNC(scratch) cli scratch; nop; nop; SSYNC; sti scratch; +#define CSYNC(scratch) cli scratch; nop; nop; CSYNC; sti scratch; + +#elif defined(ANOMALY_05000312) && !defined(ANOMALY_05000244) +#define SSYNC(scratch) cli scratch; nop; nop; SSYNC; sti scratch; +#define CSYNC(scratch) cli scratch; nop; nop; CSYNC; sti scratch; + +#elif !defined(ANOMALY_05000312) && defined(ANOMALY_05000244) +#define SSYNC(scratch) nop; nop; nop; SSYNC; +#define CSYNC(scratch) nop; nop; nop; CSYNC; + +#elif !defined(ANOMALY_05000312) && !defined(ANOMALY_05000244) +#define SSYNC(scratch) SSYNC; +#define CSYNC(scratch) CSYNC; + +#endif /* ANOMALY_05000312 & ANOMALY_05000244 handling */ + #endif /* __ASSEMBLY__ */ #endif /* _BLACKFIN_H_ */ diff --git a/include/asm-blackfin/mach-bf533/anomaly.h b/include/asm-blackfin/mach-bf533/anomaly.h index a84d3909345..7302f290b93 100644 --- a/include/asm-blackfin/mach-bf533/anomaly.h +++ b/include/asm-blackfin/mach-bf533/anomaly.h @@ -43,7 +43,8 @@ #endif /* Issues that are common to 0.5, 0.4, and 0.3 silicon */ -#if (defined(CONFIG_BF_REV_0_5) || defined(CONFIG_BF_REV_0_4) || defined(CONFIG_BF_REV_0_3)) +#if (defined(CONFIG_BF_REV_0_5) || defined(CONFIG_BF_REV_0_4) \ + || defined(CONFIG_BF_REV_0_3)) #define ANOMALY_05000074 /* A multi issue instruction with dsp32shiftimm in slot1 and store of a P register in slot 2 is not supported */ @@ -76,11 +77,16 @@ control */ #define ANOMALY_05000283 /* A system MMR write is stalled indefinitely when killed in a particular stage*/ +#define ANOMALY_05000311 /* Erroneous flag pin operations under specific + sequences */ #define ANOMALY_05000312 /* Errors when SSYNC, CSYNC, or loads to LT, LB and LC registers are interrupted */ -#define ANOMALY_05000311 /* Erroneous flag pin operations under specific sequences*/ - -#endif +#define ANOMALY_05000313 /* PPI Is Level-Sensitive on First Transfer */ +#define ANOMALY_05000315 /* Killed System MMR Write Completes Erroneously On + * Next System MMR Access */ +#define ANOMALY_05000319 /* Internal Voltage Regulator Values of 1.05V, 1.10V + * and 1.15V Not Allowed for LQFP Packages */ +#endif /* Issues that are common to 0.5, 0.4, and 0.3 silicon */ /* These issues only occur on 0.3 or 0.4 BF533 */ #if (defined(CONFIG_BF_REV_0_4) || defined(CONFIG_BF_REV_0_3)) @@ -134,14 +140,14 @@ internal voltage regulator (VDDint) to increase. */ #define ANOMALY_05000270 /* High I/O activity causes the output voltage of the internal voltage regulator (VDDint) to decrease */ -#endif +#endif /* issues only occur on 0.3 or 0.4 BF533 */ /* These issues are only on 0.4 silicon */ #if (defined(CONFIG_BF_REV_0_4)) #define ANOMALY_05000234 /* Incorrect Revision Number in DSPID Register */ #define ANOMALY_05000250 /* Incorrect Bit-Shift of Data Word in Multichannel (TDM) */ -#endif +#endif /* issues are only on 0.4 silicon */ /* These issues are only on 0.3 silicon */ #if defined(CONFIG_BF_REV_0_3) @@ -170,6 +176,72 @@ #define ANOMALY_05000233 /* PPI_FS3 is not driven in 2 or 3 internal Frame Sync Transmit Mode */ #define ANOMALY_05000271 /* Spontaneous reset of Internal Voltage Regulator */ +#endif /* only on 0.3 silicon */ + +#if defined(CONFIG_BF_REV_0_2) +#define ANOMALY_05000067 /* Watchpoints (Hardware Breakpoints) are not + * supported */ +#define ANOMALY_05000109 /* Reserved bits in SYSCFG register not set at + * power on */ +#define ANOMALY_05000116 /* Trace Buffers may record discontinuities into + * emulation mode and/or exception, NMI, reset + * handlers */ +#define ANOMALY_05000123 /* DTEST_COMMAND initiated memory access may be + * incorrect if data cache or DMA is active */ +#define ANOMALY_05000124 /* DMA Lock-up at CCLK to SCLK ratios of 4:1, 2:1, + * or 1:1 */ +#define ANOMALY_05000125 /* Erroneous exception when enabling cache */ +#define ANOMALY_05000126 /* SPI clock polarity and phase bits incorrect + * during booting */ +#define ANOMALY_05000137 /* DMEM_CONTROL is not set on Reset */ +#define ANOMALY_05000138 /* SPI boot will not complete if there is a zero fill + * block in the loader file */ +#define ANOMALY_05000140 /* Allowing the SPORT RX FIFO to fill will cause an + * overflow */ +#define ANOMALY_05000141 /* An Infinite Stall occurs with a particular sequence + * of consecutive dual dag events */ +#define ANOMALY_05000142 /* Interrupts may be lost when a programmable input + * flag is configured to be edge sensitive */ +#define ANOMALY_05000143 /* A read from external memory may return a wrong + * value with data cache enabled */ +#define ANOMALY_05000144 /* DMA and TESTSET conflict when both are accessing + * external memory */ +#define ANOMALY_05000145 /* In PWM_OUT mode, you must enable the PPI block to + * generate a waveform from PPI_CLK */ +#define ANOMALY_05000146 /* MDMA may lose the first few words of a descriptor + * chain */ +#define ANOMALY_05000147 /* The source MDMA descriptor may stop with a DMA + * Error */ +#define ANOMALY_05000148 /* When booting from a 16-bit asynchronous memory + * device, the upper 8-bits of each word must be + * 0x00 */ +#define ANOMALY_05000153 /* Frame Delay in SPORT Multichannel Mode */ +#define ANOMALY_05000154 /* SPORT TFS signal is active in Multi-channel mode + * outside of valid channels */ +#define ANOMALY_05000155 /* Timer1 can not be used for PWMOUT mode when a + * certain PPI mode is in use */ +#define ANOMALY_05000157 /* A killed 32-bit System MMR write will lead to + * the next system MMR access thinking it should be + * 32-bit. */ +#define ANOMALY_05000163 /* SPORT transmit data is not gated by external frame + * sync in certain conditions */ +#define ANOMALY_05000168 /* SDRAM auto-refresh and subsequent Power Ups */ +#define ANOMALY_05000169 /* DATA CPLB page miss can result in lost + * write-through cache data writes */ +#define ANOMALY_05000173 /* DMA vs Core accesses to external memory */ +#define ANOMALY_05000174 /* Cache Fill Buffer Data lost */ +#define ANOMALY_05000175 /* Overlapping Sequencer and Memory Stalls */ +#define ANOMALY_05000176 /* Multiplication of (-1) by (-1) followed by an + * accumulator saturation */ +#define ANOMALY_05000181 /* Disabling the PPI resets the PPI configuration + * registers */ +#define ANOMALY_05000185 /* PPI TX Mode with 2 External Frame Syncs */ +#define ANOMALY_05000191 /* PPI does not invert the Driving PPICLK edge in + * Transmit Modes */ +#define ANOMALY_05000192 /* In PPI Transmit Modes with External Frame Syncs + * POLC */ +#define ANOMALY_05000206 /* Internal Voltage Regulator may not start up */ + #endif #endif /* _MACH_ANOMALY_H_ */ diff --git a/include/asm-blackfin/mach-bf537/anomaly.h b/include/asm-blackfin/mach-bf537/anomaly.h index 7f040f5ba01..4453e614c3b 100644 --- a/include/asm-blackfin/mach-bf537/anomaly.h +++ b/include/asm-blackfin/mach-bf537/anomaly.h @@ -73,8 +73,13 @@ control */ #define ANOMALY_05000283 /* A system MMR write is stalled indefinitely when killed in a particular stage*/ +#define ANOMALY_05000310 /* False hardware errors caused by fetches at the + * boundary of reserved memory */ #define ANOMALY_05000312 /* Errors when SSYNC, CSYNC, or loads to LT, LB and LC registers are interrupted */ +#define ANOMALY_05000313 /* PPI is level sensitive on first transfer */ +#define ANOMALY_05000322 /* EMAC RMII mode at 10-Base-T speed: RX frames not + * received properly */ #endif #if defined(CONFIG_BF_REV_0_2) @@ -114,7 +119,21 @@ DMA system instability */ #define ANOMALY_05000280 /* SPI Master boot mode does not work well with Atmel Dataflash devices */ - +#define ANOMALY_05000281 /* False Hardware Error Exception when ISR context + * is not restored */ +#define ANOMALY_05000282 /* Memory DMA corruption with 32-bit data and traffic + * control */ +#define ANOMALY_05000283 /* System MMR Write Is Stalled Indefinitely When + * Killed in a Particular Stage */ +#define ANOMALY_05000285 /* New Feature: EMAC TX DMA Word Alignment + * (Not Available On Older Silicon) */ +#define ANOMALY_05000288 /* SPORTs may receive bad data if FIFOs fill up */ +#define ANOMALY_05000315 /* Killed System MMR Write Completes Erroneously + * On Next System MMR Access */ +#define ANOMALY_05000316 /* EMAC RMII mode: collisions occur in Full Duplex + * mode */ +#define ANOMALY_05000321 /* EMAC RMII mode: TX frames in half duplex fail with + * status No Carrier */ #endif /* CONFIG_BF_REV_0_2 */ #endif /* _MACH_ANOMALY_H_ */ diff --git a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h index d39c396f850..58f878947cb 100644 --- a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h +++ b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h @@ -39,7 +39,20 @@ #define bfin_read_SRAM_BASE_ADDRESS() bfin_read32(SRAM_BASE_ADDRESS) #define bfin_write_SRAM_BASE_ADDRESS(val) bfin_write32(SRAM_BASE_ADDRESS,val) #define bfin_read_DMEM_CONTROL() bfin_read32(DMEM_CONTROL) +#ifdef ANOMALY_05000125 +static __inline__ void bfin_write_DMEM_CONTROL(unsigned int val) +{ + unsigned long flags, iwr; + + local_irq_save(flags); + __asm__(".align 8\n"); + bfin_write32(IMEM_CONTROL, val); + __builtin_bfin_ssync(); + local_irq_restore(flags); +} +#else #define bfin_write_DMEM_CONTROL(val) bfin_write32(DMEM_CONTROL,val) +#endif #define bfin_read_DCPLB_STATUS() bfin_read32(DCPLB_STATUS) #define bfin_write_DCPLB_STATUS(val) bfin_write32(DCPLB_STATUS,val) #define bfin_read_DCPLB_FAULT_ADDR() bfin_read32(DCPLB_FAULT_ADDR) @@ -125,7 +138,21 @@ #define DTEST_DATA3 0xFFE0040C */ #define bfin_read_IMEM_CONTROL() bfin_read32(IMEM_CONTROL) +#ifdef ANOMALY_05000125 +static __inline__ void bfin_write_IMEM_CONTROL(unsigned int val) +{ + unsigned long flags, iwr; + + local_irq_save(flags); + __asm__(".align 8\n"); + bfin_write32(IMEM_CONTROL, val); + __builtin_bfin_ssync(); + local_irq_restore(flags); + +} +#else #define bfin_write_IMEM_CONTROL(val) bfin_write32(IMEM_CONTROL,val) +#endif #define bfin_read_ICPLB_STATUS() bfin_read32(ICPLB_STATUS) #define bfin_write_ICPLB_STATUS(val) bfin_write32(ICPLB_STATUS,val) #define bfin_read_ICPLB_FAULT_ADDR() bfin_read32(ICPLB_FAULT_ADDR) -- cgit v1.2.3-70-g09d2