From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LF8rq-0007kC-K6 for qemu-devel@nongnu.org; Tue, 23 Dec 2008 10:08:18 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LF8rp-0007jl-Ra for qemu-devel@nongnu.org; Tue, 23 Dec 2008 10:08:18 -0500 Received: from [199.232.76.173] (port=58360 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LF8rp-0007je-N0 for qemu-devel@nongnu.org; Tue, 23 Dec 2008 10:08:17 -0500 Received: from savannah.gnu.org ([199.232.41.3]:35684 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LF8rp-00046Y-49 for qemu-devel@nongnu.org; Tue, 23 Dec 2008 10:08:17 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LF8rm-0002Ts-BN for qemu-devel@nongnu.org; Tue, 23 Dec 2008 15:08:14 +0000 Received: from blueswir1 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LF8rm-0002To-3E for qemu-devel@nongnu.org; Tue, 23 Dec 2008 15:08:14 +0000 MIME-Version: 1.0 Errors-To: blueswir1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Blue Swirl Message-Id: Date: Tue, 23 Dec 2008 15:08:14 +0000 Subject: [Qemu-devel] [6124] Implement hw/eccmemctl.c version differences (Robert Reif) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6124 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6124 Author: blueswir1 Date: 2008-12-23 15:08:13 +0000 (Tue, 23 Dec 2008) Log Message: ----------- Implement hw/eccmemctl.c version differences (Robert Reif) Modified Paths: -------------- trunk/hw/eccmemctl.c Modified: trunk/hw/eccmemctl.c =================================================================== --- trunk/hw/eccmemctl.c 2008-12-23 15:06:35 UTC (rev 6123) +++ trunk/hw/eccmemctl.c 2008-12-23 15:08:13 UTC (rev 6124) @@ -40,6 +40,10 @@ * SMC (version 0, implementation 2) SS-10SX and SS-20 */ +#define ECC_MCC 0x00000000 +#define ECC_EMC 0x10000000 +#define ECC_SMC 0x20000000 + /* Register indexes */ #define ECC_MER 0 /* Memory Enable Register */ #define ECC_MDR 1 /* Memory Delay Register */ @@ -63,12 +67,15 @@ #define ECC_MER_MRR5 0x00000080 /* SIMM 5 */ #define ECC_MER_MRR6 0x00000100 /* SIMM 6 */ #define ECC_MER_MRR7 0x00000200 /* SIMM 7 */ -#define ECC_MER_REU 0x00000200 /* Memory Refresh Enable (600MP) */ +#define ECC_MER_REU 0x00000100 /* Memory Refresh Enable (600MP) */ #define ECC_MER_MRR 0x000003fc /* MRR mask */ -#define ECC_MEM_A 0x00000400 /* Memory controller addr map select */ +#define ECC_MER_A 0x00000400 /* Memory controller addr map select */ #define ECC_MER_DCI 0x00000800 /* Disables Coherent Invalidate ACK */ #define ECC_MER_VER 0x0f000000 /* Version */ #define ECC_MER_IMPL 0xf0000000 /* Implementation */ +#define ECC_MER_MASK_0 0x00000103 /* Version 0 (MCC) mask */ +#define ECC_MER_MASK_1 0x00000bff /* Version 1 (EMC) mask */ +#define ECC_MER_MASK_2 0x00000bff /* Version 2 (SMC) mask */ /* ECC memory delay register */ #define ECC_MDR_RRI 0x000003ff /* Refresh Request Interval */ @@ -122,6 +129,7 @@ qemu_irq irq; uint32_t regs[ECC_NREGS]; uint8_t diag[ECC_DIAG_SIZE]; + uint32_t version; } ECCState; static void ecc_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) @@ -130,8 +138,12 @@ switch (addr >> 2) { case ECC_MER: - s->regs[ECC_MER] = (s->regs[ECC_MER] & (ECC_MER_VER | ECC_MER_IMPL)) | - (val & ~(ECC_MER_VER | ECC_MER_IMPL)); + if (s->version == ECC_MCC) + s->regs[ECC_MER] = (val & ECC_MER_MASK_0); + else if (s->version == ECC_EMC) + s->regs[ECC_MER] = s->version | (val & ECC_MER_MASK_1); + else if (s->version == ECC_SMC) + s->regs[ECC_MER] = s->version | (val & ECC_MER_MASK_2); DPRINTF("Write memory enable %08x\n", val); break; case ECC_MDR: @@ -140,6 +152,7 @@ break; case ECC_MFSR: s->regs[ECC_MFSR] = val; + qemu_irq_lower(s->irq); DPRINTF("Write memory fault status %08x\n", val); break; case ECC_VCR: @@ -148,7 +161,7 @@ break; case ECC_DR: s->regs[ECC_DR] = val; - DPRINTF("Write diagnosiic %08x\n", val); + DPRINTF("Write diagnostic %08x\n", val); break; case ECC_ECR0: s->regs[ECC_ECR0] = val; @@ -254,7 +267,7 @@ ECCState *s = opaque; int i; - if (version_id != 2) + if (version_id != 3) return -EINVAL; for (i = 0; i < ECC_NREGS; i++) @@ -263,6 +276,8 @@ for (i = 0; i < ECC_DIAG_SIZE; i++) qemu_get_8s(f, &s->diag[i]); + qemu_get_be32s(f, &s->version); + return 0; } @@ -276,14 +291,19 @@ for (i = 0; i < ECC_DIAG_SIZE; i++) qemu_put_8s(f, &s->diag[i]); + + qemu_put_be32s(f, &s->version); } static void ecc_reset(void *opaque) { ECCState *s = opaque; - s->regs[ECC_MER] &= (ECC_MER_VER | ECC_MER_IMPL); - s->regs[ECC_MER] |= ECC_MER_MRR; + if (s->version == ECC_MCC) + s->regs[ECC_MER] &= ECC_MER_REU; + else + s->regs[ECC_MER] &= (ECC_MER_VER | ECC_MER_IMPL | ECC_MER_MRR | + ECC_MER_DCI); s->regs[ECC_MDR] = 0x20; s->regs[ECC_MFSR] = 0; s->regs[ECC_VCR] = 0; @@ -303,18 +323,19 @@ if (!s) return NULL; + s->version = version; s->regs[0] = version; s->irq = irq; ecc_io_memory = cpu_register_io_memory(0, ecc_mem_read, ecc_mem_write, s); cpu_register_physical_memory(base, ECC_SIZE, ecc_io_memory); - if (version == 0) { // SS-600MP only + if (version == ECC_MCC) { // SS-600MP only ecc_io_memory = cpu_register_io_memory(0, ecc_diag_mem_read, ecc_diag_mem_write, s); cpu_register_physical_memory(base + 0x1000, ECC_DIAG_SIZE, ecc_io_memory); } - register_savevm("ECC", base, 2, ecc_save, ecc_load, s); + register_savevm("ECC", base, 3, ecc_save, ecc_load, s); qemu_register_reset(ecc_reset, s); ecc_reset(s); return s;