Blackfin Embedded Processor a Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 ABOUT ADSP-BF700/701/702/703/704/705/706/707 SILICON ANOMALIES These anomalies represent the currently known differences between revisions of the Blackfin®ADSP-BF700/701/702/703/704/705/706/707 product(s) and the functionality specified in the ADSP-BF700/701/702/703/704/705/706/707 data sheet(s) and the Hardware Reference book(s). SILICON REVISIONS A silicon revision number with the form "-x.x" is branded on all parts. The REVID bits <31:28> of the TAPC0_IDCODE register can be used to differentiate the revisions as shown below. Silicon REVISION TAPC0_IDCODE.REVID 1.0 0x1 0.0 0x0 ANOMALY LIST REVISION HISTORY The following revision history lists the anomaly list revisions and major changes for each anomaly list revision. Date Anomaly List Revision Data Sheet Revision Additions and Changes 02/29/2016 E A Added Anomalies: 19000055, 19000056, 19000057 05/17/2015 D PrD Added Silicon Revision 1.0 Added Anomalies: 19000051, 19000053, 19000054 Revised Anomalies: 19000047 11/20/2014 C PrD Added Anomalies: 19000039, 19000040, 19000041, 19000042, 19000043, 19000044, 19000045, 19000046, 19000047, 19000048, 19000049 Removed Anomaly: 19000015 07/03/2014 B PrC Added Anomalies: 19000013, 19000021, 19000022, 19000023, 19000024, 19000025, 19000026, 19000027, 19000028, 19000029, 19000031, 19000032, 19000034, 19000035, 19000036, 19000038 Revised Anomalies: 19000009, 19000012 04/03/2014 A PrB Initial Version Blackfin and the Blackfin logo are registered trademarks of Analog Devices, Inc. NR004345E Document Feedback Information furnished by Analog Devices is believed to be accurate and reliable. However, no responsibility is assumed by Analog Devices for its use, nor for any infringements of patents or other rights of third parties that may result from its use. Specifications subject to change without notice. No license is granted by implication or otherwise under any patent or patent rights of Analog Devices. Trademarks and registered trademarks are the property of their respective owners. One Technology Way, P.O.Box 9106, Norwood, MA 02062-9106 U.S.A. Tel: 781.329.4700 ©2016 Analog Devices, Inc. All rights reserved. Technical Support www.analog.com ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List SUMMARY OF SILICON ANOMALIES The following table provides a summary of ADSP-BF700/701/702/703/704/705/706/707 anomalies and the applicable silicon revision(s) for each anomaly. No. ID Description Rev 0.0 Rev 1.0 1 19000002 2 19000003 Disabling Posted MMR Writes While Writes Are Outstanding May Cause Unpredictable Results x x Invalid Opcode Does Not Cause Exception x x 3 4 19000004 SEQSTAT Parity Bits Can't be Cleared x x 19000005 Parity Error Status Registers May Capture the Incorrect Error Address x x 5 19000007 Reads of SPU_SECCHK by Non-secure Masters Result in an Erroneous Violation Interrupt x x 6 19000008 GPIO Slave Trigger Cannot Be Used on the Same Port as GPIO Outputs x . 7 19000009 CRC Look-Up Table Generation Doesn't Work as Expected x . 8 19000010 STI Directly Before CLI Does Not Enable Interrupts x x 9 19000011 The WRDO Bit in WDOG_CTL is Erroneously Cleared Under Certain Conditions x . 10 19000012 MSI 4-bit Read Operation Does Not Work as Expected x . 11 19000013 SPIHP Erroneously Drives SPI_MISO While Receiving Commands x . 12 19000016 PKTE Hash Result Corruption in the Case of Data Output Buffer Full x . 13 19000017 Reading Certain PKTE Registers May Return Incorrect Data During Packet Processing x x 14 19000018 L1 Parity Checking Detects Spurious Parity Errors x . 15 19000019 Misaligned Accesses to L2 or L3 Memory Return Incorrect Data x . 16 19000020 L1 Cache and Parity Error Detection Are Disabled During Boot x . 17 19000021 CGU0_STAT.LWERR Bit Gets Erroneously Set Under Certain Conditions x . 18 19000022 Fill Blocks Not Functional During Secure Boot x . 19 19000023 adi_rom_sysControl Forces DMC_PADRESTORE Flag To True x . 20 19000024 Boot Mode Disable Feature is Not Functional x . 21 19000025 RCU_BCODE Cannot be Restored Upon Returning From Hibernate Mode x . 22 19000026 Secure SPI Master Boot Only Supported From Memory-Mapped SPI Devices on SPI2 x x 23 19000027 RCU_MSG Register Incorrectly Reports HALTONINIT Emulation Exception x . 24 19000028 The adi_rom_Boot API Only Allows Booting From SPI Flash Address 0x0 x . 25 19000029 Error Address in the Boot Config Struct is Incorrect x . 26 19000031 CGU and DMC Settings Cannot be Restored From the DPM Upon Wake from Hibernate x . 27 19000032 Transactions to Certain SPU and SMPU MMR Regions Cause Erroneous Errors x x 28 19000034 The JUMPCCEN Enable Bit in the BP_CFG Register Defaults to b#0 Instead of b#1 x x 29 19000035 SYS_RESOUT Fails to Drive Low During Hardware Reset and Hibernate x . 30 19000036 System Reset Causes Emulator to Lose Connectivity x . 31 19000038 Writes to the SPI_SLVSEL Register Do Not Take Effect x x 32 19000039 Alternate SPT0_A Locations Not Functional on PA_12, PA_13, and PA_14 x . 33 19000040 Deep Power Down Mode Exit for LPDDR Does Not Work as Expected x x 34 19000041 CYCLES Registers Do Not Count While Core is in IDLE x . 35 19000042 Self-Nested Interrupts Disable Further Interrupts x . 36 19000043 GP Timer Generates First Interrupt/Trigger One Edge Late in EXTCLK Mode x x 37 19000044 Dynamic Branch Prediction for RTS Instructions May Cause Data Loss x . 38 19000045 TESTSET Instruction May Cause Core Hang x x 39 19000046 The JTG_TRST Signal Erroneously Uses an Internal Pull-up Resistor x . 40 19000047 Dynamic Branch Prediction for Self-Modifying Code is Not Functional x x 41 19000048 User Mode Allows Access to MMRs and Protected Memory x . NR004345E | Page 2 of 25 | February 2016 Silicon Anomaly List No. ID Description 42 19000049 43 44 ADSP-BF700/701/702/703/704/705/706/707 Rev 0.0 Rev 1.0 Processor May Fail to Wake From Hibernate When the USB Cable is Disconnected x . 19000051 DLL in the DMC PHY May Not Lock to the New DCLK Frequency x x 19000053 ROM Code Erroneously Jumps to DMC Space During Wake From Hibernate . x 45 19000054 Dynamic Branch Prediction During Self-Nested ISRs Causes Unpredictable Results x x 46 19000055 Core Writes to CAN MMRs May Not Occur x x 47 19000056 High-Speed DMA Feature Not Implemented x . 48 19000057 Locked Processors Cannot be Unlocked by Emulator if Other Devices are Present in the JTAG Scan Chain x x Key: x = anomaly exists in revision . = Not applicable NR004345E | Page 3 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List DETAILED LIST OF SILICON ANOMALIES The following list details all known silicon anomalies for the ADSP-BF700/701/702/703/704/705/706/707 including a description, workaround, and identification of applicable silicon revisions. 1. 19000002 - Disabling Posted MMR Writes While Writes Are Outstanding May Cause Unpredictable Results: DESCRIPTION: Disabling posted MMR writes using the SYSCFG.MPWEN bit while MMR writes are outstanding may cause unpredictable results. WORKAROUND: Always place an SSYNC after setting SYSCFG.MPWEN = b#0. APPLIES TO REVISION(S): 0.0, 1.0 2. 19000003 - Invalid Opcode Does Not Cause Exception: DESCRIPTION: The opcode 0xEC81D373 is invalid and should cause an exception if executed, but it does not. WORKAROUND: None APPLIES TO REVISION(S): 0.0, 1.0 3. 19000004 - SEQSTAT Parity Bits Can't be Cleared: DESCRIPTION: The parity bits in SEQSTAT can't be cleared. WORKAROUND: Use the BYTELOC bits in L1IM_IPERR_STAT and L1DM_DPERR_STAT to clear parity errors. The SEQSTAT parity bits will not update to show that the parity erorr(s) have been cleared unless a core or system reset is applied. APPLIES TO REVISION(S): 0.0, 1.0 4. 19000005 - Parity Error Status Registers May Capture the Incorrect Error Address: DESCRIPTION: In the rare case of two consecutive parity errors the L1IM_IPERR_STAT or L1DM_DPERR_STAT registers may capture the second error address location instead of the first. For this condition to occur both of the following events must occur: 1. Two consecutive DAG0 reads have parity errors 2. The return of the first read data is delayed by the core WORKAROUND: None APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 4 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 5. 19000007 - Reads of SPU_SECCHK by Non-secure Masters Result in an Erroneous Violation Interrupt: DESCRIPTION: Reads of SPU_SECCHK by non-secure masters result in an erroneous SPU violation interrupt. The erroneous interrupt will only be observed if the SPU violation interrupt is enabled. WORKAROUND: There are two possible workarounds: 1. Don't use SPU_SECCHK. 2. Ignore the erroneous SPU interrupt after SPU_SECCHK is read. APPLIES TO REVISION(S): 0.0, 1.0 6. 19000008 - GPIO Slave Trigger Cannot Be Used on the Same Port as GPIO Outputs: DESCRIPTION: If a GPIO trigger slave asserts at the same time as a register write to change the output state of a signal on the same port, neither transaction will complete. For instance, if PA_10 and PA_13 are set to toggle after a Port A slave trigger, any register writes to PORTA_DATA, PORTA_DATA_SET, PORTA_DATA_CLR, or PORTA_DATA_TGL occurring at the same time as a Port A slave trigger will not successfully complete. WORKAROUND: Don't use trigger toggle functionality on a port where writes to PORT_DATA, PORT_DATA_SET, PORT_DATA_CLR, or PORT_DATA_TGL will occur. APPLIES TO REVISION(S): 0.0 NR004345E | Page 5 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 7. 19000009 - CRC Look-Up Table Generation Doesn't Work as Expected: DESCRIPTION: The CRC Look-Up Table (LUT) generation by writing to the CRC_POLY register works as expected only once after system reset. The boot code uses the CRC to initialize memory, so any subsequent writes to the CRC_POLY register after the LUT is generated may lead to unexpected CRC results. WORKAROUND: To work around this issue, the following steps should be followed while writing the CRC_POLY register with the polynomial value: 1. Write the polynomial value into the CRC_POLY register. 2. Wait for the look up table to get generated automatically by polling the CRC_STAT_LUTDONE bit. 3. Enable access to the CRC_LUT registers by first writing the internal register (address: 0x20005010) with the values 0x1E7B1C96 and 0xDFF0C3B2 one by one respectively and then setting bit 31 of the CRC_CTL register. 4. Calculate the CRC_LUT table values in software and write these values into the CRC_LUT registers (as shown in the code below). 5. Disable access to the CRC_LUT registers by first clearing bit 31 of the CRC_CTL register and then writing the internal register(address:0x20005010) with the values 0x1E7B1C96 and 0xDFF0C3B2 one by one respectively. The following C code can be used for a workaround : #include <cdefBF707.h> //Initialize the CRC_POLYNOMIAL to be used here #define CRC_POLYNOMIAL 0x82608EDB //1. Write the polynomial value into the CRC_POLY register *pREG_CRC0_POLY = CRC_POLYNOMIAL; //2. Wait for the look up table to get generated automatically by polling the //CRC_STAT_LUTDONE bit while((*pREG_CRC0_STAT&BITM_CRC_STAT_LUTDONE==0)); //Internal register definition to be used only for this workaround #define pINT_REG (volatile int*)0x20005010 //Uncomment this line when using the workaround for CRC0 #define USE_CRC0 //Uncomment this line when using the workaround for CRC1 //#define USE_CRC1 //Internal definition to be used only for this workaround (start address of the //CRC_LUT registers) #ifdef USE_CRC0 #define CRC_LUT_OFFSET 0x200B0080 #endif #ifdef USE_CRC1 #define CRC_LUT_OFFSET 0x200B1080 #endif uint32_t lutdat = 0x80000000; uint32_t gx = CRC_POLYNOMIAL; uint32_t lut[32]; uint32_t* pointer; //3. Enable access to the CRC_LUT registers by first writing the internal //register (address: 0x20005010) with the values 0x1E7B1C96 and 0xDFF0C3B2 one //by one respectively and then setting bit 31 of the CRC_CTL register *pINT_REG = 0x1E7B1C96; *pINT_REG = 0xDFF0C3B2; *pREG_CRC0_CTL|=0x80000000; //4. Calculate the CRC LUT table contents in software NR004345E | Page 6 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 for (i=0; i<32; i++) { lutdat=((lutdat&0x80000000)==0x80000000)?((lutdat<<1) ^ gx) : lutdat << 1; lut[i] = lutdat; } //4. Write the LUT registers for(i=1;i<32;i++) { pointer = CRC_LUT_OFFSET+i*4; *pointer=lut[i]; } //5. Disable access to the CRC_LUT registers by first clearing bit 31 of the //CRC_CTL register and then writing the internal register (address: 0x20005010) //with the values 0x1E7B1C96 and 0xDFF0C3B2 one by one respectively *pREG_CRC0_CTL&=~0x80000000; *pINT_REG = 0x1E7B1C96; *pINT_REG = 0xDFF0C3B2; The only time this workaround does not need to be run is if the boot code memory initialization has been disabled and it is the first time the CRC_POLY register is being written. APPLIES TO REVISION(S): 0.0 8. 19000010 - STI Directly Before CLI Does Not Enable Interrupts: DESCRIPTION: If a CLI instruction follows an STI instruction immediately like the following example, interrupts will not be enabled. Even pending interrupts will not be taken: STI; CLI; WORKAROUND: Make sure there are two or more instructions between STI and CLI. NOP instructions can be used. APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 7 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 9. 19000011 - The WRDO Bit in WDOG_CTL is Erroneously Cleared Under Certain Conditions: DESCRIPTION: For this anomaly to occur, the following sequence must happen: 1. The watchdog must be enabled and then subsequently expire, causing the WRDO bit in WDOG_CTL to be set. 2. Disable the watchdog using WDOG_CTL. 3. Re-enable the watchdog WDOG_CTL without clearing WRDO In this case the WRDO bit will be erroneously cleared and the watchdog will begin to count down from 0xFFFFFFFF. WORKAROUND: The write that disables the watchdog after expiry should always be followed by a write that clears WRDO and keeps WDOG disabled to avoid the watchdog counting from 0xFFFFFFFF. Pseudo code: WDOG0_CTL=0x0AD0; // disable Watchdog timer WDOG0_CTL=0x8AD0; // Clear the WRDO bit with watchdog disabled // Re-enable the watchdog timer here APPLIES TO REVISION(S): 0.0 10. 19000012 - MSI 4-bit Read Operation Does Not Work as Expected: DESCRIPTION: In case of a data read operation in 4-bit mode with MSI configured for 4-bit bus width, the controller samples the data well before the actual start bit is driven by the card. As a result, the controller samples the initial data as 0xFF until the card starts driving out actual data on the bus. The number of 0xFFs sampled depends on the card used and MSI bus frequency. The problem occurs only when the PORTC_MUX/FER registers are configured for four MSI Data lines (MSI_D0 - MSI_D3). This can happen for SD/SDIO as well as eMMC/MMC cards. WORKAROUND: For ADSP-BF700/702/704/706 the following configuration will set up an internal loopback that will prevent the issue, though PC10 cannot subsequently be used for any other purpose: 1. Configure PC10, PC11, PC12, and PC13 as GPIO in PORTC_FER. 2. Set PC10, PC11, PC12, and PC13 as outputs in PORTC_DIR_SET. 3. Set PC10, PC11, PC12, and PC13 to output b#1 by setting the appropriate bits in PORTC_DATA. 4. Program PORTC_PC10, PC11, PC12, and PC13 as inputs by setting the appropriate bits in PORTC_INEN. For ADSP-BF701/703/705/707 the following options are available: 1. Use 8-bit MSI mode. 2. Use the same workaround shown for ADSP-BF700/BF702/BF704/BF706. If this workaround is implemented, PC10, PC11, PC12, and PC13 cannot be used for any other purpose. APPLIES TO REVISION(S): 0.0 NR004345E | Page 8 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 11. 19000013 - SPIHP Erroneously Drives SPI_MISO While Receiving Commands: DESCRIPTION: The SPIHP erroneously drives the SPI_MISO signal of the selected SPI peripheral (SPI0, SPI1, or SPI2) during the receipt of commands or addresses from the SPI master device. The SPI_MISO signal should be in the high impedance state while the SPIHP is receiving commands or addresses. WORKAROUND: The SPI master must ignore the SPI_MISO input during the command and address phase of transactions. If SPI_MISO cannot be ignored or another slave is transmitting on the master's SPI_MISO input during the command/address phase, external logic such as a multiplexer can be used to gate the transmission from the BF70x. APPLIES TO REVISION(S): 0.0 12. 19000016 - PKTE Hash Result Corruption in the Case of Data Output Buffer Full: DESCRIPTION: When processing a packet where a hash result is appended after packet data ("Copy Digest" option specified, PKTE_SA_CMD1.CPYGST=1), the last hash result word may become corrupted when the 256-byte Data Output Buffer starting at PKTE_DATAIO_BUF is full at the time that the last hash result word is added to the Data Output Buffer. For situations where data is written into the Data Output Buffer at a faster rate than it can be written out, this problem may be more apparent. WORKAROUND: Do not allow the output buffer to become full. This can be accomplished by setting the Output Buffer Threshold value in the PKTE_BUF_THRESH.OUTBUF register well below the maximum value. This will allow data to start moving out of the Data Output Buffer before it fills. This is sufficient for preventing the issue for regular hash/encrypt operations, including protocol operations, provided that the data is not delayed in going through the SCBs to its destination. For cases where large amounts of data are forwarded directly from the Input Data Buffer to the Output Data Buffer, (e.g. when doing a hash operation where also the "Copy Payload" option specified), the workaround specified may be ineffective because the Packet Engine forwards this data immediately and it prioritizes fetching inputs over writing outputs. In this situation the Packet Engine may still have unforwarded input data available that is passed to the Output Data Buffer before the Packet Engine is able to write out the contents of the Output Data Buffer. This unforwarded data may have filled up the Output Data Buffer in such a way that the hash result cannot be stored completely in the Output Data Buffer, which then results in an incorrect hash result value. APPLIES TO REVISION(S): 0.0 13. 19000017 - Reading Certain PKTE Registers May Return Incorrect Data During Packet Processing: DESCRIPTION: Reading out the PKTE_BUF_THRESH, PKTE_INBUF_CNT, or PKTE_OUTBUF_CNT register within one SCLK1 cycle of the Packet Engine starting to process a packet results in an incorrect value being read. This situation can happen when working in Direct Host Mode and starting to poll for the amount of data that can be transferred (input or output) shortly after starting packet processing by writing to the PKTE_SA_RDY register. For Autonomous Ring Mode there is no need to read the affected registers because the data will be automatically transferred out to specified host memory buffers. WORKAROUND: In all modes the anomaly can by avoided by not reading any of the affected registers after starting packet processing using the PKTE_SA_RDY register. Additionally, since Direct Host Mode is a manual sequential operation, the Data Output Buffer can be emptied before configuring and starting a new job to process another packet. It can then be assumed that the Data Input Buffer is empty when starting with a new packet. By skipping the first poll this anomaly can be avoided. Also, the maximum amount of data to transfer can be assumed to be equal to the Input Data Buffer size of 256 bytes so there is no need to check the threshold register to gauge this. For the output side it suffices not to start polling for the availability of data before input data has been transferred. APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 9 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 14. 19000018 - L1 Parity Checking Detects Spurious Parity Errors: DESCRIPTION: L1 data and instruction memory may detect spurious parity errors when DMA or other non-core writes are performed to L1 memory. WORKAROUND: Before writing to L1 memory using DMA all L1 locations must be read using extended access mode as shown in this code example: #define LOADIMM32REG(R,VAL) R = VAL; // Enable the extended data access functionality from the L1 space LOADIMM32REG(p4, REG_L1DM_DCTL) LOADIMM32REG(r0, 0x00010000) [p4] = r0; ssync; // Pointer to base of L1 space and the increment to reach the next subbank LOADIMM32REG(p0, 0x11A00000) LOADIMM32REG(p1, 0x1000 - 4) p2 = 16; lsetup (_l1_im_init.a, _l1_im_init.b) lc0 = p2; _l1_im_init.a: r0 = [p0++]; // read from sub-bank column 0 _l1_im_init.b: r1 = [p0 ++ p1]; // read from sub-bank column 1 LOADIMM32REG(p0, 0x11800000) LOADIMM32REG(p1, 0x1000 - 4) p2 = 8; lsetup (_l1_dm_a_init.a, _l1_dm_a_init.b) lc0 = p2; _l1_dm_a_init.a: r0 = [p0++]; // read from sub-bank column 0 _l1_dm_a_init.b: r1 = [p0 ++ p1 ]; // read from sub-bank column 1 LOADIMM32REG(p0, 0x11900000) LOADIMM32REG(p1, 0x1000 - 4) p2 = 8; lsetup (_l1_dm_b_init.a, _l1_dm_b_init.b) lc0 = p2; _l1_dm_b_init.a: r0 = [p0++]; // read from sub-bank column 0 _l1_dm_b_init.b: r1 = [p0 ++ p1 ]; // read from sub-bank column 1 LOADIMM32REG(p0, 0x11B00000) r0 = [p0++]; // read from sub-bank column 0 r0 = [p0++]; // Disable extended data access functionality r0 = 0; [p4] = r0; ssync; This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 NR004345E | Page 10 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 15. 19000019 - Misaligned Accesses to L2 or L3 Memory Return Incorrect Data: DESCRIPTION: Misaligned accesses (accesses not on a 32-bit boundary) to L2 or L3 memory will return incorrect data. WORKAROUND: Avoid misaligned accesses to L2 and L3 memory. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 16. 19000020 - L1 Cache and Parity Error Detection Are Disabled During Boot: DESCRIPTION: Cache and parity error detection are disabled during boot since the cache disable bit (cacheDis) in OTP memory is pre-programmed. Consequently, the boot code execution will take longer to complete and parity errors that occur during boot will not be detected. WORKAROUND: If cache or parity is desired in the application, ensure that it is enabled after boot. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 17. 19000021 - CGU0_STAT.LWERR Bit Gets Erroneously Set Under Certain Conditions: DESCRIPTION: The LWERR bit in the CGU0_STAT register will become erroneously set under the following conditions: 1. SPU_CTL.GLCK is enabled. 2. Any register within the CGU that can be locked has its lock bit set. 3. A write is made to a system MMR of another peripheral that shares that the same 12 LSBs as the locked CGU register. Although CGU0_STAT.LWERR becomes erroneously set under these conditions, a bus error does not occur as a result. A bus error only occurs under the conditions specified in the ADSP-BF70x Blackfin+ Processor Hardware Reference. WORKAROUND: There are two possible workarounds: 1. Change any one of the 3 conditions listed in the description. 2. When tracing the source of a bus error, check CGU0_STAT.LWERR after all of other possible sources of the error have been checked. This will prevent incorrect attribution of bus errors to the CGU. APPLIES TO REVISION(S): 0.0 NR004345E | Page 11 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 18. 19000022 - Fill Blocks Not Functional During Secure Boot: DESCRIPTION: The use of fill blocks in the boot stream when secure boot is enabled may cause either a boot error or data to be copied to the incorrect memory space. Non-secure boot is not affected. WORKAROUND: Ensure that the loader stream does not use fill blocks utilizing secure boot. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 19. 19000023 - adi_rom_sysControl Forces DMC_PADRESTORE Flag To True: DESCRIPTION: When utilizing the adi_rom_sysControl API, and having the actionFlags set to read from the DMC (BITM_ROM_SYSCTRL_DMC_READ) or to write to the DPM (BITM_ROM_SYSCTRL_WUA_DPMWRITE & BITM_ROM_SYSCTRL_WUA_DMC & !BITM_ROM_SYSCTRL_WUA_OVERRIDE), the ulWUA_Flags bit BITM_ROM_WUA_DMC_PADRESTORE is always treated as b#1 rather than evaluating whether it has been set to b#0 or b#1. This affects boot ROM code DMC initialization from both the DPM restore registers and from OTP memory, causing DMC settings to unnecessarily be restored. WORKAROUND: None APPLIES TO REVISION(S): 0.0 20. 19000024 - Boot Mode Disable Feature is Not Functional: DESCRIPTION: The OTP field bootModeDisable does not disable boot modes. WORKAROUND: None APPLIES TO REVISION(S): 0.0 21. 19000025 - RCU_BCODE Cannot be Restored Upon Returning From Hibernate Mode: DESCRIPTION: The WUA_BCODE bit in the DPM_RESTORE0 register is not functional. Therefore, the RCU_BCODE register cannot be restored when waking from hibernate mode. WORKAROUND: None APPLIES TO REVISION(S): 0.0 NR004345E | Page 12 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 22. 19000026 - Secure SPI Master Boot Only Supported From Memory-Mapped SPI Devices on SPI2: DESCRIPTION: Secure SPI master boot can only be done in memory-mapped mode from SPI2. SPI0 and SPI1 do not support memory-mapped mode and therefore cannot support secure SPI master boot. The same restriction applies when calling the ROM API to boot. WORKAROUND: If secure SPI boot is needed, always configure dBootCommand to use SPI2 in XIP mode. When calling the ROM API, ensure that the lowest nibble (boot source device) of the boot command parameter is 0x7. The memory-mapped address where the boot needs to be started also needs to be passed as a start address parameter. For example, the below ROM API call boots from SPI flash which is mapped to 0x40000000 in XIP mode using SPI2: adi_rom_Boot(0x40000000,0,0,0,0x207); APPLIES TO REVISION(S): 0.0, 1.0 23. 19000027 - RCU_MSG Register Incorrectly Reports HALTONINIT Emulation Exception: DESCRIPTION: When an initcode routine is called the boot code stored in ROM should set the RCU_MSG.HALTONINIT bit, but instead it sets the RCU_MSG.HALTONCALL bit. WORKAROUND: Trap HALTONCALL emulation exceptions rather than HALTONINIT exceptions when attempting to halt on an initcode call. APPLIES TO REVISION(S): 0.0 24. 19000028 - The adi_rom_Boot API Only Allows Booting From SPI Flash Address 0x0: DESCRIPTION: The adi_rom_Boot API only allows booting to begin from address 0x0 of SPI flash memory when using SPI Master boot mode. Calling the ROM API to start booting from any other SPI flash address will fail. WORKAROUND: None APPLIES TO REVISION(S): 0.0 25. 19000029 - Error Address in the Boot Config Struct is Incorrect: DESCRIPTION: After entering the boot ROM error handler, the errorReturn field of the ADI_ROM_BOOT_CONFIG struct will always point to 0x40025AC, which is not the location of the error. WORKAROUND: Either workaround may be used: 1. Set a breakpoint at 0x40025AC and read the RETS register once the breakpoint is reached. RETS will contain the location of the failure. 2. Use the stack to find the trace back to the failing function. APPLIES TO REVISION(S): 0.0 NR004345E | Page 13 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 26. 19000031 - CGU and DMC Settings Cannot be Restored From the DPM Upon Wake from Hibernate: DESCRIPTION: adi_rom_sysControl does not correctly restore CGU and DMC settings from the DPM_RESTORE registers after wake from hibernate. WORKAROUND: If the CGU and/or the DMC need to be initialized after wake from hibernate the required values should be programmed in the appropriate OTP memory locations. APPLIES TO REVISION(S): 0.0 27. 19000032 - Transactions to Certain SPU and SMPU MMR Regions Cause Erroneous Errors: DESCRIPTION: Non-secure reads or writes to the upper half of each SPU instance's MMR space will be erroneously blocked and cause a bus error when the SPU is set as non-secure slave. The same is true for each SMPU instance. The affected MMR address range can be calculated for each instance of the SPU and SMPU as follows: Lower bound = Instance Address Offset + 0x800 Upper bound = Instance Address Offset + 0xFFF WORKAROUND: None APPLIES TO REVISION(S): 0.0, 1.0 28. 19000034 - The JUMPCCEN Enable Bit in the BP_CFG Register Defaults to b#0 Instead of b#1: DESCRIPTION: The branch predictor does not come out of reset with optimal settings for most general-purpose programs. The JUMPCCEN bit in BP_CFG should be b#1 rather than b#0. WORKAROUND: Set BP_CFG.JUMPCCEN to b#1 as early as possible in a program. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0, 1.0 29. 19000035 - SYS_RESOUT Fails to Drive Low During Hardware Reset and Hibernate: DESCRIPTION: The SYS_RESOUT output should drive low while the SYS_HWRST input is asserted and during the hibernate state. Instead, SYS_RESOUT remains in a high impedance state any time SYS_HWRST is asserted or the hibernate state is entered. WORKAROUND: None APPLIES TO REVISION(S): 0.0 NR004345E | Page 14 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 30. 19000036 - System Reset Causes Emulator to Lose Connectivity: DESCRIPTION: Performing a system reset through the RCU (regardless of the source) causes the emulator to lose connectivity. WORKAROUND: There are two possible workarounds for this issue: 1. Re-connect the emulator if emulation is required after the system reset. 2. To maintain emulator connectivity a core-only reset can be performed instead of a system reset. In this case each peripheral and infrastructure block that needs to be reset for the particular application will have to be individually reset as well. APPLIES TO REVISION(S): 0.0 31. 19000038 - Writes to the SPI_SLVSEL Register Do Not Take Effect: DESCRIPTION: A single write to the SPI_SLVSEL register should change the state of the register and cause the modified software-controlled SPI slave selects to assert or de-assert. Instead, a single write to SPI_SLVSEL has no effect. WORKAROUND: Any write to SPI_SLVSEL should be done twice (back-to-back) with the same value in order for the change to take effect. APPLIES TO REVISION(S): 0.0, 1.0 32. 19000039 - Alternate SPT0_A Locations Not Functional on PA_12, PA_13, and PA_14: DESCRIPTION: The following SPT0_A signals in the multiplexed function 2 column of port A are not functional: Signal Name Multiplexed Function 2 PA_12 SPT0_AFS PA_13 SPT0_ACLK PA_14 SPT0_AD0 WORKAROUND: Use SPT0_A in its Port C location. APPLIES TO REVISION(S): 0.0 NR004345E | Page 15 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 33. 19000040 - Deep Power Down Mode Exit for LPDDR Does Not Work as Expected: DESCRIPTION: The following steps show the intended DMC programming model for LPDDR deep power down mode exit: 1. Clear the DMC0_CTL.DPDREQ bit to exit from deep power down mode. 2. Wait for DMC0_STAT.DPDACK to be cleared. 3. Wait for DMC0_STAT.INITDONE to be set to make sure that the automatic initialization sequence is completed. 4. Now the LPDDR memory can be accessed. The automatic initialization sequence in Step 3 may fail to correctly complete, though the DMC0_STAT.INITDONE bit will be set as if the initialization had completed correctly. When the automatic initialization sequence does not complete as expected, unpredictable results (e.g. data corruption) can occur during subsequent accesses to LPDDR memory. WORKAROUND: As shown below, a fresh memory initialization sequence must be explicitly initiated by user code after exiting deep power down mode: 1. Clear the DMC0_CTL.DPDREQ bit to exit deep power down mode. 2. Wait for DMC0_STAT.DPDACK to be cleared. 3. Wait for DMC0_STAT.INITDONE bit to be set (this does not guarantee that the automatic initialization sequence was successful, so step 4 must be performed as well). 4. Set the DMC0_CTL.INIT bit and wait again for the DMC0_STAT.INITDONE to be set. 5. Now the LPDDR memory can be accessed. The workaround steps are also available in C code: #include <cdefBF707.h> //1. Clear the DMC0_CTL.DPDREQ bit to exit from deep power down mode. *pREG_DMC0_CTL&=~BITM_DMC_CTL_DPDREQ; //2. Wait for DMC0_STAT.DPDACK to be cleared. while((*pREG_DMC0_STAT&BITM_DMC_STAT_DPDACK)==1); //3. Wait for DMC0_STAT.INITDONE bit to be set (this does not guarantee that the //automatic initialization sequence was successful, so step 4 must be //performed as well). while((*pREG_DMC0_STAT&BITM_DMC_STAT_INITDONE)==0); //4. Set the DMC0_CTL.INIT bit and wait again for the DMC0_STAT.INITDONE to be //set. *pREG_DMC0_CTL|=BITM_DMC_CTL_INIT; while((*pREG_DMC0_STAT&BITM_DMC_STAT_INITDONE)==0); //5. Now the LPDDR memory can be accessed. APPLIES TO REVISION(S): 0.0, 1.0 34. 19000041 - CYCLES Registers Do Not Count While Core is in IDLE: DESCRIPTION: The CYCLES and CYCLES2 registers do not advance when the Blackfin+ core is in the IDLE state. WORKAROUND: There are two possible workarounds: 1. Use the core timer instead of the CYCLES registers to count CCLK cycles. 2. Don't use the IDLE instruction. APPLIES TO REVISION(S): 0.0 NR004345E | Page 16 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 35. 19000042 - Self-Nested Interrupts Disable Further Interrupts: DESCRIPTION: From the core perspective, the System Event Controller (SEC) is a single source that raises interrupt requests on IVG11. In order to support the SEC's ability to forward higher-priority interrupt requests to the core while the core is servicing a lower-priority interrupt, the IVG11 ISR must be able to be interrupted by itself, which means self-nesting must be enabled. Consider the case where interrupt source A is higher-priority than interrupt source B coming from the SEC. When the IVG11 ISR is servicing interrupt B, interrupt A occurs. Due to the self-nesting nature of the IVG11 ISR, the IVG11 ISR code is executed again to service interrupt A. After interrupt A has been serviced, the ISR moves back to executing the service routine for interrupt B, which is where the anomaly manifests. Typically, the following code would be used at the end of an interrupt service routine designed to support nested interrupts: RETI = [SP++]; RTI; Writing the RETI register disables nested interrupts, and the RTI instruction is supposed to clear the global interrupt disable bit (IPEND[4]). However, the anomaly is that when self-nesting is enabled, the IPEND[4] bit is not cleared. This results in interrupts being globally disabled from that point forward. WORKAROUND: While software cannot directly access IPEND to recover from this condition, a forced soft exception can be added to the epilogue code for a nested ISR to work around this issue: RETI = [SP++]; EXCPT USER_EXCPT; RTI; // USER_EXCPT is an integer between 0 and 15 The exception handler code must be set up to service the soft exception raised above (EXCAUSE = USER_EXCPT), as follows: [--SP] = R0; [--SP] = ASTAT; R0 = RETI; CC = BITTST(R0,0); if !CC jump _NOT_NESTED; [--SP] = RETI; // clears IPEND[4] BITCLR(R0,0); RETX = R0; SP+=4; _NOT_NESTED: ASTAT = [SP++]; R0 = [SP++]; RTX; When RETI is pushed to the stack, the hardware sets bit 0 as a self-nested interrupt flag. Subsequently, when restored from the stack, bit 0 is cleared before being written back to the RETI register. The above code checks this flag bit. If the interrupt was nested, the RETX register is overwritten with the RETI contents to bypass execution of the RTI instruction itself. That is, the RTX instruction will return to the original ISR rather than to the nested ISR. Otherwise, the RTX instruction returns directly to the ISR that raised the exception, and the RTI instruction in the ISR is executed normally. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 NR004345E | Page 17 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 36. 19000043 - GP Timer Generates First Interrupt/Trigger One Edge Late in EXTCLK Mode: DESCRIPTION: When any GP Timer is configured in external clock mode the first interrupt/trigger should occur, along with the setting of the corresponding TIMER_DATA_ILAT bit, after the TIMER_TMRn_CNT register reaches the value programmed in the TIMER_TMRn_PER register. Instead, the interrupt/trigger and the setting of the TIMER_DATA_ILAT bit occur one signal edge later. At this point the TIMER_TMRn_CNT register will have rolled over to 1. Subsequent interrupts/triggers occur after the correct number of edges. For example, the TIMER_TMRn_PER register is configured to a value 7. After the timer has started, the first interrupt/trigger will occur after the TIMER receives 8 signal edges externally. Subsequent interrupts/triggers will occur every 7 signal edges. WORKAROUND: For interrupts/triggers to occur every n edges of the external clock the TIMER_TMRn_PER register should be configured to n-1 for the initial event and to n for subsequent events. Pseudocode: TIMER_TMRn_PER = n-1; TIMER_RUN_SET = 1; TIMER_TMRn_PER = n; //Configure PERIOD register with n-1 //Enable the timer //Configure PERIOD register with n The update which sets TIMER_TMRn_PER = n will not take effect until the 2nd period. APPLIES TO REVISION(S): 0.0, 1.0 37. 19000044 - Dynamic Branch Prediction for RTS Instructions May Cause Data Loss: DESCRIPTION: Dynamic branch prediction for RTS branches is not functional. Having dynamic branch prediction enabled for RTS branches can cause data loss. Data loss occurs only if an RTS mispredict occurs and user code contains one of the following: 1. Core reads of system MMRs that have read side effects (meaning that the contents of the MMRs are altered by reading them). 2. Core reads of devices connected to the SMC that have read side effects (e.g. FIFOs). In this situation the core may issue extra reads when mispredict occurs. When the core subsequently attempts to read the system MMR or the SMC device, altered data will be read. WORKAROUND: The BP_CFG.RTSEN bit must be cleared (b#0) after booting. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices (CrossCore Embedded Studio, the GNU Tool Chain, and the Linux kernel), please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0 38. 19000045 - TESTSET Instruction May Cause Core Hang: DESCRIPTION: The TESTSET instruction can cause the core to hang. WORKAROUND: Do not use TESTSET. APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 18 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 39. 19000046 - The JTG_TRST Signal Erroneously Uses an Internal Pull-up Resistor: DESCRIPTION: The JTG_TRST signal erroneously uses an internal pull-up resistor. An internal pull-down should have been used instead to guarantee that internal emulation logic will always be properly initialized during power-up reset. WORKAROUND: Use a 10kOhm external pull-down on JTG_TRST to overpower the internal pull-up. APPLIES TO REVISION(S): 0.0 40. 19000047 - Dynamic Branch Prediction for Self-Modifying Code is Not Functional: DESCRIPTION: Dynamic branch prediction for self-modifying code is not functional and may cause unpredictable results. WORKAROUND: If self-modifying code is used, reset the branch predictor before each code modification. This pseudocode describes the procedure: 1. CSYNC instruction //Allows pending transactions to complete 2. Set BP_CFG.CLRBP //Begin clearing the prediction table 3. Clear SYSCFG.BPEN //Disable the branch predictor 4. Wait at least 150 CCLK cycles //Allows prediction table to clear 5. Set SYSCFG.BPEN //Re-enable the branch predictor Even in the absence of this anomaly it is good programming practice to reset the branch predictor when code modifications occur. This will clear invalid prediction tables and typically result in better performance. This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0, 1.0 41. 19000048 - User Mode Allows Access to MMRs and Protected Memory: DESCRIPTION: User mode erroneously allows access to MMRs, as well as to regions of memory that are set by CPLBs to be protected from user mode access. An exception still occurs when such an access happens, but the access is not prevented. WORKAROUND: None APPLIES TO REVISION(S): 0.0 42. 19000049 - Processor May Fail to Wake From Hibernate When the USB Cable is Disconnected: DESCRIPTION: This issue occurs in USB device mode when the processor is in hibernate and set to wake from USB events. In this state, disconnecting the USB cable should cause the processor to wake from hibernate, but may not do so. The reason is that the internal pull-down resistor on USB_VBUS is erroneously disabled. WORKAROUND: Add a 200kOhm pull-down resistor to USB_VBUS if the processor needs to wake from hibernate when the USB cable is disconnected. APPLIES TO REVISION(S): 0.0 NR004345E | Page 19 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 43. 19000051 - DLL in the DMC PHY May Not Lock to the New DCLK Frequency: DESCRIPTION: The DLL in the DMC PHY is responsible for generating the required phase between the strobe (DQS0/DQS1) and data (DQn) signals when driven out of the controller. Whenever the DCLK frequency is modified using the CGU, the DLL is expected to lock automatically to the new DCLK frequency. Because of this anomaly, the DLL may not lock to the new DCLK frequency and thus the controller may not generate the required phase between the DQS0/DQS1 and DQn signals which can result in data corruption when trying to access a DDR2 or LPDDR memory device. WORKAROUND: To avoid the issue, the DLL must be held in reset during any CGU programming that results in a change to the DCLK frequency. Once a valid Init_cgu function is in place, perform the workaround using the following C code: *pREG_DMC_PHY_CTL0|=0x800; //Set bit number 11 of the DMC_PHY_CTL0 register Init_cgu(); //Program the CGU to change the DCLK frequency *pREG_DMC_PHY_CTL0&=~0x800; //Clear bit number 11 of the DMC_PHY_CTL0 register APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 20 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 44. 19000053 - ROM Code Erroneously Jumps to DMC Space During Wake From Hibernate: DESCRIPTION: The boot code provides an option to restore CGU and DMC settings from the DPM restore registers via the wake-up action flag (WUA_EN) upon wakeup from hibernate. When WUA_EN is set, the CGU and/or DMC registers are restored correctly from DPM after returning from hibernate. However, the processor subsequently jumps to DMC memory space (DDR2 or LPDDR memory) regardless of whether the WUA_MEMBOOT flag is set. Therefore, the processor will only boot successfully after hibernate if code is preserved in DDR2 or LPDDR memory during hibernate to facilitate the post-hibernate boot process. The correct behavior is to only boot from DMC memory space when WUA_MEMBOOT is set. To encounter this anomaly both of the following must be true: 1. Hibernate mode is used. 2. The WUA_EN flag is used to restore CGU and/or DMC settings from the DPM restore registers. WORKAROUND: There are several workarounds to consider depending on the desired behavior coming out of hibernate, whether DDR2/LPPDDR is used, and whether the part is locked. The "Possible Workarounds List" includes all possible workarounds. Tables 1, 2, and 3 show which of the possible workarounds should be used in each scenario. For use cases in which DDR2 or LPDDR Memory is not present, the possible workarounds are listed in Table 1. In cases where there are two workaround options the second option appears in the "Possible Workaround 2" column. Table 1: DDR2 or LPDDR Memory is Not Present CGU Setup Desired After Hibernate Part Locked Possible Workaround 1 Possible Workaround 2 Yes No A C Yes Yes A For use cases with all of the following characteristics, the possible workarounds are listed in Table 2. In cases where there are two workaround options the second option appears in the "Possible Workaround 2" column. 1. DDR2 or LPDDR memory is present. 2. DDR2 or LPDDR initialization is desired before the main application is booted when returning from hibernate. 3. Execution from DDR2 or LPDDR after returning from hibernate is not desired. Table 2: DDR2/LPDDR Initialization Without Direct Execution CGU Setup Desired After Hibernate Part Locked Possible Workaround 1 Possible Workaround 2 No No B D No Yes D Yes No A and B Yes Yes A and B C and D For use cases with all of the following characteristics use table 3 below to match up to the list of possible workarounds: 1. DDR2 or LPDDR memory is present. 2. When returning from hibernate mode initialization of the DDR2 or LPDDR is desired before the main application is booted. 3. Execution from DDR2 or LPDDR after returning from hibernate is desired. Table 3: DDR2/LPDDR Initialization With Direct Execution CGU Setup Desired After Hibernate Part Locked Workaround No No E No Yes E and F Yes No E Yes Yes E and F Possible Workarounds List A. Initialize CGU via OTP. B. Initialize DMC via OTP. NR004345E | Page 21 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 C. D. E. F. Silicon Anomaly List Initialize CGU via initcode. Initialize DMC via initcode. Update Syscontrol.ulWUA_BootAddr to point to a routine in DDR2/LPDDR before self-refresh & hibernate Program the cache disable bit (cacheDis) in OTP. Since workaround E is most complicated a pseudocode example is provided below. In this example, the syscontrol.ulWUA_BootAddr is updated to map to a function residing in the DMC (DDR2 or LPDDR) space. Upon wake from hibernate, the processor vectors to the function in DMC space. Inside this function the SPU must be programmed to make the booting peripheral (SPI is used for the example) secure. The ROM API is then called to boot the application. Main() { DMC_Enter_Self_Refresh(); ADI_ROM_SYSCTRL Syscontrol; // Use the pad restore option Syscontrol.ulWUA_Flags = BITM_ROM_WUA_EN | BITM_ROM_WUA_DMC | BITM_ROM_WUA_CGU | BITM_ROM_WUA_DMC_PADRESTORE |0xAD000000; Syscontrol.ulWUA_BootAddr = &Work_Around_Function; uint32_t dActionflags1 = BITM_ROM_SYSCTRL_WUA_EN | BITM_ROM_SYSCTRL_WUA_DPMWRITE | BITM_ROM_SYSCTRL_DDR_WRITE| BITM_ROM_WUA_DMC_PADRESTORE | BITM_ROM_SYSCTRL_WUA_DMC | BITM_ROM_SYSCTRL_WUA_CGU; //Write the DMC registers into DPM block adi_rom_dpmMgmt(dActionflags1, &Syscontrol, NULL); //Configure the Wakeup sources Config_Wakeups(WAKE0_PB07, ACTIVE_HIGH); // Setup Power good counter Setup_Pwgcnt(PWGD_4K_CYCLES); //Enter Hibernate mode Enter_Hibernate(); } section ("dmc_bank0") void Work_Around_Function() { //The SPU configuration and the ROM API parameters shown below are //for SPI Master Boot Mode as an example *pREG_SPU0_SECUREP51 = 0x3; *pREG_SPU0_SECUREP52 = 0x3; //Turn on optimization to have the bootrom_jumptable_boot_t pBoot mapped // to L3. adi_rom_Boot(0x40000000,0,0,0,0x207); } APPLIES TO REVISION(S): 1.0 NR004345E | Page 22 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 45. 19000054 - Dynamic Branch Prediction During Self-Nested ISRs Causes Unpredictable Results: DESCRIPTION: The System Event Controller (SEC) is a single source that raises interrupt requests to the core at level 11 (IVG11). In order to support the SEC's ability to forward higher-priority interrupt requests to the core while the core is servicing a lower-priority interrupt, the IVG11 ISR must be able to be interrupted by itself, which means self-nesting must be enabled. Consider the case where interrupt source A is higher-priority than interrupt source B coming from the SEC. When the IVG11 ISR is servicing interrupt B, interrupt A occurs. Due to the self-nesting nature of the IVG11 ISR, the IVG11 ISR code is executed again to service interrupt A. If dynamic branch prediction is enabled during this execution, and the nested interrupt occurs exactly between the source and destination instructions of a branch (JUMPs, CALLs, or RTS) in the interrupt handler, the self-nesting state of the ISR can be lost, thus resulting in unpredictable code flow, which can lead to various run-time failures (including exceptions). WORKAROUND: The simplest workaround is to globally disable dynamic branch prediction by clearing the SYSCFG.BPEN bit. However, this may lead to reduced core performance. An alternative is to disable dynamic prediction only in self-nested interrupt service routines. This can be accomplished by modifying the interrupt dispatcher code that is the wrapper for the IVG11 ISR. The code should use two global variables - one to keep track of the ISR nesting level and one to store the BP-enable bit in the outermost ISR. The workaround requires that code be added to both the prologue and the epilogue for each self-nesting ISR. In the self-nesting ISR prologue: // Keep a count of how deeply nested the application is running at R0 = [_isr_nest_count]; CC = R0; R0 += 1; [_isr_nest_count] = R0; // Save the BPEN bit for the outer ISR only, and disable BPEN. IF CC JUMP _already_nested; R0 = SYSCFG; R1 = BITM_SYSCFG_BPEN; R1 = R0 & R1; [_prev_bp_enable] = R1; // Save the BPEN bit BITCLR(R0, BITP_SYSCFG_BPEN); CSYNC; // Make sure pipeline is clear before disabling BP SYSCFG = R0; _already_nested: // Normal dispatcher code goes here Then, in the self-nesting ISR epilogue: // Decrement nest count and restore BP enable bit at the outermost level R0 = [_isr_nest_count]; R0 += -1; CC = R0; [_isr_nest_count] = R0; IF CC JUMP _still_nested; R1 = [_prev_bp_enable]; R0 = SYSCFG; R0 = R0 | R1; SYSCFG = R0; _still_nested: // Rest of dispatcher epilogue goes here This workaround may be built into the development tool chain and/or into the operating system source code. For tool chains and operating systems supported by Analog Devices, please consult the "Silicon Anomaly Tools Support" help page in the applicable documentation and release notes for details. For all other tool chains and operating systems, see the appropriate supporting documentation for details. APPLIES TO REVISION(S): 0.0, 1.0 NR004345E | Page 23 of 25 | February 2016 ADSP-BF700/701/702/703/704/705/706/707 Silicon Anomaly List 46. 19000055 - Core Writes to CAN MMRs May Not Occur: DESCRIPTION: When the CAN bus is active, all frames are sampled whether or not the CAN is configured to receive the message or respond to a remote frame request. An internal mailbox comparison run is initiated after the frame header is latched (during the r0 bit for standard frames, and during the r1 bit for extended frames) to determine whether or not the active message is a match to any enabled receive mailbox in the CAN block. During this sensitive window where the internal scan is taking place, core writes to the CAN MMR address space may not occur, and lost writes will go undetected. Core reads of the CAN MMR space are not affected by this anomaly. WORKAROUND: The anomaly does not occur when the CAN module is electrically disconnected from the CAN bus. When electrically connected to the CAN bus, it is impossible to determine when the internal comparison run is taking place. As a result, all writes to the CAN MMR space must be implemented as an atomic triple-write access in order to guarantee that the write occurs outside the sensitive window, per the following pseudo-code: CAN_TRIPLE_WRITE(CAN_MMR_ADDRESS, Value): DISABLE_INTERRUPTS; CAN_MMR_ADDRESS = Value; CAN_MMR_ADDRESS = Value; CAN_MMR_ADDRESS = Value; SSYNC; ENABLE_INTERRUPTS; While this workaround guarantees that all core writes will occur properly to the CAN MMR space, it introduces the potential for multiple writes to occur where only a single write should have been made. Though not an issue in most cases, this is problematic when considering writes to W1C registers like CAN_RMP and CAN_MBRIF when processing a received message. For these registers, if one of the first two writes occurs properly and the hardware then resets the same bit due to the arrival of the next message to the same mailbox, a subsequent write from the workaround code will now erroneously clear the status bit again immediately without actually processing the newly arrived data, and there will be no indication that the second message was not processed. For this case, software can further utilize the Temporary Mailbox Disable feature prior to writing the CAN_RMP or CAN_MBRIF registers (e.g., for clearing the RMP bit for RX mailbox 2): CAN_TRIPLE_WRITE(REG_CAN0_MBTD, (BITM_CAN_MBTD_TDR|MB_NUM)); // MB_NUM = 0x2 while(!(*pREG_CAN0_MBTD & BITM_CAN_MBTD_TDA)); // Poll for ACK CAN_TRIPLE_WRITE(REG_CAN0_RMP1, BITM_CAN_RMP1_MB02); // Clear RMP2 With this additional code, a second message destined for the same receive mailbox as the first message will not result in an undetected lost message due to the required workaround code. If the 2nd message is in the process of being stored at the time that the temporary disable request is executed, it will be received completely (and the appropriate CAN_RML bit will be set). However, if the temporary disable request occurs before the second message becomes ongoing (at the start of the DLC field of the active message), then a second receive mailbox must also be enabled to receive the same message ID as the first message, otherwise the second message will not be received due to there being no match to an enabled RX mailbox in the comparison run that establishes which message center to store to. APPLIES TO REVISION(S): 0.0, 1.0 47. 19000056 - High-Speed DMA Feature Not Implemented: DESCRIPTION: The high-speed DMA (HSDA) feature described in the processor hardware reference manual is not implemented on older revisions of silicon. WORKAROUND: None. APPLIES TO REVISION(S): 0.0 NR004345E | Page 24 of 25 | February 2016 Silicon Anomaly List ADSP-BF700/701/702/703/704/705/706/707 48. 19000057 - Locked Processors Cannot be Unlocked by Emulator if Other Devices are Present in the JTAG Scan Chain: DESCRIPTION: This issue occurs only if the processor has been locked by using the Lock API to write to OTP memory. Once the processor has been locked, it cannot be unlocked by the emulator if any other devices are present in the JTAG scan chain. WORKAROUND: None APPLIES TO REVISION(S): 0.0, 1.0 ©2016 Analog Devices, Inc. All rights reserved. Trademarks and registered trademarks are the property of their respective owners. a NR004345E | Page 25 of 25 | February 2016 www.analog.com