[CELL] spufs: fix decr_status meanings

The decr_status in the LSCSA is confusedly used as two meanings:
 * SPU decrementer was running
 * SPU decrementer was wrapped as a result of adjust
and the code to set decr_status is missing.

This patch fixes these problems by using the decr_status argument as a
set of flags. This requires a rebuild of the shipped spu_restore code.

Signed-off-by: Masato Noguchi <Masato.Noguchi@jp.sony.com>
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
This commit is contained in:
Masato Noguchi 2007-07-20 21:39:37 +02:00 коммит произвёл Arnd Bergmann
Родитель cfd529b25d
Коммит 1cfc0f86eb
4 изменённых файлов: 290 добавлений и 244 удалений

Просмотреть файл

@ -90,7 +90,7 @@ static inline void restore_decr(void)
* decrementer value from LSCSA. * decrementer value from LSCSA.
*/ */
offset = LSCSA_QW_OFFSET(decr_status); offset = LSCSA_QW_OFFSET(decr_status);
decr_running = regs_spill[offset].slot[0]; decr_running = regs_spill[offset].slot[0] & SPU_DECR_STATUS_RUNNING;
if (decr_running) { if (decr_running) {
offset = LSCSA_QW_OFFSET(decr); offset = LSCSA_QW_OFFSET(decr);
decr = regs_spill[offset].slot[0]; decr = regs_spill[offset].slot[0];

Просмотреть файл

@ -10,7 +10,7 @@ static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = {
0x24fd8081, 0x24fd8081,
0x1cd80081, 0x1cd80081,
0x33001180, 0x33001180,
0x42030003, 0x42034003,
0x33800284, 0x33800284,
0x1c010204, 0x1c010204,
0x40200000, 0x40200000,
@ -24,22 +24,22 @@ static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = {
0x23fffd84, 0x23fffd84,
0x1c100183, 0x1c100183,
0x217ffa85, 0x217ffa85,
0x3080a000, 0x3080b000,
0x3080a201, 0x3080b201,
0x3080a402, 0x3080b402,
0x3080a603, 0x3080b603,
0x3080a804, 0x3080b804,
0x3080aa05, 0x3080ba05,
0x3080ac06, 0x3080bc06,
0x3080ae07, 0x3080be07,
0x3080b008, 0x3080c008,
0x3080b209, 0x3080c209,
0x3080b40a, 0x3080c40a,
0x3080b60b, 0x3080c60b,
0x3080b80c, 0x3080c80c,
0x3080ba0d, 0x3080ca0d,
0x3080bc0e, 0x3080cc0e,
0x3080be0f, 0x3080ce0f,
0x00003ffc, 0x00003ffc,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
@ -48,19 +48,18 @@ static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = {
0x3ec00083, 0x3ec00083,
0xb0a14103, 0xb0a14103,
0x01a00204, 0x01a00204,
0x3ec10082, 0x3ec10083,
0x4202800e, 0x4202c002,
0x04000703, 0xb0a14203,
0xb0a14202, 0x21a00802,
0x21a00803, 0x3fbf028a,
0x3fbf028d, 0x3f20050a,
0x3f20068d, 0x3fbe0502,
0x3fbe0682,
0x3fe30102, 0x3fe30102,
0x21a00882, 0x21a00882,
0x3f82028f, 0x3f82028b,
0x3fe3078f, 0x3fe3058b,
0x3fbf0784, 0x3fbf0584,
0x3f200204, 0x3f200204,
0x3fbe0204, 0x3fbe0204,
0x3fe30204, 0x3fe30204,
@ -75,52 +74,46 @@ static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = {
0x21a00083, 0x21a00083,
0x40800082, 0x40800082,
0x21a00b02, 0x21a00b02,
0x10002818, 0x10002612,
0x42a00002, 0x42a00003,
0x32800007, 0x42074006,
0x4207000c, 0x1800c204,
0x18008208, 0x40a00008,
0x40a0000b, 0x40800789,
0x4080020a, 0x1c010305,
0x40800709, 0x34000302,
0x00200000,
0x42070002,
0x3ac30384,
0x1cffc489, 0x1cffc489,
0x00200000, 0x3ec00303,
0x18008383, 0x3ec00287,
0x38830382, 0xb0408403,
0x4cffc486, 0x24000302,
0x3ac28185, 0x34000282,
0xb0408584, 0x1c020306,
0x28830382, 0xb0408207,
0x1c020387, 0x18020204,
0x38828182, 0x24000282,
0xb0408405, 0x217ffa09,
0x1802c408, 0x04000403,
0x28828182,
0x217ff886,
0x04000583,
0x21a00803, 0x21a00803,
0x3fbe0682, 0x3fbe0502,
0x3fe30102, 0x3fe30102,
0x04000106, 0x04000105,
0x21a00886, 0x21a00885,
0x04000603, 0x42074002,
0x21a00903, 0x21a00902,
0x40803c02, 0x40803c03,
0x21a00982, 0x21a00983,
0x40800003, 0x04000484,
0x04000184,
0x21a00a04, 0x21a00a04,
0x40802202, 0x40802202,
0x21a00a82, 0x21a00a82,
0x42028005, 0x30809c03,
0x34208702, 0x34000182,
0x21002282, 0x14004102,
0x21002782,
0x21a00804, 0x21a00804,
0x21a00886, 0x21a00885,
0x3fbf0782, 0x3fbf0582,
0x3f200102, 0x3f200102,
0x3fbe0102, 0x3fbe0102,
0x3fe30102, 0x3fe30102,
@ -133,196 +126,235 @@ static unsigned int spu_restore_code[] __attribute__((__aligned__(128))) = {
0x40800083, 0x40800083,
0x21a00b83, 0x21a00b83,
0x01a00c02, 0x01a00c02,
0x01a00d83, 0x01a00d84,
0x3420c282, 0x3080a003,
0x34000182,
0x21a00e02, 0x21a00e02,
0x34210283, 0x3080a203,
0x21a00f03, 0x34000182,
0x34200284, 0x21a00f02,
0x77400200, 0x3080a403,
0x3421c282, 0x34000182,
0x77400100,
0x3080a603,
0x34000182,
0x21a00702, 0x21a00702,
0x34218283, 0x3080a803,
0x21a00083, 0x34000182,
0x34214282, 0x21a00082,
0x3080aa03,
0x34000182,
0x21a00b02, 0x21a00b02,
0x4200480c, 0x3080ae02,
0x00200000, 0x3080ac04,
0x1c010286, 0x42004805,
0x34220284, 0x34000103,
0x34220302, 0x34000202,
0x0f608203, 0x1cffc183,
0x5c024204, 0x3b810106,
0x3b81810b, 0x0f608184,
0x42013c02, 0x42013802,
0x00200000, 0x5c020183,
0x18008185, 0x38810102,
0x38808183, 0x3b810102,
0x3b814182, 0x21000e83,
0x21004e84,
0x4020007f, 0x4020007f,
0x35000100, 0x35000100,
0x000004e0, 0x00000470,
0x000002a0, 0x000002f8,
0x000002e8, 0x00000430,
0x00000428,
0x00000360, 0x00000360,
0x000002e8, 0x000002f8,
0x000004a0,
0x00000468,
0x000003c8, 0x000003c8,
0x000004a8,
0x00000298,
0x00000360, 0x00000360,
0x409ffe02,
0x30801203,
0x40800204,
0x3ec40085,
0x10009c09,
0x3ac10606,
0xb060c105,
0x4020007f,
0x4020007f,
0x20801203,
0x38810602,
0xb0408586,
0x28810602,
0x32004180,
0x34204702,
0x21a00382,
0x4020007f,
0x327fdc80,
0x409ffe02,
0x30801203,
0x40800204,
0x3ec40087,
0x40800405,
0x00200000, 0x00200000,
0x40800606, 0x409ffe02,
0x3ac10608, 0x30801203,
0x3ac14609, 0x40800208,
0x3ac1860a, 0x3ec40084,
0xb060c107, 0x40800407,
0x3ac20289,
0xb060c104,
0x3ac1c284,
0x20801203, 0x20801203,
0x38820282,
0x41004003, 0x41004003,
0x38810602, 0xb0408189,
0x4020007f, 0x28820282,
0xb0408188, 0x3881c282,
0x4020007f, 0xb0408304,
0x28810602, 0x2881c282,
0x41201002,
0x38814603,
0x10009c09,
0xb060c109,
0x4020007f,
0x28814603,
0x41193f83,
0x38818602,
0x60ffc003,
0xb040818a,
0x28818602,
0x32003080,
0x409ffe02,
0x30801203,
0x40800204,
0x3ec40087,
0x41201008,
0x10009c14,
0x40800405,
0x3ac10609,
0x40800606,
0x3ac1460a,
0xb060c107,
0x3ac1860b,
0x20801203,
0x38810602,
0xb0408409,
0x28810602,
0x38814603,
0xb060c40a,
0x4020007f,
0x28814603,
0x41193f83,
0x38818602,
0x60ffc003,
0xb040818b,
0x28818602,
0x32002380,
0x409ffe02,
0x30801204,
0x40800205,
0x3ec40083,
0x40800406,
0x3ac14607,
0x3ac18608,
0xb0810103,
0x41004002,
0x20801204,
0x4020007f,
0x38814603,
0x10009c0b,
0xb060c107,
0x4020007f,
0x4020007f,
0x28814603,
0x38818602,
0x4020007f,
0x4020007f,
0xb0408588,
0x28818602,
0x4020007f,
0x32001780,
0x409ffe02,
0x1000640e,
0x40800204,
0x30801203,
0x40800405,
0x3ec40087,
0x40800606,
0x3ac10608,
0x3ac14609,
0x3ac1860a,
0xb060c107,
0x20801203,
0x413d8003,
0x38810602,
0x4020007f,
0x327fd780,
0x409ffe02,
0x10007f0c,
0x40800205,
0x30801204,
0x40800406,
0x3ec40083,
0x3ac14607,
0x3ac18608,
0xb0810103,
0x413d8002,
0x20801204,
0x38814603,
0x4020007f,
0x327feb80,
0x409ffe02,
0x30801203,
0x40800204,
0x3ec40087,
0x40800405,
0x1000650a,
0x40800606,
0x3ac10608,
0x3ac14609,
0x3ac1860a,
0xb060c107,
0x20801203,
0x38810602,
0xb0408588,
0x4020007f,
0x327fc980,
0x00400000, 0x00400000,
0x40800003, 0x40800003,
0x4020007f,
0x35000000, 0x35000000,
0x30809e03,
0x34000182,
0x21a00382,
0x4020007f,
0x327fd700,
0x409ffe02,
0x30801203,
0x40800206,
0x3ec40084,
0x40800407,
0x40800608,
0x3ac1828a,
0x3ac20289,
0xb060c104,
0x3ac1c284,
0x20801203,
0x38818282,
0x41004003,
0xb040818a,
0x10005b0b,
0x41201003,
0x28818282,
0x3881c282,
0xb0408184,
0x41193f83,
0x60ffc003,
0x2881c282,
0x38820282,
0xb0408189,
0x28820282,
0x327fef80,
0x409ffe02,
0x30801203,
0x40800207,
0x3ec40086,
0x4120100b,
0x10005b14,
0x40800404,
0x3ac1c289,
0x40800608,
0xb060c106,
0x3ac10286,
0x3ac2028a,
0x20801203,
0x3881c282,
0x41193f83,
0x60ffc003,
0xb0408589,
0x2881c282,
0x38810282,
0xb0408586,
0x28810282,
0x38820282,
0xb040818a,
0x28820282,
0x4020007f,
0x327fe280,
0x409ffe02,
0x30801203,
0x40800207,
0x3ec40084,
0x40800408,
0x10005b14,
0x40800609,
0x3ac1c28a,
0x3ac2028b,
0xb060c104,
0x3ac24284,
0x20801203,
0x41201003,
0x3881c282,
0xb040830a,
0x2881c282,
0x38820282,
0xb040818b,
0x41193f83,
0x60ffc003,
0x28820282,
0x38824282,
0xb0408184,
0x28824282,
0x4020007f,
0x327fd580,
0x409ffe02,
0x1000658e,
0x40800206,
0x30801203,
0x40800407,
0x3ec40084,
0x40800608,
0x3ac1828a,
0x3ac20289,
0xb060c104,
0x3ac1c284,
0x20801203,
0x413d8003,
0x38818282,
0x4020007f,
0x327fd800,
0x409ffe03,
0x30801202,
0x40800207,
0x3ec40084,
0x10005b09,
0x3ac1c288,
0xb0408184,
0x4020007f,
0x4020007f,
0x20801202,
0x3881c282,
0xb0408308,
0x2881c282,
0x327fc680,
0x409ffe02,
0x1000588b,
0x40800208,
0x30801203,
0x40800407,
0x3ec40084,
0x3ac20289,
0xb060c104,
0x3ac1c284,
0x20801203,
0x413d8003,
0x38820282,
0x327fbd80,
0x00200000,
0x00000da0,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
0x00000d90,
0x00000000,
0x00000000,
0x00000000,
0x00000db0,
0x00000000,
0x00000000,
0x00000000,
0x00000dc0,
0x00000000,
0x00000000,
0x00000000,
0x00000d80,
0x00000000,
0x00000000,
0x00000000,
0x00000df0,
0x00000000,
0x00000000,
0x00000000,
0x00000de0,
0x00000000,
0x00000000,
0x00000000,
0x00000dd0,
0x00000000,
0x00000000,
0x00000000,
0x00000e04,
0x00000000,
0x00000000,
0x00000000,
0x00000e00,
0x00000000,
0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,
0x00000000, 0x00000000,

Просмотреть файл

@ -1285,7 +1285,15 @@ static inline void setup_decr(struct spu_state *csa, struct spu *spu)
cycles_t resume_time = get_cycles(); cycles_t resume_time = get_cycles();
cycles_t delta_time = resume_time - csa->suspend_time; 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; 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 * "wrapped" flag is set, OR in a '1' to
* CSA.SPU_Event_Status[Tm]. * 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; 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_chnlcnt_RW[0] == 0 &&
((csa->spu_chnldata_RW[2] & 0x20) == 0x0) && ((csa->spu_chnldata_RW[2] & 0x20) == 0x0) &&
((csa->spu_chnldata_RW[0] & 0x20) != 0x1))) { ((csa->spu_chnldata_RW[0] & 0x20) != 0x1))) {

Просмотреть файл

@ -50,6 +50,12 @@
#define SPU_STOPPED_STATUS_P_I 8 #define SPU_STOPPED_STATUS_P_I 8
#define SPU_STOPPED_STATUS_R 9 #define SPU_STOPPED_STATUS_R 9
/*
* Definitions for software decrementer status flag.
*/
#define SPU_DECR_STATUS_RUNNING 0x1
#define SPU_DECR_STATUS_WRAPPED 0x2
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/** /**
* spu_reg128 - generic 128-bit register definition. * spu_reg128 - generic 128-bit register definition.
@ -63,7 +69,7 @@ struct spu_reg128 {
* @gprs: Array of saved registers. * @gprs: Array of saved registers.
* @fpcr: Saved floating point status control register. * @fpcr: Saved floating point status control register.
* @decr: Saved decrementer value. * @decr: Saved decrementer value.
* @decr_status: Indicates decrementer run status. * @decr_status: Indicates software decrementer status flags.
* @ppu_mb: Saved PPU mailbox data. * @ppu_mb: Saved PPU mailbox data.
* @ppuint_mb: Saved PPU interrupting mailbox data. * @ppuint_mb: Saved PPU interrupting mailbox data.
* @tag_mask: Saved tag group mask. * @tag_mask: Saved tag group mask.