diff options
Diffstat (limited to 'qemu/roms/qemu-palcode/protos.h')
-rw-r--r-- | qemu/roms/qemu-palcode/protos.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/qemu/roms/qemu-palcode/protos.h b/qemu/roms/qemu-palcode/protos.h new file mode 100644 index 000000000..3ed13811f --- /dev/null +++ b/qemu/roms/qemu-palcode/protos.h @@ -0,0 +1,228 @@ +/* Declarations common the the C portions of the QEMU PALcode console. + + Copyright (C) 2011 Richard Henderson + + This file is part of QEMU PALcode. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the text + of the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not see + <http://www.gnu.org/licenses/>. */ + +#ifndef PROTOS_H +#define PROTOS_H 1 + +#include <stdint.h> +#include <stdbool.h> +#include <stddef.h> +#include <string.h> + + +/* + * Call_Pal functions. + */ + +static inline void wrent(void *cb, unsigned long which) +{ + register void *a0 __asm__("$16") = cb; + register unsigned long a1 __asm__("$17") = which; + + asm volatile ("call_pal 0x34" + : "+r"(a0), "+r"(a1) + : : "$1", "$22", "$23", "$24", "$25"); +} + +static inline unsigned long swpipl(unsigned long newipl) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = newipl; + + asm volatile ("call_pal 0x35" + : "=r"(v0), "+r"(a0) + : : "$1", "$22", "$23", "$24", "$25"); + + return v0; +} + +static inline unsigned long rdps(void) +{ + register unsigned long v0 __asm__("$0"); + + asm volatile ("call_pal 0x36" + : "=r"(v0) : : "$1", "$22", "$23", "$24", "$25"); + + return v0; +} + +static inline void wrkgp(void) +{ + asm volatile ("mov $29, $16\n\tcall_pal 0x37" + : : : "$16", "$1", "$22", "$23", "$24", "$25"); +} + +static inline unsigned long wtint(unsigned long skip) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = skip; + + asm volatile ("call_pal 0x3e" + : "=r"(v0), "+r"(a0) + : : "$1", "$22", "$23", "$24", "$25"); + + return v0; +} + +/* + * Cserve functions. + */ + +static inline unsigned long ldq_p(unsigned long addr) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = 1; + register unsigned long a1 __asm__("$17") = addr; + + asm volatile ("call_pal 9" + : "=r"(v0), "+r"(a0), "+r"(a1) : + : "$18", "$19", "$20", "$21"); + + return v0; +} + +static inline unsigned long stq_p(unsigned long port, unsigned long val) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = 2; + register unsigned long a1 __asm__("$17") = port; + register unsigned long a2 __asm__("$18") = val; + + asm volatile ("call_pal 9" + : "=r"(v0), "+r"(a0), "+r"(a1), "+r"(a2) : + : "$19", "$20", "$21"); + + return v0; +} + +static inline unsigned long get_wall_time(void) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = 3; + + asm("call_pal 9" : "=r"(v0), "+r"(a0) : : "$17", "$18", "$19", "$20", "$21"); + + return v0; +} + +static inline unsigned long get_alarm(void) +{ + register unsigned long v0 __asm__("$0"); + register unsigned long a0 __asm__("$16") = 4; + + asm("call_pal 9" : "=r"(v0), "+r"(a0) : : "$17", "$18", "$19", "$20", "$21"); + + return v0; +} + +static inline void set_alarm_rel(unsigned long nsec) +{ + register unsigned long a0 __asm__("$16") = 5; + register unsigned long a1 __asm__("$17") = nsec; + + asm volatile ("call_pal 9" + : "+r"(a0), "+r"(a1) + : : "$0", "$18", "$19", "$20", "$21"); +} + +static inline void set_alarm_abs(unsigned long nsec) +{ + register unsigned long a0 __asm__("$16") = 6; + register unsigned long a1 __asm__("$17") = nsec; + + asm volatile ("call_pal 9" + : "+r"(a0), "+r"(a1) + : : "$0", "$18", "$19", "$20", "$21"); +} + +/* + * I/O functions + */ + +extern void *pci_io_base; +extern void *pci_mem_base; + +static inline uint8_t inb(unsigned long port) +{ + return *(volatile uint8_t *)(pci_io_base + port); +} + +static inline uint16_t inw(unsigned long port) +{ + return *(volatile uint16_t *)(pci_io_base + port); +} + +static inline uint32_t inl(unsigned long port) +{ + return *(volatile uint32_t *)(pci_io_base + port); +} + +static inline void outb(uint8_t val, unsigned long port) +{ + *(volatile uint8_t *)(pci_io_base + port) = val; +} + +static inline void outw(uint16_t val, unsigned long port) +{ + *(volatile uint16_t *)(pci_io_base + port) = val; +} + +static inline void outl(uint32_t val, unsigned long port) +{ + *(volatile uint32_t *)(pci_io_base + port) = val; +} + +/* + * CRB functions + */ + +extern unsigned long crb_dispatch(long select, long a1, long a2, + long a3, long a4); +extern unsigned long crb_fixup(unsigned long vptptr, unsigned long hwrpb); + +/* + * The Console + */ + +extern bool have_vga; + +extern void do_console(void); +extern void entInt(void); + +/* + * Utils + */ + +extern int printf(const char *, ...); +extern void ndelay(unsigned long nsec); + +static inline void udelay(unsigned long msec) +{ + ndelay(msec * 1000); +} + +/* + * Initialization + */ +extern void ps2port_setup(void); +extern void pci_setup(void); +extern void vgahw_init(void); + +#endif /* PROTOS_H */ |