sticon/parisc: Allow 64-bit STI calls in PDC firmware abstration
authorHelge Deller <deller@gmx.de>
Sun, 14 May 2023 11:23:06 +0000 (13:23 +0200)
committerHelge Deller <deller@gmx.de>
Fri, 30 Jun 2023 15:14:14 +0000 (17:14 +0200)
Some 64-bit machines require us to call the STI ROM in 64-bit mode, e.g.
with the VisFXe graphic card.
This patch allows drivers to use such 64-bit calling conventions.

Tested-by: John David Anglin <dave.anglin@bell.net>
Signed-off-by: Helge Deller <deller@gmx.de>
arch/parisc/include/asm/pdc.h
arch/parisc/kernel/firmware.c
drivers/video/sticore.c

index 2b4fad8..269b9a1 100644 (file)
@@ -88,8 +88,8 @@ int pdc_iodc_print(const unsigned char *str, unsigned count);
 
 void pdc_emergency_unlock(void);
 int pdc_sti_call(unsigned long func, unsigned long flags,
-                 unsigned long inptr, unsigned long outputr,
-                 unsigned long glob_cfg);
+               unsigned long inptr, unsigned long outputr,
+               unsigned long glob_cfg, int do_call64);
 
 int __pdc_cpu_rendezvous(void);
 void pdc_cpu_rendezvous_lock(void);
index cc124d9..f164c46 100644 (file)
@@ -1389,17 +1389,25 @@ int pdc_iodc_getc(void)
 }
 
 int pdc_sti_call(unsigned long func, unsigned long flags,
-                 unsigned long inptr, unsigned long outputr,
-                 unsigned long glob_cfg)
+               unsigned long inptr, unsigned long outputr,
+               unsigned long glob_cfg, int do_call64)
 {
-        int retval;
+       int retval = 0;
        unsigned long irqflags;
 
-        spin_lock_irqsave(&pdc_lock, irqflags);  
-        retval = real32_call(func, flags, inptr, outputr, glob_cfg);
-        spin_unlock_irqrestore(&pdc_lock, irqflags);
+       spin_lock_irqsave(&pdc_lock, irqflags);
+       if (IS_ENABLED(CONFIG_64BIT) && do_call64) {
+#ifdef CONFIG_64BIT
+               retval = real64_call(func, flags, inptr, outputr, glob_cfg);
+#else
+               WARN_ON(1);
+#endif
+       } else {
+               retval = real32_call(func, flags, inptr, outputr, glob_cfg);
+       }
+       spin_unlock_irqrestore(&pdc_lock, irqflags);
 
-        return retval;
+       return retval;
 }
 EXPORT_SYMBOL(pdc_sti_call);
 
index 7eb925f..60ba3ab 100644 (file)
@@ -1142,7 +1142,7 @@ int sti_call(const struct sti_struct *sti, unsigned long func,
                return -1;
 #endif
 
-       ret = pdc_sti_call(func, _flags, _inptr, _outptr, _glob_cfg);
+       ret = pdc_sti_call(func, _flags, _inptr, _outptr, _glob_cfg, 0);
 
        return ret;
 }