We are trying to PCIe boot our custom board based on C6657 without IBL. One feature we need is to reset the DSP through PCIe.
We based our code using MCSDK_2_01_01_04/tools/boot_loader/examples/pcie/linux_host_loader/pciedemo.c. As there is no example code for C6657, but only for C6670 and C6678, we created our own function mimicing C6670 code.
In this code, we disable the PSC for core 0 and 1. The real reset seems to be carried out by updating the DSP_BOOT_ADDR of bootcfg then send IPCG to the appropriate core, then, enable the PSC.
I have the following questions
1. Is the triggering the IPCG not enough for reset? Why do we have to disable PSC first?
2. I've tried to send this command to DSP, but it does not seem to trigger a reset for DSP already running code. Is there anything I miss?
3. I did a simple test using the following code, running in dsp, but after running through it, no reset is triggered.
/* kick unlock */
*((volatile unsigned int *)KICK0)=0x83e70b13;
*((volatile unsigned int *)KICK1)=0x95a4f1e0;
/* dsp_boot_addr */
*((volatile unsigned int *)0x02620040)=(unsigned int)_c_int00;
/* ipcg register */
*((volatile unsigned int *)0x02620240)=1;
bootloaderflag=0x1234abcd;
thanks
Weichun
/* ============================================================================
2231 * @func c6657LocalReset
2232 *
2233 * @desc Perform DSP cores and periphrals reset
2234 *
2235 * @modif None.
2236 * ============================================================================
2237 */
2238 void c6657LocalReset(gauss_device_t *gss_dev,uint32_t bootEntryAddr)
2239 {
2240 uint32_t i;
2241
2242 /* Local reset of all cores */
2243 coreLocalReset(gss_dev, PD13, LPSC_C0_TIM0, LOC_RST_ASSERT);
2244 //coreLocalReset(PD14, LPSC_C1_TIM1, LOC_RST_ASSERT);
2245 //coreLocalReset(PD15, LPSC_C2_TIM2, LOC_RST_ASSERT);
2246 //coreLocalReset(PD16, LPSC_C3_TIM3, LOC_RST_ASSERT);
2247
2248 /* Disable all other modules */
2249 setPscState(PD0, LPSC_TCP3E, PSC_SWRSTDISABLE);
2250 setPscState(PD0, LPSC_VCP2A, PSC_SWRSTDISABLE);
2251 setPscState(PD1, LPSC_DEBUG, PSC_SWRSTDISABLE);
2252 setPscState(PD1, LPSC_TETB, PSC_SWRSTDISABLE);
2253 setPscState(PD2, LPSC_SA, PSC_SWRSTDISABLE);
2254 setPscState(PD2, LPSC_SGMII, PSC_SWRSTDISABLE);
2255 setPscState(PD2, LPSC_PA, PSC_SWRSTDISABLE);
2256 //setPscState(PD3, LPSC_PCIE, PSC_SWRSTDISABLE);
2257 setPscState(PD4, LPSC_SRIO, PSC_SWRSTDISABLE);
2258 setPscState(PD5, LPSC_HYPER, PSC_SWRSTDISABLE);
2259 //setPscState(PD6, LPSC_RESERV, PSC_SWRSTDISABLE);
2260 setPscState(PD7, LPSC_MSMCRAM, PSC_SWRSTDISABLE);
2261 setPscState(PD8, LPSC_RACA_RACB, PSC_SWRSTDISABLE);
2262 setPscState(PD8, LPSC_TAC, PSC_SWRSTDISABLE);
2263 setPscState(PD9, LPSC_FFTCA_FFTCB, PSC_SWRSTDISABLE);
2264 setPscState(PD10, LPSC_AIF2, PSC_SWRSTDISABLE);
2265 setPscState(PD11, LPSC_TCP3DA, PSC_SWRSTDISABLE);
2266 setPscState(PD12, LPSC_VCP2B, PSC_SWRSTDISABLE);
2267 setPscState(PD12, LPSC_VCP2C, PSC_SWRSTDISABLE);
2268 setPscState(PD12, LPSC_VCP2D, PSC_SWRSTDISABLE);
2269 setPscState(PD17, LPSC_TCP3dB, PSC_SWRSTDISABLE);
2270
2271 for (i = 0; i < 1; i++) {
2272 //pushData(localResetCode, i, &bootEntryAddr);
2273 if (setBootAddrIpcgr(gss_dev,i, bootEntryAddr) == 0) {
2274 printk("Core %d is not ready !!! \n", i);
2275 }
2276 }
2277
#if 0
2278 /* Enable all other modules */
2279 setPscState(PD0, LPSC_TCP3E, PSC_ENABLE);
2280 setPscState(PD0, LPSC_VCP2A, PSC_ENABLE);
2281 setPscState(PD1, LPSC_DEBUG, PSC_ENABLE);
2282 setPscState(PD1, LPSC_TETB, PSC_ENABLE);
2283 setPscState(PD2, LPSC_PA, PSC_ENABLE);
2284 setPscState(PD2, LPSC_SGMII, PSC_ENABLE);
2285 setPscState(PD2, LPSC_SA, PSC_ENABLE);
2286 //setPscState(PD3, LPSC_PCIE, PSC_ENABLE);
2287 setPscState(PD4, LPSC_SRIO, PSC_ENABLE);
2288 setPscState(PD5, LPSC_HYPER, PSC_ENABLE);
2289 //setPscState(PD6, LPSC_RESERV, PSC_ENABLE);
2290 setPscState(PD7, LPSC_MSMCRAM, PSC_ENABLE);
2291 setPscState(PD8, LPSC_RACA_RACB, PSC_ENABLE);
2292 setPscState(PD8, LPSC_TAC, PSC_ENABLE);
2293 setPscState(PD9, LPSC_FFTCA_FFTCB, PSC_ENABLE);
2294 setPscState(PD10, LPSC_AIF2, PSC_ENABLE);
2295 setPscState(PD11, LPSC_TCP3DA, PSC_ENABLE);
2296 setPscState(PD12, LPSC_VCP2B, PSC_ENABLE);
2297 setPscState(PD12, LPSC_VCP2C, PSC_ENABLE);
2298 setPscState(PD12, LPSC_VCP2D, PSC_ENABLE);
2299 setPscState(PD17, LPSC_TCP3dB, PSC_ENABLE);
2300
2301 /* Local out of reset of all cores */
2302 coreLocalReset(gss_dev,PD13, LPSC_C0_TIM0, LOC_RST_DEASSERT);
2303 //coreLocalReset(PD14, LPSC_C1_TIM1, LOC_RST_DEASSERT);
2304 //coreLocalReset(PD15, LPSC_C2_TIM2, LOC_RST_DEASSERT);
2305 //coreLocalReset(PD16, LPSC_C3_TIM3, LOC_RST_DEASSERT);
2306
2307
2308 }