@@ -140,6 +140,8 @@ static int xtensa_do_step(struct target *target,
140
140
static int xtensa_poll (struct target * target );
141
141
static int xtensa_assert_reset (struct target * target );
142
142
static int xtensa_deassert_reset (struct target * target );
143
+ static int xtensa_smpbreak_set (struct target * target );
144
+ static int xtensa_smpbreak_set_core (struct target * target , int core );
143
145
static int xtensa_read_memory (struct target * target ,
144
146
uint32_t address ,
145
147
uint32_t size ,
@@ -849,23 +851,31 @@ static int xtensa_assert_reset(struct target *target)
849
851
}
850
852
851
853
static int xtensa_smpbreak_set (struct target * target )
854
+ {
855
+ int res = ERROR_OK ;
856
+ for (int core = 0 ; core < ESP32_CPU_COUNT && res == ERROR_OK ; core ++ )
857
+ {
858
+ res = xtensa_smpbreak_set_core (target , core );
859
+ }
860
+ return res ;
861
+ }
862
+
863
+ static int xtensa_smpbreak_set_core (struct target * target , int core )
852
864
{
853
865
struct esp32_common * esp32 = (struct esp32_common * )target -> arch_info ;
854
866
int res ;
855
867
uint32_t dsr_data = 0x00110000 ;
856
868
uint32_t set = 0 , clear = 0 ;
857
- set |= OCDDCR_BREAKINEN | OCDDCR_BREAKOUTEN | OCDDCR_RUNSTALLINEN ;
869
+ set |= OCDDCR_BREAKINEN | OCDDCR_BREAKOUTEN | OCDDCR_RUNSTALLINEN | OCDDCR_ENABLEOCD ;
858
870
clear = set ^ (OCDDCR_BREAKINEN | OCDDCR_BREAKOUTEN | OCDDCR_RUNSTALLINEN | OCDDCR_DEBUGMODEOUTEN );
859
871
860
- for (int core = 0 ; core < ESP32_CPU_COUNT ; core ++ )
861
- {
862
- esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DCRSET , set );
863
- esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DCRCLR , clear );
864
- esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DSR , dsr_data );
865
- esp108_queue_tdi_idle (esp32 -> esp32_targets [core ]);
866
- }
872
+ esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DCRSET , set );
873
+ esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DCRCLR , clear );
874
+ esp108_queue_nexus_reg_write (esp32 -> esp32_targets [core ], NARADR_DSR , dsr_data );
875
+ esp108_queue_tdi_idle (esp32 -> esp32_targets [core ]);
867
876
res = jtag_execute_queue ();
868
- LOG_DEBUG ("%s[%s] set smpbreak=%i, state=%i" , __func__ , target -> cmd_name , set , target -> state );
877
+
878
+ LOG_DEBUG ("%s[%s] core %d, set smpbreak=%x, state=%i" , __func__ , target -> cmd_name , core , set , target -> state );
869
879
return res ;
870
880
}
871
881
@@ -1567,17 +1577,41 @@ static int xtensa_poll(struct target *target)
1567
1577
int res , cmd ;
1568
1578
uint8_t traxstat [ESP32_CPU_COUNT ][4 ] = {{0 }}, traxctl [ESP32_CPU_COUNT ][4 ] = {{0 }};
1569
1579
unsigned int dsr [ESP32_CPU_COUNT ] = {0 };
1580
+ uint32_t idcode [ESP32_CPU_COUNT ] = {0 };
1570
1581
1571
1582
//Read reset state
1583
+ uint32_t core_poweron_mask = 0 ;
1572
1584
for (size_t i = 0 ; i < ESP32_CPU_COUNT ; i ++ )
1573
1585
{
1586
+ esp108_queue_idcode_read (esp32 -> esp32_targets [i ], (uint8_t * ) & idcode [i ]);
1574
1587
esp108_queue_pwrstat_readclear (esp32 -> esp32_targets [i ], & pwrstat [i ]);
1575
1588
//Read again, to see if the state holds...
1576
1589
esp108_queue_pwrstat_readclear (esp32 -> esp32_targets [i ], & pwrstath [i ]);
1577
1590
esp108_queue_tdi_idle (esp32 -> esp32_targets [i ]);
1578
1591
res = jtag_execute_queue ();
1579
1592
if (res != ERROR_OK ) return res ;
1593
+ if (idcode [i ] != 0xffffffff && idcode [i ] != 0 ) {
1594
+ core_poweron_mask |= (1 << i );
1595
+ }
1596
+ }
1597
+
1598
+ // Target might be held in reset by external signal.
1599
+ // Sanity check target responses using idcode (checking CPU0 is sufficient).
1600
+ if (core_poweron_mask == 0 ) {
1601
+ if (target -> state != TARGET_UNKNOWN ) {
1602
+ LOG_INFO ("%s: Target offline" , __func__ );
1603
+ target -> state = TARGET_UNKNOWN ;
1604
+ }
1605
+ esp32 -> prevpwrstat = 0 ;
1606
+ esp32 -> core_poweron_mask = 0 ;
1607
+ return ERROR_TARGET_FAILURE ;
1608
+ }
1609
+ uint32_t cores_came_online = core_poweron_mask & (~esp32 -> core_poweron_mask );
1610
+ esp32 -> core_poweron_mask = core_poweron_mask ;
1611
+ if (cores_came_online != 0 ) {
1612
+ LOG_DEBUG ("%s: core_poweron_mask=%x" , __func__ , core_poweron_mask );
1580
1613
}
1614
+
1581
1615
if (!(esp32 -> prevpwrstat & PWRSTAT_DEBUGWASRESET ) && pwrstat [ESP32_PRO_CPU_ID ] & PWRSTAT_DEBUGWASRESET ) {
1582
1616
LOG_INFO ("%s: Debug controller was reset (pwrstat=0x%02X, after clear 0x%02X)." , target -> cmd_name , pwrstat [ESP32_PRO_CPU_ID ], pwrstath [ESP32_PRO_CPU_ID ]);
1583
1617
}
@@ -1605,6 +1639,11 @@ static int xtensa_poll(struct target *target)
1605
1639
1606
1640
for (size_t i = 0 ; i < ESP32_CPU_COUNT ; i ++ )
1607
1641
{
1642
+ if (cores_came_online & (1 << i )) {
1643
+ LOG_DEBUG ("%s: Core %d came online, setting up DCR" , __func__ , (int ) i );
1644
+ xtensa_smpbreak_set_core (target , i );
1645
+ }
1646
+
1608
1647
uint8_t dsr_buf [4 ] = {0 };
1609
1648
esp108_queue_nexus_reg_write (esp32 -> esp32_targets [i ], NARADR_DCRSET , OCDDCR_ENABLEOCD );
1610
1649
esp108_queue_nexus_reg_read (esp32 -> esp32_targets [i ], NARADR_DSR , dsr_buf );
0 commit comments