diff options
author | Helge Deller <deller@gmx.de> | 2022-10-23 23:47:56 +0200 |
---|---|---|
committer | Helge Deller <deller@gmx.de> | 2022-10-23 23:47:56 +0200 |
commit | 01cf225be69dafe405305c051fe634db1b2a7942 (patch) | |
tree | dcfb4b057e5f6fa10c3f586dc772f982a03ac277 | |
parent | b610dbf9cde446e6cdf6d08a31d93d5e6ec77fdd (diff) | |
download | seabios-hppa-01cf225be69dafe405305c051fe634db1b2a7942.zip seabios-hppa-01cf225be69dafe405305c051fe634db1b2a7942.tar.gz seabios-hppa-01cf225be69dafe405305c051fe634db1b2a7942.tar.bz2 |
parisc: Fix Memory HPA and serial port input for MPE
Signed-off-by: Helge Deller <deller@gmx.de>
-rw-r--r-- | src/parisc/b160l.h | 13 | ||||
-rw-r--r-- | src/parisc/hppa_hardware.h | 4 | ||||
-rw-r--r-- | src/parisc/parisc.c | 25 | ||||
-rw-r--r-- | src/parisc/pdc.h | 2 |
4 files changed, 34 insertions, 10 deletions
diff --git a/src/parisc/b160l.h b/src/parisc/b160l.h index 9df9772..9a14167 100644 --- a/src/parisc/b160l.h +++ b/src/parisc/b160l.h @@ -20,6 +20,19 @@ , 0x0001, 0x0000, 0x0000, 0x0001, 0x0001 #if 0 Installation: + +install 8/0/0:0.1.0 + +INSTALL [ START ] [ SINGLE-USER ] [ SYSSTART ] [ LOGON=acct ] + [ NOSTART ] [ MULTI-USER ] [ NOSYSSTART ] + + [ SINGLE-DISC ] + [ MULTI-DISC ] + +You may enter "help" for a description of the boot options. + + + http://www.3kranger.com/HP3000/mpeix/en-mpe70/32650-90892/32650-90892.pdf https://support.hpe.com/hpesc/public/docDisplay?docId=c01097674&docLocale=en_US diff --git a/src/parisc/hppa_hardware.h b/src/parisc/hppa_hardware.h index e06ae7c..e9cc8e2 100644 --- a/src/parisc/hppa_hardware.h +++ b/src/parisc/hppa_hardware.h @@ -27,8 +27,8 @@ #define LASI_PS2MOU_HPA 0xffd08100 #define LASI_GFX_HPA 0xf8000000 #define ARTIST_FB_ADDR 0xf9000000 -#define CPU_HPA 0xfffb0000 -#define MEMORY_HPA 0xfffff000 +#define MEMORY_HPA 0xfffa0000 +#define CPU_HPA 0xfffb0000 /* needs to be last for MPE */ #define PCI_HPA DINO_HPA /* PCI bus */ #define IDE_HPA 0xf9000000 /* Boot disc controller */ diff --git a/src/parisc/parisc.c b/src/parisc/parisc.c index d440e53..0c6c6c6 100644 --- a/src/parisc/parisc.c +++ b/src/parisc/parisc.c @@ -578,9 +578,15 @@ static hppa_device_t *find_hppa_device_by_path(struct pdc_module_path *search, #define SERIAL_TIMEOUT 20 static unsigned long parisc_serial_in(char *c, unsigned long maxchars) { - portaddr_t addr = PAGE0->mem_kbd.hpa + 0x800; /* PARISC_SERIAL_CONSOLE */ + portaddr_t addr; unsigned long end = timer_calc(SERIAL_TIMEOUT); unsigned long count = 0; + + if (opsys_id == OS_ID_MPEXL) + addr = PARISC_SERIAL_CONSOLE; /* XXX: workaround that MPE uses different serial port hpa */ + else + addr = PAGE0->mem_kbd.hpa + 0x800; + while (count < maxchars) { u8 lsr = inb(addr+SEROFF_LSR); if (lsr & 0x01) { @@ -660,7 +666,7 @@ int __VISIBLE parisc_iodc_ENTRY_IO(ARG_LIST) char *c; struct disk_op_s disk_op; - if (1 && + if (0 && (((HPA_is_serial_device(hpa) || HPA_is_graphics_device(hpa)) && option == ENTRY_IO_COUT) || ((HPA_is_serial_device(hpa) || HPA_is_graphics_device(hpa)) && option == ENTRY_IO_CIN) // || (HPA_is_storage_device(hpa) && option == ENTRY_IO_BOOTIN) @@ -1200,7 +1206,7 @@ static int pdc_iodc(ARG_LIST) // ARG6 = 2; // Memory modules return 2 bytes of IODC memory (result2 ret[0] = 0x6701f41 HI !!) memcpy((void*) ARG5, iodc_p, ARG6); c = (unsigned char *) ARG5; - dprintf(0, "SeaBIOS: PDC_IODC get: hpa = 0x%lx, HV: 0x%x 0x%x IODC_SPA=0x%x type 0x%x, \n", hpa, c[0], c[1], c[2], c[3]); + // printf("SeaBIOS: XXXXXXXXXXXXXXX PDC_IODC get: hpa = 0x%lx, HV: 0x%x 0x%x IODC_SPA=0x%x type 0x%x, \n", hpa, c[0], c[1], c[2], c[3]); // c[0] = iodc_p->hversion_model; // FIXME. BROKEN HERE !!! // c[1] = iodc_p->hversion_rev || (iodc_p->hversion << 4); *result = ARG6; @@ -1232,6 +1238,9 @@ static int pdc_iodc(ARG_LIST) result[2] = 0; result[3] = 0; return PDC_OK; + case PDC_IODC_IDENT_PRIMARY: + result[0] = MEMORY_HPA; + return PDC_OK; /* or -19 ? */ } printf("\n\nSeaBIOS: Unimplemented PDC_IODC function %ld ARG3=%x ARG4=%x ARG5=%x ARG6=%x\n", option, ARG3, ARG4, ARG5, ARG6); return PDC_BAD_OPTION; @@ -1273,13 +1282,13 @@ static int pdc_stable(ARG_LIST) if ((ARG2 + ARG4) > STABLE_STORAGE_SIZE) return PDC_INVALID_ARG; memcpy((unsigned char *) ARG3, &stable_storage[ARG2], ARG4); - dump_mem(ARG3, ARG4, ARG3); + dump_mem(ARG3, ARG4, ARG2); return PDC_OK; case PDC_STABLE_WRITE: if ((ARG2 + ARG4) > STABLE_STORAGE_SIZE) return PDC_INVALID_ARG; - dump_mem(ARG3, ARG4, (unsigned long) &nvolatile_storage[ARG2]); memcpy(&stable_storage[ARG2], (unsigned char *) ARG3, ARG4); + dump_mem(ARG3, ARG4, ARG2); return PDC_OK; case PDC_STABLE_RETURN_SIZE: result[0] = STABLE_STORAGE_SIZE; @@ -1303,12 +1312,12 @@ static int pdc_nvolatile(ARG_LIST) if ((ARG2 + ARG4) > NVOLATILE_STORAGE_SIZE) return PDC_INVALID_ARG; memcpy((unsigned char *) ARG3, &nvolatile_storage[ARG2], ARG4); - dump_mem(ARG3, ARG4, ARG3); + dump_mem(ARG3, ARG4, ARG2); return PDC_OK; case PDC_NVOLATILE_WRITE: if ((ARG2 + ARG4) > NVOLATILE_STORAGE_SIZE) return PDC_INVALID_ARG; - dump_mem(ARG3, ARG4, (unsigned long) &nvolatile_storage[ARG2]); + dump_mem(ARG3, ARG4, ARG2); memcpy(&nvolatile_storage[ARG2], (unsigned char *) ARG3, ARG4); return PDC_OK; case PDC_NVOLATILE_RETURN_SIZE: @@ -2310,7 +2319,7 @@ void __VISIBLE start_parisc_firmware(void) PAGE0->memc_cont = ram_size; PAGE0->memc_phsize = ram_size; - PAGE0->memc_adsize = 0; + PAGE0->memc_adsize = 0x6000; PAGE0->mem_pdc_hi = (MEM_PDC_ENTRY + 0ULL) >> 32; PAGE0->mem_free = 0x6000; // min PAGE_SIZE PAGE0->mem_hpa = CPU_HPA; // HPA of boot-CPU diff --git a/src/parisc/pdc.h b/src/parisc/pdc.h index 97d79cb..9ffd10f 100644 --- a/src/parisc/pdc.h +++ b/src/parisc/pdc.h @@ -93,6 +93,8 @@ #define PDC_IODC_NINIT 2 /* non-destructive init */ #define PDC_IODC_DINIT 3 /* destructive init */ #define PDC_IODC_MEMERR 4 /* check for memory errors */ +#define PDC_IODC_IDENT_PRIMARY 5 /* Identify primary memory mod */ + #define PDC_IODC_INDEX_DATA 0 /* get first 16 bytes from mod IODC */ #define PDC_IODC_BUS_ERROR -4 /* bus error return value */ #define PDC_IODC_INVALID_INDEX -5 /* invalid index return value */ |