aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2022-10-23 23:47:56 +0200
committerHelge Deller <deller@gmx.de>2022-10-23 23:47:56 +0200
commit01cf225be69dafe405305c051fe634db1b2a7942 (patch)
treedcfb4b057e5f6fa10c3f586dc772f982a03ac277
parentb610dbf9cde446e6cdf6d08a31d93d5e6ec77fdd (diff)
downloadseabios-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.h13
-rw-r--r--src/parisc/hppa_hardware.h4
-rw-r--r--src/parisc/parisc.c25
-rw-r--r--src/parisc/pdc.h2
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 */