dev_sgi_ip32.cc Source File
Back to the index.
Go to the documentation of this file.
68 #define CRIME_TICKSHIFT 14
75 #define DEV_CRIME_LENGTH 0x280
103 printf(
"CRIME SOFTINT=0x%08x HARDINT=0x%08x => 0x%08x, INTMASK=0x%08x\n",
110 int asserted = !!status;
144 gettimeofday(&tv, NULL);
146 uint64_t microseconds = tv.tv_sec * 1000000 + tv.tv_usec;
153 fatal(
"[ crime_update_crime_time: host system time went backwards? ]\n");
159 int64_t to_add = delta * 66;
206 uint64_t idata = 0, odata = 0;
207 uint64_t preserved_CRIME_HARDINT = d->
reg[
CRIME_HARDINT /
sizeof(uint64_t)];
239 fatal(
"[ sgi_crime: SGI O2 can not have more than 1024 MB RAM ]\n");
250 fatal(
"[ sgi_crime: for up to 256 MB RAM, RAM size needs to be divisible "
251 "by 32 MB. for larger RAM sizes (up to 1024 MB), it needs to be "
252 "divisible by 128 MB. ]\n");
256 int flag_for_128MB = mb_per_bank == 128 ? 0x100 : 0x000;
258 for (
int bank = 0; bank < 8; ++bank) {
259 int b = mb_per_bank == 128 ? (bank << 2) : bank;
266 total_mb += mb_per_bank;
271 d->
reg[relative_addr / 8] = idata;
273 odata = d->
reg[relative_addr / 8];
274 }
else if (len == 4) {
276 if (relative_addr & 4) {
277 d->
reg[relative_addr / 8] &= ~0xffffffffULL;
278 d->
reg[relative_addr / 8] |= (uint32_t)idata;
280 d->
reg[relative_addr / 8] &= 0xffffffffULL;
281 d->
reg[relative_addr / 8] |= (uint64_t)(idata << 32ULL);
284 odata = d->
reg[relative_addr / 8];
285 if (relative_addr & 4)
286 odata = (int32_t)odata;
288 odata = (int32_t)(odata >> 32);
291 fatal(
"crime access len = %i!\n", len);
295 switch (relative_addr) {
317 if (((uint32_t)
cpu->
pc & 0xffffff00) == (uint32_t)0xbfc05100) {
345 exit_without_entering_debugger = 1;
352 fatal(
"[ CRIME_CONTROL: unimplemented "
353 "control 0x%016llx ]\n", (
long long)idata);
372 debug(
"[ crime: read from 0x%x, len=%i:",
373 (
int)relative_addr, len);
374 for (i=0; i<len; i++)
378 debug(
"[ crime: write to 0x%x:", (
int)relative_addr);
379 for (i=0; i<len; i++)
381 debug(
" (len=%i) ]\n", len);
401 uint64_t baseaddr,
char *irq_path,
int use_fb)
415 for (i=0; i<32; i++) {
418 snprintf(
name,
sizeof(
name),
"%s.crime.0x%x", irq_path, 1 << i);
419 memset(&templ, 0,
sizeof(templ));
431 snprintf(tmpstr,
sizeof(tmpstr),
"mace addr=0x1f310000 irq=%s.crime",
443 #define DEV_MACE_LENGTH 0x100
460 int assert_periph = s4 | s5 ? 1 : 0;
461 int assert_misc = s6 | s7 ? 1 : 0;
542 uint8_t old_mace_isa_flash_nic_reg =
546 memcpy(&d->
reg[relative_addr],
data, len);
548 memcpy(
data, &d->
reg[relative_addr], len);
550 switch (relative_addr & ~7) {
577 ^ old_mace_isa_flash_nic_reg) &
581 case 0:
debug(
"[ mace: turning LED WHITE/ORANGE ]\n");
584 debug(
"[ mace: turning LED GREEN ]\n");
587 debug(
"[ mace: turning LED RED ]\n");
589 default:
fatal(
"[ mace: turning LED OFF ]\n");
607 fatal(
"[ NOTE/TODO: WRITE to mace intr: "
608 "reladdr=0x%x data=", (
int)relative_addr);
609 for (i=0; i<len; i++)
611 fatal(
" (len=%i) ]\n", len);
620 debug(
"[ mace: read from 0x%x:", (
int)relative_addr);
621 for (i=0; i<len; i++)
623 debug(
" (len=%i) ]\n", len);
625 debug(
"[ mace: write to 0x%x:", (
int)relative_addr);
626 for (i=0; i<len; i++)
628 debug(
" (len=%i) ]\n", len);
645 snprintf(tmpstr,
sizeof(tmpstr),
"%s.0x%x",
649 snprintf(tmpstr,
sizeof(tmpstr),
"%s.0x%x",
657 for (i=0; i<32; i++) {
660 snprintf(
name,
sizeof(
name),
"%s.0x%x.mace.%i",
662 memset(&templ, 0,
sizeof(templ));
670 snprintf(
name,
sizeof(
name),
"%s.0x%x.mace.%i",
672 memset(&templ, 0,
sizeof(templ));
696 uint64_t idata = 0, odata=0;
697 int res = 1, bus, dev, func, pcireg;
700 fatal(
"[ macepci: unimplemented len %i ]\n", len);
705 fatal(
"[ macepci: write to address 0x%x, data=0x%02x (len %i) ]\n",
706 (
int)relative_addr, (
int)idata, len);
711 switch (relative_addr) {
752 &odata : &idata, len, writeflag);
757 fatal(
"[ macepci: unimplemented write to address "
758 "0x%x, data=0x%02x ]\n",
759 (
int)relative_addr, (
int)idata);
761 fatal(
"[ macepci: unimplemented read from address "
762 "0x%x ]\n", (
int)relative_addr);
773 fatal(
"[ macepci: read from address 0x%x, data=0x%02x (len %i) ]\n",
774 (
int)relative_addr, (
int)odata, len);
786 struct memory *mem, uint64_t baseaddr,
char *irq_path)
801 "TODO: pci irq path",
824 uint64_t idata = 0, odata = 0;
828 regnr = relative_addr /
sizeof(uint64_t);
832 d->
reg[regnr] = idata;
834 odata = d->
reg[regnr];
836 switch (relative_addr) {
838 d->
reg[regnr] += 0x2710;
842 debug(
"[ sgi_ust: unimplemented write to "
843 "address 0x%llx, data=0x%016llx ]\n",
844 (
long long)relative_addr, (
long long)idata);
846 debug(
"[ sgi_ust: unimplemented read from address"
847 " 0x%llx ]\n", (
long long)relative_addr);
void dev_crime_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, char *irq_path, int use_fb)
struct interrupt irq_misc
#define INTERRUPT_CONNECT(name, istruct)
unsigned char reg[DEV_MACE_LENGTH]
#define INTERRUPT_ASSERT(istruct)
void(* interrupt_deassert)(struct interrupt *)
#define DEV_SGI_UST_LENGTH
#define MACE_ISA_INT_MASK
void bus_pci_setaddr(struct cpu *cpu, struct pci_data *pci_data, int bus, int device, int function, int reg)
#define CRIME_INT_PERIPH_SERIAL
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)
void mips32_pc_to_pointers(struct cpu *)
void bus_pci_data_access(struct cpu *cpu, struct pci_data *pci_data, uint64_t *data, int len, int writeflag)
#define MACE_ISA_RINGBASE
#define CRIME_CONTROL_DOG_ENABLE
void bus_pci_decompose_1(uint32_t t, int *bus, int *dev, int *func, int *reg)
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)
void crime_interrupt_assert(struct interrupt *interrupt)
void crime_interrupt_deassert(struct interrupt *interrupt)
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
uint64_t last_microseconds
uint64_t reg[DEV_SGI_UST_LENGTH/sizeof(uint64_t)]
void fatal(const char *fmt,...)
void mace_interrupt_reassert(struct mace_data *d)
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
void * device_add(struct machine *machine, const char *name_and_params)
int dev_sgi_ust_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
#define CRIME_CONTROL_HARD_RESET
void mace_interrupt_assert(struct interrupt *interrupt)
struct interrupt irq_periph
#define MACE_ISA_INT_STATUS
#define DEV_MACEPCI_LENGTH
uint64_t reg[DEV_CRIME_LENGTH/sizeof(uint64_t)]
uint32_t physical_ram_in_mb
void mips_pc_to_pointers(struct cpu *)
#define MACE_ISA_FLASH_NIC_REG
#define MACE_ISA_LED_GREEN
void crime_interrupt_reassert(struct crime_data *d)
struct pci_data * pci_data
struct pci_data * dev_macepci_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, char *irq_path)
#define CRIME_CONTROL_ENDIANESS
uint64_t gpr[N_MIPS_GPRS]
#define CRIME_MEM_BANK_CTRL0
#define INTERRUPT_DEASSERT(istruct)
void(* interrupt_assert)(struct interrupt *)
int dev_macepci_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
void interrupt_handler_register(struct interrupt *templ)
#define MACE_ISA_PWD_CLEAR
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
void mace_interrupt_deassert(struct interrupt *interrupt)
void dev_sgi_ust_init(struct memory *mem, uint64_t baseaddr)
#define CRIME_INT_PERIPH_MISC
void crime_update_crime_time(struct crime_data *d)
#define CHECK_ALLOCATION(ptr)
Generated on Tue Aug 25 2020 19:25:06 for GXemul by
1.8.18