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 | { |