Commit b319feb72d1aba5141f86bec46942ee34e53897e
1 parent
0fd3ca30
sh4: Add R2D-PLUS FPGA support.
This adds trivial support for the R2D-PLUS FPGA, mostly just for the versioning information that the kernel uses for IRL mappings, in addition to handling the heartbeat and poweroff writes. Signed-off-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5134 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
111 additions
and
0 deletions
hw/r2d.c
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | * Renesas SH7751R R2D-PLUS emulation | 2 | * Renesas SH7751R R2D-PLUS emulation |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2007 Magnus Damm | 4 | * Copyright (c) 2007 Magnus Damm |
| 5 | + * Copyright (c) 2008 Paul Mundt | ||
| 5 | * | 6 | * |
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy | 7 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 7 | * of this software and associated documentation files (the "Software"), to deal | 8 | * of this software and associated documentation files (the "Software"), to deal |
| @@ -26,10 +27,119 @@ | @@ -26,10 +27,119 @@ | ||
| 26 | #include "sh.h" | 27 | #include "sh.h" |
| 27 | #include "sysemu.h" | 28 | #include "sysemu.h" |
| 28 | #include "boards.h" | 29 | #include "boards.h" |
| 30 | +#include "assert.h" | ||
| 29 | 31 | ||
| 30 | #define SDRAM_BASE 0x0c000000 /* Physical location of SDRAM: Area 3 */ | 32 | #define SDRAM_BASE 0x0c000000 /* Physical location of SDRAM: Area 3 */ |
| 31 | #define SDRAM_SIZE 0x04000000 | 33 | #define SDRAM_SIZE 0x04000000 |
| 32 | 34 | ||
| 35 | +#define PA_POWOFF 0x30 | ||
| 36 | +#define PA_VERREG 0x32 | ||
| 37 | +#define PA_OUTPORT 0x36 | ||
| 38 | + | ||
| 39 | +typedef struct { | ||
| 40 | + target_phys_addr_t base; | ||
| 41 | + | ||
| 42 | + uint16_t bcr; | ||
| 43 | + uint16_t irlmon; | ||
| 44 | + uint16_t cfctl; | ||
| 45 | + uint16_t cfpow; | ||
| 46 | + uint16_t dispctl; | ||
| 47 | + uint16_t sdmpow; | ||
| 48 | + uint16_t rtcce; | ||
| 49 | + uint16_t pcicd; | ||
| 50 | + uint16_t voyagerrts; | ||
| 51 | + uint16_t cfrst; | ||
| 52 | + uint16_t admrts; | ||
| 53 | + uint16_t extrst; | ||
| 54 | + uint16_t cfcdintclr; | ||
| 55 | + uint16_t keyctlclr; | ||
| 56 | + uint16_t pad0; | ||
| 57 | + uint16_t pad1; | ||
| 58 | + uint16_t powoff; | ||
| 59 | + uint16_t verreg; | ||
| 60 | + uint16_t inport; | ||
| 61 | + uint16_t outport; | ||
| 62 | + uint16_t bverreg; | ||
| 63 | +} r2d_fpga_t; | ||
| 64 | + | ||
| 65 | +static uint32_t r2d_fpga_read(void *opaque, target_phys_addr_t addr) | ||
| 66 | +{ | ||
| 67 | + r2d_fpga_t *s = opaque; | ||
| 68 | + | ||
| 69 | + addr -= s->base; | ||
| 70 | + | ||
| 71 | + switch (addr) { | ||
| 72 | + case PA_OUTPORT: | ||
| 73 | + return s->outport; | ||
| 74 | + case PA_POWOFF: | ||
| 75 | + return s->powoff; | ||
| 76 | + case PA_VERREG: | ||
| 77 | + return 0x10; | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + return 0; | ||
| 81 | +} | ||
| 82 | + | ||
| 83 | +static void | ||
| 84 | +r2d_fpga_write(void *opaque, target_phys_addr_t addr, uint32_t value) | ||
| 85 | +{ | ||
| 86 | + r2d_fpga_t *s = opaque; | ||
| 87 | + | ||
| 88 | + addr -= s->base; | ||
| 89 | + | ||
| 90 | + switch (addr) { | ||
| 91 | + case PA_OUTPORT: | ||
| 92 | + s->outport = value; | ||
| 93 | + break; | ||
| 94 | + case PA_POWOFF: | ||
| 95 | + s->powoff = value; | ||
| 96 | + break; | ||
| 97 | + case PA_VERREG: | ||
| 98 | + /* Discard writes */ | ||
| 99 | + break; | ||
| 100 | + } | ||
| 101 | +} | ||
| 102 | + | ||
| 103 | +static uint32_t invalid_read(void *opaque, target_phys_addr_t addr) | ||
| 104 | +{ | ||
| 105 | + assert(0); | ||
| 106 | + | ||
| 107 | + return 0; | ||
| 108 | +} | ||
| 109 | + | ||
| 110 | +static void invalid_write(void *opaque, target_phys_addr_t addr, | ||
| 111 | + uint32_t mem_value) | ||
| 112 | +{ | ||
| 113 | + assert(0); | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | +static CPUReadMemoryFunc *r2d_fpga_readfn[] = { | ||
| 117 | + r2d_fpga_read, | ||
| 118 | + r2d_fpga_read, | ||
| 119 | + invalid_read, | ||
| 120 | +}; | ||
| 121 | + | ||
| 122 | +static CPUWriteMemoryFunc *r2d_fpga_writefn[] = { | ||
| 123 | + r2d_fpga_write, | ||
| 124 | + r2d_fpga_write, | ||
| 125 | + invalid_write, | ||
| 126 | +}; | ||
| 127 | + | ||
| 128 | +static void r2d_fpga_init(target_phys_addr_t base) | ||
| 129 | +{ | ||
| 130 | + int iomemtype; | ||
| 131 | + r2d_fpga_t *s; | ||
| 132 | + | ||
| 133 | + s = qemu_mallocz(sizeof(r2d_fpga_t)); | ||
| 134 | + if (!s) | ||
| 135 | + return; | ||
| 136 | + | ||
| 137 | + s->base = base; | ||
| 138 | + iomemtype = cpu_register_io_memory(0, r2d_fpga_readfn, | ||
| 139 | + r2d_fpga_writefn, s); | ||
| 140 | + cpu_register_physical_memory(base, 0x40, iomemtype); | ||
| 141 | +} | ||
| 142 | + | ||
| 33 | static void r2d_init(ram_addr_t ram_size, int vga_ram_size, | 143 | static void r2d_init(ram_addr_t ram_size, int vga_ram_size, |
| 34 | const char *boot_device, DisplayState * ds, | 144 | const char *boot_device, DisplayState * ds, |
| 35 | const char *kernel_filename, const char *kernel_cmdline, | 145 | const char *kernel_filename, const char *kernel_cmdline, |
| @@ -50,6 +160,7 @@ static void r2d_init(ram_addr_t ram_size, int vga_ram_size, | @@ -50,6 +160,7 @@ static void r2d_init(ram_addr_t ram_size, int vga_ram_size, | ||
| 50 | /* Allocate memory space */ | 160 | /* Allocate memory space */ |
| 51 | cpu_register_physical_memory(SDRAM_BASE, SDRAM_SIZE, 0); | 161 | cpu_register_physical_memory(SDRAM_BASE, SDRAM_SIZE, 0); |
| 52 | /* Register peripherals */ | 162 | /* Register peripherals */ |
| 163 | + r2d_fpga_init(0x04000000); | ||
| 53 | s = sh7750_init(env); | 164 | s = sh7750_init(env); |
| 54 | /* Todo: register on board registers */ | 165 | /* Todo: register on board registers */ |
| 55 | { | 166 | { |