Commit a0a8793ebcca7f2ad071b3f95dec3c3dfe44354a
1 parent
6ea4a6c8
Impement Galilleo ISD register.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3061 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
72 additions
and
11 deletions
hw/gt64xxx.c
| @@ -225,13 +225,63 @@ typedef target_phys_addr_t pci_addr_t; | @@ -225,13 +225,63 @@ typedef target_phys_addr_t pci_addr_t; | ||
| 225 | 225 | ||
| 226 | typedef PCIHostState GT64120PCIState; | 226 | typedef PCIHostState GT64120PCIState; |
| 227 | 227 | ||
| 228 | +#define PCI_MAPPING_ENTRY(regname) \ | ||
| 229 | + target_phys_addr_t regname ##_start; \ | ||
| 230 | + target_phys_addr_t regname ##_length; \ | ||
| 231 | + int regname ##_handle | ||
| 232 | + | ||
| 228 | typedef struct GT64120State { | 233 | typedef struct GT64120State { |
| 229 | GT64120PCIState *pci; | 234 | GT64120PCIState *pci; |
| 230 | uint32_t regs[GT_REGS]; | 235 | uint32_t regs[GT_REGS]; |
| 231 | - target_phys_addr_t PCI0IO_start; | ||
| 232 | - target_phys_addr_t PCI0IO_length; | 236 | + PCI_MAPPING_ENTRY(PCI0IO); |
| 237 | + PCI_MAPPING_ENTRY(ISD); | ||
| 233 | } GT64120State; | 238 | } GT64120State; |
| 234 | 239 | ||
| 240 | +/* Adjust range to avoid touching space which isn't mappable via PCI */ | ||
| 241 | +/* XXX: Hardcoded values for Malta: 0x1e000000 - 0x1f100000 | ||
| 242 | + 0x1fc00000 - 0x1fd00000 */ | ||
| 243 | +static void check_reserved_space (target_phys_addr_t *start, | ||
| 244 | + target_phys_addr_t *length) | ||
| 245 | +{ | ||
| 246 | + target_phys_addr_t begin = *start; | ||
| 247 | + target_phys_addr_t end = *start + *length; | ||
| 248 | + | ||
| 249 | + if (end >= 0x1e000000LL && end < 0x1f100000LL) | ||
| 250 | + end = 0x1e000000LL; | ||
| 251 | + if (begin >= 0x1e000000LL && begin < 0x1f100000LL) | ||
| 252 | + begin = 0x1f100000LL; | ||
| 253 | + if (end >= 0x1fc00000LL && end < 0x1fd00000LL) | ||
| 254 | + end = 0x1fc00000LL; | ||
| 255 | + if (begin >= 0x1fc00000LL && begin < 0x1fd00000LL) | ||
| 256 | + begin = 0x1fd00000LL; | ||
| 257 | + /* XXX: This is broken when a reserved range splits the requested range */ | ||
| 258 | + if (end >= 0x1f100000LL && begin < 0x1e000000LL) | ||
| 259 | + end = 0x1e000000LL; | ||
| 260 | + if (end >= 0x1fd00000LL && begin < 0x1fc00000LL) | ||
| 261 | + end = 0x1fc00000LL; | ||
| 262 | + | ||
| 263 | + *start = begin; | ||
| 264 | + *length = end - begin; | ||
| 265 | +} | ||
| 266 | + | ||
| 267 | +static void gt64120_isd_mapping(GT64120State *s) | ||
| 268 | +{ | ||
| 269 | + target_phys_addr_t start = s->regs[GT_ISD] << 21; | ||
| 270 | + target_phys_addr_t length = 0x1000; | ||
| 271 | + | ||
| 272 | + if (s->ISD_length) | ||
| 273 | + cpu_register_physical_memory(s->ISD_start, s->ISD_length, | ||
| 274 | + IO_MEM_UNASSIGNED); | ||
| 275 | + check_reserved_space(&start, &length); | ||
| 276 | + length = 0x1000; | ||
| 277 | + /* Map new address */ | ||
| 278 | + dprintf("ISD: %x@%x -> %x@%x, %x\n", s->ISD_length, s->ISD_start, | ||
| 279 | + length, start, s->ISD_handle); | ||
| 280 | + s->ISD_start = start; | ||
| 281 | + s->ISD_length = length; | ||
| 282 | + cpu_register_physical_memory(s->ISD_start, s->ISD_length, s->ISD_handle); | ||
| 283 | +} | ||
| 284 | + | ||
| 235 | static void gt64120_pci_mapping(GT64120State *s) | 285 | static void gt64120_pci_mapping(GT64120State *s) |
| 236 | { | 286 | { |
| 237 | /* Update IO mapping */ | 287 | /* Update IO mapping */ |
| @@ -311,6 +361,11 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, | @@ -311,6 +361,11 @@ static void gt64120_writel (void *opaque, target_phys_addr_t addr, | ||
| 311 | s->regs[saddr] = val & 0x0000007f; | 361 | s->regs[saddr] = val & 0x0000007f; |
| 312 | gt64120_pci_mapping(s); | 362 | gt64120_pci_mapping(s); |
| 313 | break; | 363 | break; |
| 364 | + case GT_ISD: | ||
| 365 | + s->regs[saddr] = val & 0x00007fff; | ||
| 366 | + gt64120_isd_mapping(s); | ||
| 367 | + break; | ||
| 368 | + | ||
| 314 | case GT_PCI0IOREMAP: | 369 | case GT_PCI0IOREMAP: |
| 315 | case GT_PCI0M0REMAP: | 370 | case GT_PCI0M0REMAP: |
| 316 | case GT_PCI0M1REMAP: | 371 | case GT_PCI0M1REMAP: |
| @@ -1026,6 +1081,7 @@ void gt64120_reset(void *opaque) | @@ -1026,6 +1081,7 @@ void gt64120_reset(void *opaque) | ||
| 1026 | 1081 | ||
| 1027 | /* Interrupt registers are all zeroed at reset */ | 1082 | /* Interrupt registers are all zeroed at reset */ |
| 1028 | 1083 | ||
| 1084 | + gt64120_isd_mapping(s); | ||
| 1029 | gt64120_pci_mapping(s); | 1085 | gt64120_pci_mapping(s); |
| 1030 | } | 1086 | } |
| 1031 | 1087 | ||
| @@ -1070,27 +1126,21 @@ PCIBus *pci_gt64120_init(qemu_irq *pic) | @@ -1070,27 +1126,21 @@ PCIBus *pci_gt64120_init(qemu_irq *pic) | ||
| 1070 | { | 1126 | { |
| 1071 | GT64120State *s; | 1127 | GT64120State *s; |
| 1072 | PCIDevice *d; | 1128 | PCIDevice *d; |
| 1073 | - int gt64120; | ||
| 1074 | 1129 | ||
| 1075 | s = qemu_mallocz(sizeof(GT64120State)); | 1130 | s = qemu_mallocz(sizeof(GT64120State)); |
| 1076 | s->pci = qemu_mallocz(sizeof(GT64120PCIState)); | 1131 | s->pci = qemu_mallocz(sizeof(GT64120PCIState)); |
| 1077 | - gt64120_reset(s); | ||
| 1078 | 1132 | ||
| 1079 | s->pci->bus = pci_register_bus(pci_gt64120_set_irq, pci_gt64120_map_irq, | 1133 | s->pci->bus = pci_register_bus(pci_gt64120_set_irq, pci_gt64120_map_irq, |
| 1080 | pic, 144, 4); | 1134 | pic, 144, 4); |
| 1081 | - | ||
| 1082 | - gt64120 = cpu_register_io_memory(0, gt64120_read, | ||
| 1083 | - gt64120_write, s); | ||
| 1084 | - cpu_register_physical_memory(0x1be00000LL, 0x1000, gt64120); | ||
| 1085 | - | 1135 | + s->ISD_handle = cpu_register_io_memory(0, gt64120_read, gt64120_write, s); |
| 1086 | d = pci_register_device(s->pci->bus, "GT64120 PCI Bus", sizeof(PCIDevice), | 1136 | d = pci_register_device(s->pci->bus, "GT64120 PCI Bus", sizeof(PCIDevice), |
| 1087 | 0, gt64120_read_config, gt64120_write_config); | 1137 | 0, gt64120_read_config, gt64120_write_config); |
| 1088 | 1138 | ||
| 1089 | /* FIXME: Malta specific hw assumptions ahead */ | 1139 | /* FIXME: Malta specific hw assumptions ahead */ |
| 1090 | 1140 | ||
| 1091 | - d->config[0x00] = 0xab; // vendor_id | 1141 | + d->config[0x00] = 0xab; /* vendor_id */ |
| 1092 | d->config[0x01] = 0x11; | 1142 | d->config[0x01] = 0x11; |
| 1093 | - d->config[0x02] = 0x20; // device_id | 1143 | + d->config[0x02] = 0x20; /* device_id */ |
| 1094 | d->config[0x03] = 0x46; | 1144 | d->config[0x03] = 0x46; |
| 1095 | 1145 | ||
| 1096 | d->config[0x04] = 0x00; | 1146 | d->config[0x04] = 0x00; |
| @@ -1113,6 +1163,8 @@ PCIBus *pci_gt64120_init(qemu_irq *pic) | @@ -1113,6 +1163,8 @@ PCIBus *pci_gt64120_init(qemu_irq *pic) | ||
| 1113 | d->config[0x27] = 0x14; | 1163 | d->config[0x27] = 0x14; |
| 1114 | d->config[0x3D] = 0x01; | 1164 | d->config[0x3D] = 0x01; |
| 1115 | 1165 | ||
| 1166 | + gt64120_reset(s); | ||
| 1167 | + | ||
| 1116 | register_savevm("GT64120 PCI Bus", 0, 1, gt64120_save, gt64120_load, d); | 1168 | register_savevm("GT64120 PCI Bus", 0, 1, gt64120_save, gt64120_load, d); |
| 1117 | 1169 | ||
| 1118 | return s->pci->bus; | 1170 | return s->pci->bus; |
hw/mips_malta.c
| @@ -538,6 +538,15 @@ static void write_bootloader (CPUState *env, unsigned long bios_offset, int64_t | @@ -538,6 +538,15 @@ static void write_bootloader (CPUState *env, unsigned long bios_offset, int64_t | ||
| 538 | stl_raw(p++, 0x34e70000 | (env->ram_size & 0xffff)); /* ori a3, a3, low(env->ram_size) */ | 538 | stl_raw(p++, 0x34e70000 | (env->ram_size & 0xffff)); /* ori a3, a3, low(env->ram_size) */ |
| 539 | 539 | ||
| 540 | /* Load BAR registers as done by YAMON */ | 540 | /* Load BAR registers as done by YAMON */ |
| 541 | + stl_raw(p++, 0x3c09b400); /* lui t1, 0xb400 */ | ||
| 542 | + | ||
| 543 | +#ifdef TARGET_WORDS_BIGENDIAN | ||
| 544 | + stl_raw(p++, 0x3c08df00); /* lui t0, 0xdf00 */ | ||
| 545 | +#else | ||
| 546 | + stl_raw(p++, 0x340800df); /* ori t0, r0, 0x00df */ | ||
| 547 | +#endif | ||
| 548 | + stl_raw(p++, 0xad280068); /* sw t0, 0x0068(t1) */ | ||
| 549 | + | ||
| 541 | stl_raw(p++, 0x3c09bbe0); /* lui t1, 0xbbe0 */ | 550 | stl_raw(p++, 0x3c09bbe0); /* lui t1, 0xbbe0 */ |
| 542 | 551 | ||
| 543 | #ifdef TARGET_WORDS_BIGENDIAN | 552 | #ifdef TARGET_WORDS_BIGENDIAN |