Commit a0a8793ebcca7f2ad071b3f95dec3c3dfe44354a

Authored by ths
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