nkeynes@30: /** nkeynes@323: * $Id: sh4mmio.c,v 1.11 2007-01-25 08:21:56 nkeynes Exp $ nkeynes@30: * nkeynes@30: * Miscellaneous and not-really-implemented SH4 peripheral modules. Also nkeynes@30: * responsible for including the IMPL side of the SH4 MMIO pages. nkeynes@30: * Most of these will eventually be split off into their own files. nkeynes@30: * nkeynes@30: * Copyright (c) 2005 Nathan Keynes. nkeynes@30: * nkeynes@30: * This program is free software; you can redistribute it and/or modify nkeynes@30: * it under the terms of the GNU General Public License as published by nkeynes@30: * the Free Software Foundation; either version 2 of the License, or nkeynes@30: * (at your option) any later version. nkeynes@30: * nkeynes@30: * This program is distributed in the hope that it will be useful, nkeynes@30: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@30: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@30: * GNU General Public License for more details. nkeynes@30: */ nkeynes@35: #define MODULE sh4_module nkeynes@30: nkeynes@1: #include "dream.h" nkeynes@1: #include "mem.h" nkeynes@19: #include "clock.h" nkeynes@1: #include "sh4core.h" nkeynes@1: #include "sh4mmio.h" nkeynes@1: #define MMIO_IMPL nkeynes@1: #include "sh4mmio.h" nkeynes@1: nkeynes@1: /********************************* MMU *************************************/ nkeynes@1: nkeynes@92: MMIO_REGION_READ_DEFFN( MMU ) nkeynes@1: nkeynes@10: #define OCRAM_START (0x1C000000>>PAGE_BITS) nkeynes@10: #define OCRAM_END (0x20000000>>PAGE_BITS) nkeynes@10: nkeynes@10: static char *cache = NULL; nkeynes@10: nkeynes@1: void mmio_region_MMU_write( uint32_t reg, uint32_t val ) nkeynes@1: { nkeynes@1: switch(reg) { nkeynes@1: case CCR: nkeynes@10: mmu_set_cache_mode( val & (CCR_OIX|CCR_ORA) ); nkeynes@1: break; nkeynes@1: default: nkeynes@1: break; nkeynes@1: } nkeynes@1: MMIO_WRITE( MMU, reg, val ); nkeynes@1: } nkeynes@1: nkeynes@1: nkeynes@312: void MMU_init() nkeynes@10: { nkeynes@19: cache = mem_alloc_pages(2); nkeynes@10: } nkeynes@10: nkeynes@312: void MMU_reset() nkeynes@312: { nkeynes@312: mmio_region_MMU_write( CCR, 0 ); nkeynes@312: } nkeynes@312: nkeynes@312: void MMU_save_state( FILE *f ) nkeynes@312: { nkeynes@312: fwrite( cache, 4096, 2, f ); nkeynes@312: } nkeynes@312: nkeynes@312: int MMU_load_state( FILE *f ) nkeynes@312: { nkeynes@312: /* Setup the cache mode according to the saved register value nkeynes@312: * (mem_load runs before this point to load all MMIO data) nkeynes@312: */ nkeynes@312: mmio_region_MMU_write( CCR, MMIO_READ(MMU, CCR) ); nkeynes@312: if( fread( cache, 4096, 2, f ) != 2 ) { nkeynes@312: return 1; nkeynes@312: } nkeynes@312: return 0; nkeynes@312: } nkeynes@312: nkeynes@10: void mmu_set_cache_mode( int mode ) nkeynes@10: { nkeynes@10: uint32_t i; nkeynes@10: switch( mode ) { nkeynes@10: case MEM_OC_INDEX0: /* OIX=0 */ nkeynes@10: for( i=OCRAM_START; i>(25-PAGE_BITS)); nkeynes@10: break; nkeynes@10: default: /* disabled */ nkeynes@10: for( i=OCRAM_START; i> (i<<1)) & 0x03; nkeynes@323: if( bits == 2 ) input_mask |= (1<> (i<<1)) & 0x03; nkeynes@323: if( bits == 2 ) input_mask |= (1<>16) & input_mask) | output; nkeynes@323: nkeynes@1: } nkeynes@1: nkeynes@323: MMIO_REGION_WRITE_STUBFN(BSC) nkeynes@323: nkeynes@1: int32_t mmio_region_BSC_read( uint32_t reg ) nkeynes@1: { nkeynes@1: int32_t val; nkeynes@323: int i; nkeynes@1: switch( reg ) { nkeynes@1: case PDTRA: nkeynes@323: val = bsc_read_pdtra(); nkeynes@323: break; nkeynes@1: case PDTRB: nkeynes@323: val = bsc_read_pdtrb(); nkeynes@323: break; nkeynes@1: default: nkeynes@1: val = MMIO_READ( BSC, reg ); nkeynes@1: } nkeynes@1: WARN( "Read from (mostly) unimplemented BSC (%03X => %08X) [%s: %s]", nkeynes@1: reg, val, MMIO_REGID(BSC,reg), MMIO_REGDESC(BSC,reg) ); nkeynes@1: return val; nkeynes@1: } nkeynes@1: nkeynes@1: /********************************* UBC *************************************/ nkeynes@1: nkeynes@1: MMIO_REGION_STUBFNS( UBC ) nkeynes@1: nkeynes@1: nkeynes@1: /********************************** SCI *************************************/ nkeynes@1: nkeynes@1: MMIO_REGION_STUBFNS( SCI ) nkeynes@1: