67 #define SH4_REG_BASE 0xff000000 68 #define SH4_TICK_SHIFT 14 69 #define N_SH4_TIMERS 3 72 #define N_PCIC_REGS (0x224 / sizeof(uint32_t)) 73 #define N_PCIC_IRQS 16 74 #define PCIC_REG(addr) ((addr - SH4_PCIC) / sizeof(uint32_t)) 75 #define PCI_VENDOR_HITACHI 0x1054 76 #define PCI_PRODUCT_HITACHI_SH7751 0x3505 77 #define PCI_PRODUCT_HITACHI_SH7751R 0x350e 79 #define SCIF_TX_FIFO_SIZE 16 80 #define SCIF_DELAYED_TX_VALUE 2 88 #define SH4_CPG_FRQCR 0xffc00000 89 #define SH4_CPG_STBCR 0xffc00004 90 #define SH4_CPG_WTCNT 0xffc00008 91 #define SH4_CPG_WTCSR 0xffc0000c 92 #define SH4_CPG_STBCR2 0xffc00010 175 #define SH4_PSEUDO_TIMER_HZ 110.0 187 static void sh4_timer_tick(
struct timer *t,
void *
extra)
195 fatal(
"sh4: RTCSR_CMIE | RTCSR_OVIE: TODO\n");
202 int32_t old = d->
tcnt[i];
215 if ((int32_t)d->
tcnt[i] < 0 && old >= 0) {
230 if ((int32_t)d->
tcnt[i] < 0)
242 static void sh4_pcic_interrupt_deassert(
struct interrupt *interrupt)
249 static void scif_reassert_interrupts(
struct sh4_data *d)
304 scif_reassert_interrupts(d);
325 uint32_t sar = cpu->
cd.
sh.
dmac_sar[channel] & 0x1fffffff;
326 uint32_t dar = cpu->
cd.
sh.
dmac_dar[channel] & 0x1fffffff;
327 uint32_t count = cpu->
cd.
sh.
dmac_tcr[channel] & 0x1fffffff;
329 int transmit_size = 1;
330 int src_delta = 0, dst_delta = 0;
331 int cause_interrupt = chcr &
CHCR_IE;
351 default:
fatal(
"Unimplemented transmit size?! CHCR[%i] = 0x%08x\n",
360 default:
fatal(
"Unimplemented destination delta?! CHCR[%i] = 0x%08x\n",
369 default:
fatal(
"Unimplemented source delta?! CHCR[%i] = 0x%08x\n",
374 src_delta *= transmit_size;
375 dst_delta *= transmit_size;
378 fatal(
"|SH4 DMA transfer, channel %i\n", channel);
379 fatal(
"|Source addr: 0x%08x (delta %i)\n", (
int) sar, src_delta);
380 fatal(
"|Destination addr: 0x%08x (delta %i)\n", (
int) dar, dst_delta);
381 fatal(
"|Count: 0x%08x\n", (
int) count);
382 fatal(
"|Transmit size: 0x%08x\n", (
int) transmit_size);
383 fatal(
"|Interrupt: %s\n", cause_interrupt?
"yes" :
"no");
401 default:
fatal(
"Unimplemented SH4 RS DMAC: 0x%08x\n",
402 (
int) (chcr & CHCR_RS));
406 if (cause_interrupt) {
407 fatal(
"TODO: sh4 dmac interrupt!\n");
428 int writeflag = cmd & 0x40? 0 : 1;
429 int address_transfer;
434 fatal(
"SCI cmd bit 7 not set? TODO\n");
438 if ((cmd & 0x30) == 0x20)
439 address_transfer = 1;
440 else if ((cmd & 0x30) == 0x10)
441 address_transfer = 0;
443 fatal(
"SCI: Neither data nor address transfer? TODO\n");
447 if (address_transfer)
457 debug(
"[ SCI: read addr=%x data=%x ]\n",
464 if (data_byte & 0x80)
468 if (writeflag && !address_transfer) {
470 uint8_t data_byte = cmd & 0x0f;
472 debug(
"[ SCI: write addr=%x data=%x ]\n",
488 static uint8_t sh4_sci_access(
struct sh4_data *d,
struct cpu *cpu,
489 int writeflag, uint8_t input)
545 uint64_t idata = 0, odata = 0;
549 int safe_to_invalidate = 0;
552 safe_to_invalidate = 1;
568 if (safe_to_invalidate)
591 uint64_t idata = 0, odata = 0;
594 if (relative_addr & 0x800000) {
595 fatal(
"sh4_itlb_da1: TODO: da2 area\n");
601 int safe_to_invalidate = 0;
603 safe_to_invalidate = 1;
614 if (safe_to_invalidate)
633 uint64_t idata = 0, odata = 0;
639 int safe_to_invalidate = 0;
640 uint32_t vaddr_to_invalidate = 0;
646 uint32_t mask = 0xfffff000;
669 if ((hi & mask) != (idata & mask))
672 if ((lo & SH4_PTEL_SZ_MASK) ==
674 safe_to_invalidate = 1;
675 vaddr_to_invalidate = hi & mask;
679 (cpu->
cd.
sh.
pteh & SH4_PTEH_ASID_MASK))
710 safe_to_invalidate = 1;
711 vaddr_to_invalidate =
727 if (safe_to_invalidate)
751 uint64_t idata = 0, odata = 0;
754 if (relative_addr & 0x800000) {
755 fatal(
"sh4_utlb_da1: TODO: da2 area\n");
761 int safe_to_invalidate = 0;
763 safe_to_invalidate = 1;
774 if (safe_to_invalidate)
794 uint64_t idata = 0, odata = 0;
809 switch (relative_addr) {
813 fatal(
"[ sh4_pcic: TODO: Write to SH4_PCICONF0? ]\n");
824 fatal(
"sh4_pcic: TODO: PCICONF0 read for" 825 " unimplemented CPU type?\n");
845 if (writeflag ==
MEM_WRITE && idata != 0xac000000) {
846 fatal(
"sh4_pcic: SH4_PCICONF5 unknown value" 847 " 0x%" PRIx32
"\n", (uint32_t) idata);
854 if (writeflag ==
MEM_WRITE && idata != 0x8c000000) {
855 fatal(
"sh4_pcic: SH4_PCICONF6 unknown value" 856 " 0x%" PRIx32
"\n", (uint32_t) idata);
863 if (writeflag ==
MEM_WRITE && idata != ((64 - 1) << 20)) {
864 fatal(
"sh4_pcic: SH4_PCILSR0 unknown value" 865 " 0x%" PRIx32
"\n", (uint32_t) idata);
872 if (writeflag ==
MEM_WRITE && idata != 0xac000000) {
873 fatal(
"sh4_pcic: SH4_PCILAR0 unknown value" 874 " 0x%" PRIx32
"\n", (uint32_t) idata);
881 if (writeflag ==
MEM_WRITE && idata != ((64 - 1) << 20)) {
882 fatal(
"sh4_pcic: SH4_PCILSR1 unknown value" 883 " 0x%" PRIx32
"\n", (uint32_t) idata);
890 if (writeflag ==
MEM_WRITE && idata != 0xac000000) {
891 fatal(
"sh4_pcic: SH4_PCILAR1 unknown value" 892 " 0x%" PRIx32
"\n", (uint32_t) idata);
899 fatal(
"sh4_pcic: PCIMBR set to 0x%" PRIx32
", not" 900 " 0x%" PRIx32
"? TODO\n", (uint32_t) idata,
908 fatal(
"sh4_pcic: PCIIOBR set to 0x%" PRIx32
", not" 909 " 0x%" PRIx32
"? TODO\n", (uint32_t) idata,
918 int bus = (idata >> 16) & 0xff;
919 int dev = (idata >> 11) & 0x1f;
920 int func = (idata >> 8) & 7;
921 int reg = idata & 0xff;
929 &odata : &idata, len, writeflag);
932 default:
if (writeflag ==
MEM_READ) {
933 fatal(
"[ sh4_pcic: read from addr 0x%x: TODO ]\n",
936 fatal(
"[ sh4_pcic: write to addr 0x%x: 0x%x: TODO ]\n",
937 (
int)relative_addr, (
int)idata);
955 for (i=0; i<len; i++)
956 d->
sq[(relative_addr + i) %
sizeof(d->
sq)] =
data[i];
958 for (i=0; i<len; i++)
959 data[i] = d->
sq[(relative_addr + i) %
sizeof(d->
sq)];
969 uint64_t idata = 0, odata = 0;
970 int timer_nr = 0, dma_channel = 0;
978 if (relative_addr >= 0xff900000 && relative_addr <= 0xff97ffff) {
980 int v = (relative_addr >> 2) & 0xffff;
981 if (relative_addr & 0x00040000)
985 debug(
"[ sh4: sdmr%i set to 0x%04" PRIx16
" ]\n",
986 relative_addr & 0x00040000? 3 : 2, v);
991 switch (relative_addr) {
1007 unsigned int old_asid = cpu->
cd.
sh.
pteh 1070 idata &= ~SH4_MMUCR_TI;
1150 fatal(
"[ sh4 timer: TCOE not yet " 1162 if (idata & 1 && !(d->
tstr & 1))
1163 debug(
"[ sh4 timer: starting timer 0 ]\n");
1164 if (idata & 2 && !(d->
tstr & 2))
1165 debug(
"[ sh4 timer: starting timer 1 ]\n");
1166 if (idata & 4 && !(d->
tstr & 4))
1167 debug(
"[ sh4 timer: starting timer 2 ]\n");
1168 if (!(idata & 1) && d->
tstr & 1)
1169 debug(
"[ sh4 timer: stopping timer 0 ]\n");
1170 if (!(idata & 2) && d->
tstr & 2)
1171 debug(
"[ sh4 timer: stopping timer 1 ]\n");
1172 if (!(idata & 4) && d->
tstr & 4)
1173 debug(
"[ sh4 timer: stopping timer 2 ]\n");
1185 odata = d->
tcor[timer_nr];
1187 d->
tcor[timer_nr] = idata;
1197 odata = d->
tcnt[timer_nr];
1199 d->
tcnt[timer_nr] = idata;
1209 odata = d->
tcr[timer_nr];
1212 fatal(
"INTERNAL ERROR: pclock must be set" 1213 " for this machine. Aborting.\n");
1217 switch (idata & 3) {
1232 debug(
"[ sh4 timer %i clock set to %f Hz ]\n",
1237 fatal(
"Unimplemented SH4 timer control" 1238 " bits: 0x%08" PRIx32
". Aborting.\n",
1250 d->
tcr[timer_nr] = idata;
1299 if (idata & ~0x00ffffff) {
1300 fatal(
"[ SH4 DMA: Attempt to set top 8 " 1301 "bits of the count register? 0x%08" 1302 PRIx32
" ]\n", (uint32_t) idata);
1356 if (len !=
sizeof(uint16_t)) {
1357 fatal(
"Non-16-bit SH4_BCR2 access?\n");
1389 d->
bsc_mcr = idata & 0xf8bbffff;
1409 idata = (idata & ~RTCSR_CMF)
1458 if ((idata & 1) == 0 || (idata & 2) == 0)
1479 debug(
"[ sh4: pdtrb: write: TODO ]\n");
1482 debug(
"[ sh4: pdtrb: read: TODO ]\n");
1499 odata = sh4_sci_access(d, cpu,
1523 fatal(
"SH4 INTC: IRLM not yet " 1524 "supported. TODO\n");
1653 scif_reassert_interrupts(d);
1664 fatal(
"[ SCIF TX fifo overrun! ]\n");
1678 scif_reassert_interrupts(d);
1687 odata = x < 0? 0 : x;
1692 scif_reassert_interrupts(d);
1775 d->
rtc_reg[(relative_addr - 0xffc80000) / 4] = idata;
1778 odata = d->
rtc_reg[(relative_addr - 0xffc80000) / 4];
1788 fatal(
"SH4: TODO: RTC interrupt enable\n");
1800 if (idata != 0x02) {
1801 debug(
"[ SH4: TODO: RTC RCR2 value 0x%02x ignored. ]\n", (
int)idata);
1809 default:
if (writeflag ==
MEM_READ) {
1810 fatal(
"[ sh4: read from addr 0x%x ]\n",
1811 (
int)relative_addr);
1813 fatal(
"[ sh4: write to addr 0x%x: 0x%x ]\n",
1814 (
int)relative_addr, (
int)idata);
1831 char tmp[200], n[200];
1837 memset(d, 0,
sizeof(
struct sh4_data));
1852 0xe0000000, 0x04000000, dev_sh4_sq_access, d,
DM_DEFAULT, NULL);
1862 snprintf(tmp,
sizeof(tmp),
"%s.irq[0x%x]",
1865 snprintf(tmp,
sizeof(tmp),
"%s.irq[0x%x]",
1888 0x01000000, dev_sh4_itlb_aa_access, d,
DM_DEFAULT, NULL);
1892 0x01000000, dev_sh4_itlb_da1_access, d,
DM_DEFAULT, NULL);
1896 0x01000000, dev_sh4_utlb_aa_access, d,
DM_DEFAULT, NULL);
1900 0x01000000, dev_sh4_utlb_da1_access, d,
DM_DEFAULT, NULL);
1908 N_PCIC_REGS *
sizeof(uint32_t), dev_sh4_pcic_access, d,
1918 struct interrupt templ;
1919 snprintf(n,
sizeof(n),
"%s.pcic.%i",
1921 memset(&templ, 0,
sizeof(templ));
1929 snprintf(tmp,
sizeof(tmp),
"%s.irq[0x%x]",
1962 d->
tcor[0] = 0xffffffff; d->
tcnt[0] = 0xffffffff;
1963 d->
tcor[1] = 0xffffffff; d->
tcnt[1] = 0xffffffff;
1964 d->
tcor[2] = 0xffffffff; d->
tcnt[2] = 0xffffffff;
1966 snprintf(tmp,
sizeof(tmp),
"machine[0].cpu[0].irq[0x%x]",
1969 fatal(
"Could not find interrupt '%s'.\n", tmp);
1972 snprintf(tmp,
sizeof(tmp),
"machine[0].cpu[0].irq[0x%x]",
1975 fatal(
"Could not find interrupt '%s'.\n", tmp);
1978 snprintf(tmp,
sizeof(tmp),
"machine[0].cpu[0].irq[0x%x]",
1981 fatal(
"Could not find interrupt '%s'.\n", tmp);
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
#define BCR1_LITTLE_ENDIAN
void fatal(const char *fmt,...)
#define SH4_ITLB_AA_VPN_MASK
#define SH4_ITLB_AA_ASID_MASK
void(* interrupt_assert)(struct interrupt *)
#define SH_N_UTLB_ENTRIES
#define SH4_PTEH_VPN_MASK
DEVICE_ACCESS(sh4_itlb_aa)
#define SH4_INTEVT_SCIF_RXI
#define SH4_INTEVT_SCIF_TXI
uint32_t dmac_sar[N_SH4_DMA_CHANNELS]
void interrupt_handler_register(struct interrupt *templ)
void sh_update_interrupt_priorities(struct cpu *cpu)
void(* interrupt_deassert)(struct interrupt *)
#define PCI_PRODUCT_HITACHI_SH7751R
#define PCI_SUBCLASS_BRIDGE_HOST
struct interrupt cpu_pcic_interrupt[N_PCIC_IRQS]
void sh4_dmac_transfer(struct cpu *cpu, struct sh4_data *d, int channel)
#define PCI_ID_CODE(vid, pid)
#define SH4_UTLB_AA_ASID_MASK
void console_putchar(int handle, int ch)
int console_readchar(int handle)
void sh_exception(struct cpu *cpu, int expevt, int intevt, uint32_t vaddr)
#define SH4_UTLB_AA_VPN_MASK
#define SH4_PTEH_ASID_MASK
int interrupt_handler_lookup(const char *name, struct interrupt *templ)
#define EMUL_LITTLE_ENDIAN
struct interrupt scif_tx_irq
#define CHECK_ALLOCATION(ptr)
#define EXPEVT_RESET_TLB_MULTI_HIT
#define SH_N_ITLB_ENTRIES
uint32_t itlb_lo[SH_N_ITLB_ENTRIES]
int console_charavail(int handle)
struct pci_data * pci_data
void bus_pci_setaddr(struct cpu *cpu, struct pci_data *pci_data, int bus, int device, int function, int reg)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
#define SCIF_TX_FIFO_SIZE
#define SH_INTEVT_TMU0_TUNI0
uint32_t utlb_hi[SH_N_UTLB_ENTRIES]
struct interrupt scif_rx_irq
uint32_t dmac_chcr[N_SH4_DMA_CHANNELS]
struct timer * timer_add(double freq, void(*timer_tick)(struct timer *timer, void *extra), void *extra)
void dev_ram_init(struct machine *machine, uint64_t baseaddr, uint64_t length, int mode, uint64_t otheraddress, const char *name)
#define SH_INTEVT_TMU2_TUNI2
#define INTERRUPT_ASSERT(istruct)
uint8_t scif_tx_fifo[SCIF_TX_FIFO_SIZE+1]
struct interrupt timer_irq[4]
uint32_t tcnt[N_SH4_TIMERS]
int timer_interrupts_pending[N_SH4_TIMERS]
struct sh_cpu_type_def cpu_type
#define CHCR_SM_DECREMENTED
#define PCI_CLASS_CODE(mainclass, subclass, interface)
uint32_t pcic_reg[N_PCIC_REGS]
#define INTERRUPT_CONNECT(name, istruct)
uint32_t dmac_dar[N_SH4_DMA_CHANNELS]
#define SCIF_DELAYED_TX_VALUE
uint32_t dmac_tcr[N_SH4_DMA_CHANNELS]
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
int console_start_slave(struct machine *machine, const char *consolename, int use_for_input)
#define CHCR_DM_DECREMENTED
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
uint32_t itlb_hi[SH_N_ITLB_ENTRIES]
#define PCI_PRODUCT_HITACHI_SH7751
double timer_hz[N_SH4_TIMERS]
struct pci_data * bus_pci_init(struct machine *machine, const char *irq_path, uint64_t pci_actual_io_offset, uint64_t pci_actual_mem_offset, uint64_t pci_portbase, uint64_t pci_membase, const char *pci_irqbase, uint64_t isa_portbase, uint64_t isa_membase, const char *isa_irqbase)
addr & if(addr >=0x24 &&page !=NULL)
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
uint32_t tcr[N_SH4_TIMERS]
#define CHCR_DM_INCREMENTED
#define CHCR_SM_INCREMENTED
void bus_pci_data_access(struct cpu *cpu, struct pci_data *pci_data, uint64_t *data, int len, int writeflag)
#define SH4_PSEUDO_TIMER_HZ
uint32_t utlb_lo[SH_N_UTLB_ENTRIES]
#define PCI_VENDOR_HITACHI
size_t scif_tx_fifo_cursize
#define SH_INTEVT_TMU1_TUNI1
uint32_t tcor[N_SH4_TIMERS]
void(* invalidate_translation_caches)(struct cpu *, uint64_t paddr, int flags)
#define INTERRUPT_DEASSERT(istruct)