|
@@ -1285,7 +1285,15 @@ static inline void setup_decr(struct spu_state *csa, struct spu *spu)
|
|
|
cycles_t resume_time = get_cycles();
|
|
|
cycles_t delta_time = resume_time - csa->suspend_time;
|
|
|
|
|
|
+ csa->lscsa->decr_status.slot[0] = SPU_DECR_STATUS_RUNNING;
|
|
|
+ if (csa->lscsa->decr.slot[0] < delta_time) {
|
|
|
+ csa->lscsa->decr_status.slot[0] |=
|
|
|
+ SPU_DECR_STATUS_WRAPPED;
|
|
|
+ }
|
|
|
+
|
|
|
csa->lscsa->decr.slot[0] -= delta_time;
|
|
|
+ } else {
|
|
|
+ csa->lscsa->decr_status.slot[0] = 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1544,10 +1552,10 @@ static inline void restore_decr_wrapped(struct spu_state *csa, struct spu *spu)
|
|
|
* "wrapped" flag is set, OR in a '1' to
|
|
|
* CSA.SPU_Event_Status[Tm].
|
|
|
*/
|
|
|
- if (csa->lscsa->decr_status.slot[0] == 1) {
|
|
|
+ if (csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) {
|
|
|
csa->spu_chnldata_RW[0] |= 0x20;
|
|
|
}
|
|
|
- if ((csa->lscsa->decr_status.slot[0] == 1) &&
|
|
|
+ if ((csa->lscsa->decr_status.slot[0] & SPU_DECR_STATUS_WRAPPED) &&
|
|
|
(csa->spu_chnlcnt_RW[0] == 0 &&
|
|
|
((csa->spu_chnldata_RW[2] & 0x20) == 0x0) &&
|
|
|
((csa->spu_chnldata_RW[0] & 0x20) != 0x1))) {
|