mbox series

[000/120] Linux for the PlayStation 2

Message ID cover.1567326213.git.noring@nocrew.org (mailing list archive)
Headers show
Series Linux for the PlayStation 2 | expand

Message

Fredrik Noring Sept. 1, 2019, 3:35 p.m. UTC
Hi Paul,

This is the initial patch submission for the PlayStation 2. The series
implements support for USB devices and a frame buffer console, making
Linux usable with unmodified hardware having a working boot loader
installed on a memory card.

There are eight major parts:

1. The R5900 is the main processor that runs the kernel[1]. It implements
   the 64-bit MIPS III instruction set except LL, SC, LLD and SCD, with
   additional PREFETCH and conditional move instructions from MIPS IV as
   well as three-operand multiply and multiply-accumulate instructions.
   It has a set of R5900 specific 128-bit multimedia instructions (MMIs).

   The FPU implements single-precision floating-point operations but it
   is not entirely IEEE 754 compatible. The FPU is therefore emulated in
   software for normal ELF executables. The R5900 has several significant
   hardware bugs. Perhaps the most important bug affecting applications
   is the short loop bug that under certain conditions causes loops to
   execute only once or twice.

   R5900 specific handling of SYNC.P, SYNC.L, ERET, etc. are implemented.

2. Interrupts, a timer and minimal DMA support are implemented.

3. System commands (SCMDs) are implemented to identify the hardware model,
   read and set the real-time clock (RTC), and power off the machine.

4. Read-only memory (ROM) operations are implemented. These are used to
   identify the hardware. ROM operations are also used to resolve IOP
   libraries linked as firmware, as explained below.

6. The input/output processor (IOP) and its sub-system interface (SIF)
   are supported[2]. The IOP is a MIPS R3000A, or in later models a
   PowerPC 405GP emulating a MIPS R3000A, sometimes referred to as the
   sub processor. It runs a separate minikernel implemented in ROM. Most
   peripherals require, in whole or in part, handling by the IOP.

   Two IOP services are required to support USB devices: IOP memory
   allocation and IOP interrupt relay. The latter requires linking a
   custom IOP module, handled as firmware by the kernel, with library
   dependency resolution. Remote procedure calls (RPCs) are used to
   issue bidirectional commands over the SIF, via DMA.

7. The Graphics Synthesizer (GS) is the video hardware that displays the
   frame buffer console. The GS is highly configurable with a substantial
   set of hardware accelerated features. Its local memory is not directly
   accessible from the main bus. All drawing primitives are transmitted
   via DMA[3].

8. The frame buffer driver implements console support. The font is stored
   as textures in local GS memory and several hardware accelerated
   operations are implemented, for example XPAN, YPAN and YWRAP.

The o32 ABI is supported, but not yet n32 as it involves some additional
complications. I would very much like to add support for the 128-bit R5900
GPRs, for two primary reasons:

- The 128-bit multimedia instruction set is one of the defining features
  of the R5900. A respectable PlayStation 2 application ought to use them.

- The MMIs cannot be disabled by the kernel. MMIs will therefore appear
  to mostly work, with some occasional register corruption due to context
  switches, unless the kernel properly saves and restores the 128-bit
  registers.

This patch series has been tested with the PlayStation 2 models SCPH-30004,
SCPH-30004 R, SCPH-37000 L, SCPH-39004, SCPH-50004, SCPH-70004, SCPH-75004
and SCPH-77004.

Please consider it for inclusion.

Fredrik

References:

[1] "TX System RISC TX79 Core Architecture" manual, revision 2.0,
    Toshiba Corporation, https://wiki.qemu.org/File:C790.pdf

[2] "EE Overview", version 6.0, Sony Computer Entertainment Inc.

[3] "GS User's Manual", version 6.0, Sony Computer Entertainment Inc.

Fredrik Noring (120):
  MIPS: R5900: Initial support for the Emotion Engine in the PlayStation 2
  MIPS: R5900: Trap the RDHWR instruction as an SQ address exception
  MIPS: R5900: Sign-extend o32 system call registers
  MIPS: R5900: Reset bits 127..64 of GPRs in RESTORE_SOME
  MIPS: R5900: Reset the funnel shift amount (SA) register in RESTORE_SOME
  MIPS: R5900: Workaround for the short loop bug
  MIPS: R5900: Add the SYNC.P instruction
  MIPS: R5900: Add implicit SYNC.P to the UASM_i_M[FT]C0 macros
  MIPS: R5900: Add mandatory SYNC.P to all M[FT]C0 instructions
  MIPS: R5900: Workaround exception NOP execution bug (FLX05)
  MIPS: R5900: Avoid pipeline hazard with the TLBP instruction
  MIPS: R5900: Avoid pipeline hazards with the TLBW[IR] instructions
  MIPS: R5900: Avoid pipeline hazard with the TLBR instruction
  MIPS: R5900: Install final length of TLB refill handler rather than 256 bytes
  MIPS: R5900: Verify that the TLB refill handler does not overflow
  MIPS: R5900: The ERET instruction has issues with delay slot and CACHE
  MIPS: R5900: Define CACHE instruction operation field encodings
  MIPS: R5900: Workaround where MSB must be 0 for the instruction cache
  MIPS: R5900: Use SYNC.L for data cache and SYNC.P for instruction cache
  MIPS: R5900: Define CP0.Config register fields
  MIPS: R5900: Workaround for CACHE instruction near branch delay slot
  MIPS: R5900: Support 64-bit inq() and outq() macros in 32-bit kernels
  MIPS: R5900: Add MFSA and MTSA instructions for the special SA register
  MIPS: PS2: Define PlayStation 2 I/O port, ROM and RAM address spaces
  MIPS: PS2: Define interrupt controller, DMA and timer IRQs
  MIPS: PS2: Interrupt controller (INTC) IRQ support
  MIPS: PS2: DMAC: Define DMA controller registers
  MIPS: PS2: DMAC: Define tag structures
  MIPS: PS2: DMAC: IRQ support
  MIPS: PS2: Timer support
  MIPS: PS2: SCMD: System command support
  MIPS: PS2: SCMD: System power off command
  MIPS: PS2: SCMD: Read system machine name command
  MIPS: PS2: SCMD: Read system command for the real-time clock (RTC)
  MIPS: PS2: SCMD: Set system command for the real-time clock (RTC)
  MIPS: PS2: ROM: Iterate over the files in a given ROM directory
  MIPS: PS2: ROM: Find ROM files with a given name, if they exist
  MIPS: PS2: ROM: Read data for a given ROM file name
  MIPS: PS2: ROM: Read extended information for a given ROM file
  MIPS: PS2: ROM: Read and decode the ROMVER file
  MIPS: PS2: ROM: Resolve the name for the type in the ROMVER file
  MIPS: PS2: ROM: Resolve the name for the region in the ROMVER file
  MIPS: PS2: ROM: Permit /dev/mem to access read-only memory
  MIPS: PS2: ROM: Sysfs module to inspect ROM files
  MIPS: PS2: ROM: Provide extended file information via sysfs
  MIPS: PS2: Identify the machine by model name
  MIPS: PS2: Let the system type be Sony PlayStation 2
  MIPS: Define and use cpu_relax_forever() for various halting loops
  MIPS: PS2: Power off support
  MIPS: PS2: Real-time clock (RTC) driver
  MIPS: PS2: IOP: I/O processor DMA register PCR2 set and clear
  MIPS: PS2: SIF: Sub-system interface reset of the I/O processor (IOP)
  MIPS: PS2: IOP: Define error numbers, descriptions and errno mapping
  MIPS: PS2: SIF: SIF register write command support
  MIPS: PS2: SIF: Respond to remote procedure call (RPC) bind command
  MIPS: PS2: SIF: Respond to RPC bind end command
  MIPS: PS2: SIF: Reset the SIF0 (sub-to-main) DMA controller
  MIPS: PS2: SIF: Handle SIF0 (sub-to-main) RPCs via interrupts
  MIPS: PS2: SIF: Enable the IOP to issue SIF commands
  MIPS: PS2: SIF: Enable the IOP to issue SIF RPCs
  MIPS: PS2: SIF: sif_rpc_bind() to request an RPC server connection
  MIPS: PS2: SIF: sif_rpc_unbind() to release an RPC server connection
  MIPS: PS2: SIF: sif_rpc() to issue a remote procedure call
  MIPS: PS2: IOP: Permit /dev/mem to access IOP memory
  MIPS: PS2: IOP: I/O processor memory support
  FIXME: Export _dma_cache_{wback,wback_inv,inv}
  MIPS: PS2: IOP: Module linking support
  MIPS: PS2: IOP: Verify that modules are IRX objects
  MIPS: PS2: IOP: Module version compatibility verification
  MIPS: PS2: IOP: Avoid linking already linked library modules
  MIPS: PS2: IOP: Resolve module dependencies
  MIPS: PS2: IOP: SIF printk command support
  MIPS: PS2: IOP: Heap memory allocate and free
  MIPS: PS2: SIF: Request RPC IRQ command
  MIPS: PS2: IOP: IRQ support
  MIPS: PS2: GS: Define privileged Graphics Synthesizer registers
  MIPS: PS2: GS: Write privileged registers
  MIPS: PS2: GS: Read privileged registers
  MIPS: PS2: GS: Define privileged register structures
  MIPS: PS2: GS: Define gs_xorq_imr()
  MIPS: PS2: GS: Privileged register write macros with named fields
  MIPS: PS2: GS: IRQ support
  MIPS: PS2: GS: Define Graphics Synthesizer primitive structures
  MIPS: PS2: GIF: Define Graphics Synthesizer interface structures
  MIPS: PS2: GIF: Graphics Synthesizer interface support
  MIPS: PS2: GS: Graphics Synthesizer device init and video clock
  MIPS: PS2: GS: Compute block count and indices
  MIPS: PS2: GS: Primitive and texel coordinate transformations
  MIPS: PS2: GS: Approximate video region with ROM region
  macro: Extend COUNT_ARGS() from 12 to 32 arguments
  MIPS: PS2: GS: Show privileged registers with sysfs
  MIPS: PS2: GS: Store privileged registers with sysfs
  fbdev: Add fb_warn_once() variant that only prints a warning once
  MIPS: PS2: FB: Frame buffer driver for the PlayStation 2
  MIPS: PS2: FB: fb_set_par() standard-definition television support
  MIPS: PS2: FB: fb_set_par() high-definition television support
  MIPS: PS2: FB: fb_set_par() VESA computer display mode support
  MIPS: PS2: FB: Preconfigure standard PAL, NTSC and VESA display modes
  MIPS: PS2: FB: Reset the Graphics Synthesizer drawing environment
  MIPS: PS2: FB: Clear the display buffer when changing video modes
  MIPS: PS2: FB: fb_setcolreg() 256 colour pseudo palette support
  MIPS: PS2: FB: fb_settile() with font stored as palette indexed textures
  MIPS: PS2: FB: Hardware accelerated fb_tilecopy() support
  MIPS: PS2: FB: Hardware accelerated fb_tilefill() support
  MIPS: PS2: FB: Simplified fb_tileblit() support
  MIPS: PS2: FB: fb_tilecursor() placeholder
  MIPS: PS2: FB: Hardware accelerated fb_pan_display() support
  MIPS: PS2: FB: fb_blank() display power management signaling (DPMS)
  MIPS: PS2: FB: Disable GIF DMA completion interrupts
  MIPS: PS2: FB: PAL and NTSC grayscale support
  MIPS: PS2: FB: Analogue display mode adjustment module parameter
  USB: OHCI: Support for the PlayStation 2
  USB: OHCI: OHCI_INTR_MIE workaround for freeze on the PlayStation 2
  MIPS: PS2: Workaround for unexpected uLaunchELF CP0 Status user mode
  MIPS: PS2: Define initial PlayStation 2 devices
  MIPS: PS2: Define workarounds related to the PlayStation 2
  MIPS: PS2: Define R5900 feature overrides
  MIPS: PS2: Define the PlayStation 2 platform
  MIPS: PS2: Initial support for the Sony PlayStation 2
  MIPS: Fix name of BOOT_MEM_ROM_DATA

 arch/mips/Kbuild.platforms                    |    1 +
 arch/mips/Kconfig                             |   35 +-
 arch/mips/Makefile                            |    1 +
 arch/mips/alchemy/board-gpr.c                 |    7 +-
 arch/mips/alchemy/board-mtx1.c                |    7 +-
 arch/mips/alchemy/board-xxs1500.c             |    7 +-
 arch/mips/alchemy/devboards/platform.c        |    4 +-
 arch/mips/ar7/setup.c                         |    4 +-
 arch/mips/ath79/setup.c                       |    8 +-
 arch/mips/bcm47xx/setup.c                     |    9 +-
 arch/mips/bcm63xx/setup.c                     |   12 +-
 arch/mips/boot/compressed/decompress.c        |    4 +-
 arch/mips/boot/compressed/head.S              |   16 +-
 arch/mips/cavium-octeon/smp.c                 |    4 +-
 arch/mips/cobalt/reset.c                      |    5 +-
 arch/mips/emma/markeins/setup.c               |    5 +-
 arch/mips/fw/arc/init.c                       |    4 +-
 arch/mips/include/asm/asmmacro.h              |   53 +
 arch/mips/include/asm/cacheops.h              |   17 +
 arch/mips/include/asm/cpu-type.h              |    4 +
 arch/mips/include/asm/cpu.h                   |    3 +-
 arch/mips/include/asm/io.h                    |   60 +-
 arch/mips/include/asm/irqflags.h              |   15 +
 .../asm/mach-ps2/cpu-feature-overrides.h      |   35 +
 arch/mips/include/asm/mach-ps2/dmac.h         |  254 ++
 arch/mips/include/asm/mach-ps2/gif.h          |   77 +
 arch/mips/include/asm/mach-ps2/gs-registers.h |  646 +++++
 arch/mips/include/asm/mach-ps2/gs.h           |   81 +
 arch/mips/include/asm/mach-ps2/iop-error.h    |   76 +
 arch/mips/include/asm/mach-ps2/iop-heap.h     |   19 +
 arch/mips/include/asm/mach-ps2/iop-memory.h   |   21 +
 arch/mips/include/asm/mach-ps2/iop-module.h   |   13 +
 .../mips/include/asm/mach-ps2/iop-registers.h |   19 +
 arch/mips/include/asm/mach-ps2/iop.h          |   21 +
 arch/mips/include/asm/mach-ps2/irq.h          |  130 +
 arch/mips/include/asm/mach-ps2/rom.h          |  171 ++
 arch/mips/include/asm/mach-ps2/scmd.h         |   56 +
 arch/mips/include/asm/mach-ps2/sif.h          |   94 +
 arch/mips/include/asm/mach-ps2/war.h          |   24 +
 arch/mips/include/asm/mipsregs.h              |  103 +
 arch/mips/include/asm/module.h                |    2 +
 arch/mips/include/asm/processor.h             |    6 +
 arch/mips/include/asm/r4kcache.h              |  244 +-
 arch/mips/include/asm/stackframe.h            |  108 +
 arch/mips/include/asm/string.h                |    3 +
 arch/mips/include/asm/traps.h                 |    2 +
 arch/mips/include/asm/uasm.h                  |   23 +
 arch/mips/include/uapi/asm/gif.h              |  164 ++
 arch/mips/include/uapi/asm/gs.h               |  723 +++++
 arch/mips/jz4740/reset.c                      |    9 +-
 arch/mips/kernel/cpu-probe.c                  |    8 +
 arch/mips/kernel/genex.S                      |   65 +
 arch/mips/kernel/head.S                       |    9 +
 arch/mips/kernel/r4k_switch.S                 |    9 +
 arch/mips/kernel/scall32-o32.S                |   12 +
 arch/mips/kernel/setup.c                      |    6 +-
 arch/mips/kernel/traps.c                      |   19 +-
 arch/mips/kernel/unaligned.c                  |   36 +-
 arch/mips/lib/delay.c                         |    7 +-
 arch/mips/lib/memset.S                        |    2 +
 arch/mips/loongson64/common/reset.c           |   16 +-
 arch/mips/mm/Makefile                         |    1 +
 arch/mips/mm/c-r4k.c                          |   27 +-
 arch/mips/mm/cache.c                          |    4 +
 arch/mips/mm/cerr-sb1.c                       |    4 +-
 arch/mips/mm/cex-gen.S                        |    6 +
 arch/mips/mm/tlbex-fault.S                    |    3 +
 arch/mips/mm/tlbex.c                          |   94 +-
 arch/mips/mm/uasm-mips.c                      |    1 +
 arch/mips/mm/uasm.c                           |    5 +-
 arch/mips/pic32/common/reset.c                |    9 +-
 arch/mips/pnx833x/common/reset.c              |    5 +-
 arch/mips/ps2/Kconfig                         |   16 +
 arch/mips/ps2/Makefile                        |   12 +
 arch/mips/ps2/Platform                        |    7 +
 arch/mips/ps2/devices.c                       |   98 +
 arch/mips/ps2/dmac-irq.c                      |  102 +
 arch/mips/ps2/identify.c                      |   86 +
 arch/mips/ps2/intc-irq.c                      |  118 +
 arch/mips/ps2/irq.c                           |   38 +
 arch/mips/ps2/memory.c                        |   45 +
 arch/mips/ps2/prom.c                          |   18 +
 arch/mips/ps2/reboot.c                        |   29 +
 arch/mips/ps2/rom-sysfs.c                     |  392 +++
 arch/mips/ps2/rom.c                           |  702 +++++
 arch/mips/ps2/scmd.c                          |  379 +++
 arch/mips/ps2/time.c                          |  153 ++
 arch/mips/sgi-ip22/ip22-reset.c               |    3 +-
 arch/mips/sgi-ip27/ip27-berr.c                |    4 +-
 arch/mips/sgi-ip27/ip27-reset.c               |   13 +-
 arch/mips/sgi-ip32/ip32-berr.c                |    4 +-
 arch/mips/sgi-ip32/ip32-irq.c                 |    3 +-
 arch/mips/sibyte/common/cfe.c                 |    3 +-
 arch/mips/txx9/rbtx4939/setup.c               |    4 +-
 arch/mips/vr41xx/common/pmu.c                 |    2 +-
 drivers/Makefile                              |    1 +
 drivers/ps2/Makefile                          |   12 +
 drivers/ps2/gif.c                             |  106 +
 drivers/ps2/gs-irq.c                          |   93 +
 drivers/ps2/gs-registers.c                    |  189 ++
 drivers/ps2/gs-sysfs.c                        |  592 +++++
 drivers/ps2/gs.c                              |  319 +++
 drivers/ps2/iop-heap.c                        |   90 +
 drivers/ps2/iop-irq.c                         |  186 ++
 drivers/ps2/iop-memory.c                      |   56 +
 drivers/ps2/iop-module.c                      |  954 +++++++
 drivers/ps2/iop-registers.c                   |   39 +
 drivers/ps2/sif.c                             |  888 +++++++
 drivers/rtc/Kconfig                           |   10 +
 drivers/rtc/Makefile                          |    1 +
 drivers/rtc/rtc-ps2.c                         |   74 +
 drivers/usb/host/Kconfig                      |    8 +
 drivers/usb/host/Makefile                     |    1 +
 drivers/usb/host/ohci-ps2.c                   |  264 ++
 drivers/video/fbdev/Kconfig                   |   12 +
 drivers/video/fbdev/Makefile                  |    1 +
 drivers/video/fbdev/ps2fb.c                   | 2362 +++++++++++++++++
 include/linux/console_struct.h                |    2 +
 include/linux/fb.h                            |    2 +
 include/linux/kernel.h                        |   12 +-
 include/uapi/linux/fb.h                       |    1 +
 121 files changed, 12077 insertions(+), 186 deletions(-)
 create mode 100644 arch/mips/include/asm/mach-ps2/cpu-feature-overrides.h
 create mode 100644 arch/mips/include/asm/mach-ps2/dmac.h
 create mode 100644 arch/mips/include/asm/mach-ps2/gif.h
 create mode 100644 arch/mips/include/asm/mach-ps2/gs-registers.h
 create mode 100644 arch/mips/include/asm/mach-ps2/gs.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop-error.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop-heap.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop-memory.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop-module.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop-registers.h
 create mode 100644 arch/mips/include/asm/mach-ps2/iop.h
 create mode 100644 arch/mips/include/asm/mach-ps2/irq.h
 create mode 100644 arch/mips/include/asm/mach-ps2/rom.h
 create mode 100644 arch/mips/include/asm/mach-ps2/scmd.h
 create mode 100644 arch/mips/include/asm/mach-ps2/sif.h
 create mode 100644 arch/mips/include/asm/mach-ps2/war.h
 create mode 100644 arch/mips/include/uapi/asm/gif.h
 create mode 100644 arch/mips/include/uapi/asm/gs.h
 create mode 100644 arch/mips/ps2/Kconfig
 create mode 100644 arch/mips/ps2/Makefile
 create mode 100644 arch/mips/ps2/Platform
 create mode 100644 arch/mips/ps2/devices.c
 create mode 100644 arch/mips/ps2/dmac-irq.c
 create mode 100644 arch/mips/ps2/identify.c
 create mode 100644 arch/mips/ps2/intc-irq.c
 create mode 100644 arch/mips/ps2/irq.c
 create mode 100644 arch/mips/ps2/memory.c
 create mode 100644 arch/mips/ps2/prom.c
 create mode 100644 arch/mips/ps2/reboot.c
 create mode 100644 arch/mips/ps2/rom-sysfs.c
 create mode 100644 arch/mips/ps2/rom.c
 create mode 100644 arch/mips/ps2/scmd.c
 create mode 100644 arch/mips/ps2/time.c
 create mode 100644 drivers/ps2/Makefile
 create mode 100644 drivers/ps2/gif.c
 create mode 100644 drivers/ps2/gs-irq.c
 create mode 100644 drivers/ps2/gs-registers.c
 create mode 100644 drivers/ps2/gs-sysfs.c
 create mode 100644 drivers/ps2/gs.c
 create mode 100644 drivers/ps2/iop-heap.c
 create mode 100644 drivers/ps2/iop-irq.c
 create mode 100644 drivers/ps2/iop-memory.c
 create mode 100644 drivers/ps2/iop-module.c
 create mode 100644 drivers/ps2/iop-registers.c
 create mode 100644 drivers/ps2/sif.c
 create mode 100644 drivers/rtc/rtc-ps2.c
 create mode 100644 drivers/usb/host/ohci-ps2.c
 create mode 100644 drivers/video/fbdev/ps2fb.c

Comments

Paul Burton Sept. 4, 2019, 2:19 p.m. UTC | #1
Hi Fredrik,

On Sun, Sep 01, 2019 at 05:35:21PM +0200, Fredrik Noring wrote:
> Hi Paul,
> 
> This is the initial patch submission for the PlayStation 2. The series
> implements support for USB devices and a frame buffer console, making
> Linux usable with unmodified hardware having a working boot loader
> installed on a memory card.

Wow - you've been busy, this patchset is huge!

> There are eight major parts:

I think we may be best to split this up into 8 (or more) different
patchsets along these lines. In my experience large patchsets that touch
lots of different subsystems are very difficult to get merged, so I'd
suggest maybe we start with just the CPU support for arch/mips/ & if you
have the bandwidth you could submit drivers to other subsystem
maintainers in parallel.

> 1. The R5900 is the main processor that runs the kernel[1]. It implements
>    the 64-bit MIPS III instruction set except LL, SC, LLD and SCD, with
>    additional PREFETCH and conditional move instructions from MIPS IV as
>    well as three-operand multiply and multiply-accumulate instructions.
>    It has a set of R5900 specific 128-bit multimedia instructions (MMIs).
> 
>    The FPU implements single-precision floating-point operations but it
>    is not entirely IEEE 754 compatible. The FPU is therefore emulated in
>    software for normal ELF executables. The R5900 has several significant
>    hardware bugs. Perhaps the most important bug affecting applications
>    is the short loop bug that under certain conditions causes loops to
>    execute only once or twice.
> 
>    R5900 specific handling of SYNC.P, SYNC.L, ERET, etc. are implemented.

I see you already got a few comments including on some of the early
CPU-related patches. I'll start looking through them in detail soon.

Thanks,
    Paul

> 2. Interrupts, a timer and minimal DMA support are implemented.
> 
> 3. System commands (SCMDs) are implemented to identify the hardware model,
>    read and set the real-time clock (RTC), and power off the machine.
> 
> 4. Read-only memory (ROM) operations are implemented. These are used to
>    identify the hardware. ROM operations are also used to resolve IOP
>    libraries linked as firmware, as explained below.
> 
> 6. The input/output processor (IOP) and its sub-system interface (SIF)
>    are supported[2]. The IOP is a MIPS R3000A, or in later models a
>    PowerPC 405GP emulating a MIPS R3000A, sometimes referred to as the
>    sub processor. It runs a separate minikernel implemented in ROM. Most
>    peripherals require, in whole or in part, handling by the IOP.
> 
>    Two IOP services are required to support USB devices: IOP memory
>    allocation and IOP interrupt relay. The latter requires linking a
>    custom IOP module, handled as firmware by the kernel, with library
>    dependency resolution. Remote procedure calls (RPCs) are used to
>    issue bidirectional commands over the SIF, via DMA.
> 
> 7. The Graphics Synthesizer (GS) is the video hardware that displays the
>    frame buffer console. The GS is highly configurable with a substantial
>    set of hardware accelerated features. Its local memory is not directly
>    accessible from the main bus. All drawing primitives are transmitted
>    via DMA[3].
> 
> 8. The frame buffer driver implements console support. The font is stored
>    as textures in local GS memory and several hardware accelerated
>    operations are implemented, for example XPAN, YPAN and YWRAP.
> 
> The o32 ABI is supported, but not yet n32 as it involves some additional
> complications. I would very much like to add support for the 128-bit R5900
> GPRs, for two primary reasons:
> 
> - The 128-bit multimedia instruction set is one of the defining features
>   of the R5900. A respectable PlayStation 2 application ought to use them.
> 
> - The MMIs cannot be disabled by the kernel. MMIs will therefore appear
>   to mostly work, with some occasional register corruption due to context
>   switches, unless the kernel properly saves and restores the 128-bit
>   registers.
> 
> This patch series has been tested with the PlayStation 2 models SCPH-30004,
> SCPH-30004 R, SCPH-37000 L, SCPH-39004, SCPH-50004, SCPH-70004, SCPH-75004
> and SCPH-77004.
> 
> Please consider it for inclusion.
> 
> Fredrik
> 
> References:
> 
> [1] "TX System RISC TX79 Core Architecture" manual, revision 2.0,
>     Toshiba Corporation, https://wiki.qemu.org/File:C790.pdf
> 
> [2] "EE Overview", version 6.0, Sony Computer Entertainment Inc.
> 
> [3] "GS User's Manual", version 6.0, Sony Computer Entertainment Inc.
> 
> Fredrik Noring (120):
>   MIPS: R5900: Initial support for the Emotion Engine in the PlayStation 2
>   MIPS: R5900: Trap the RDHWR instruction as an SQ address exception
>   MIPS: R5900: Sign-extend o32 system call registers
>   MIPS: R5900: Reset bits 127..64 of GPRs in RESTORE_SOME
>   MIPS: R5900: Reset the funnel shift amount (SA) register in RESTORE_SOME
>   MIPS: R5900: Workaround for the short loop bug
>   MIPS: R5900: Add the SYNC.P instruction
>   MIPS: R5900: Add implicit SYNC.P to the UASM_i_M[FT]C0 macros
>   MIPS: R5900: Add mandatory SYNC.P to all M[FT]C0 instructions
>   MIPS: R5900: Workaround exception NOP execution bug (FLX05)
>   MIPS: R5900: Avoid pipeline hazard with the TLBP instruction
>   MIPS: R5900: Avoid pipeline hazards with the TLBW[IR] instructions
>   MIPS: R5900: Avoid pipeline hazard with the TLBR instruction
>   MIPS: R5900: Install final length of TLB refill handler rather than 256 bytes
>   MIPS: R5900: Verify that the TLB refill handler does not overflow
>   MIPS: R5900: The ERET instruction has issues with delay slot and CACHE
>   MIPS: R5900: Define CACHE instruction operation field encodings
>   MIPS: R5900: Workaround where MSB must be 0 for the instruction cache
>   MIPS: R5900: Use SYNC.L for data cache and SYNC.P for instruction cache
>   MIPS: R5900: Define CP0.Config register fields
>   MIPS: R5900: Workaround for CACHE instruction near branch delay slot
>   MIPS: R5900: Support 64-bit inq() and outq() macros in 32-bit kernels
>   MIPS: R5900: Add MFSA and MTSA instructions for the special SA register
>   MIPS: PS2: Define PlayStation 2 I/O port, ROM and RAM address spaces
>   MIPS: PS2: Define interrupt controller, DMA and timer IRQs
>   MIPS: PS2: Interrupt controller (INTC) IRQ support
>   MIPS: PS2: DMAC: Define DMA controller registers
>   MIPS: PS2: DMAC: Define tag structures
>   MIPS: PS2: DMAC: IRQ support
>   MIPS: PS2: Timer support
>   MIPS: PS2: SCMD: System command support
>   MIPS: PS2: SCMD: System power off command
>   MIPS: PS2: SCMD: Read system machine name command
>   MIPS: PS2: SCMD: Read system command for the real-time clock (RTC)
>   MIPS: PS2: SCMD: Set system command for the real-time clock (RTC)
>   MIPS: PS2: ROM: Iterate over the files in a given ROM directory
>   MIPS: PS2: ROM: Find ROM files with a given name, if they exist
>   MIPS: PS2: ROM: Read data for a given ROM file name
>   MIPS: PS2: ROM: Read extended information for a given ROM file
>   MIPS: PS2: ROM: Read and decode the ROMVER file
>   MIPS: PS2: ROM: Resolve the name for the type in the ROMVER file
>   MIPS: PS2: ROM: Resolve the name for the region in the ROMVER file
>   MIPS: PS2: ROM: Permit /dev/mem to access read-only memory
>   MIPS: PS2: ROM: Sysfs module to inspect ROM files
>   MIPS: PS2: ROM: Provide extended file information via sysfs
>   MIPS: PS2: Identify the machine by model name
>   MIPS: PS2: Let the system type be Sony PlayStation 2
>   MIPS: Define and use cpu_relax_forever() for various halting loops
>   MIPS: PS2: Power off support
>   MIPS: PS2: Real-time clock (RTC) driver
>   MIPS: PS2: IOP: I/O processor DMA register PCR2 set and clear
>   MIPS: PS2: SIF: Sub-system interface reset of the I/O processor (IOP)
>   MIPS: PS2: IOP: Define error numbers, descriptions and errno mapping
>   MIPS: PS2: SIF: SIF register write command support
>   MIPS: PS2: SIF: Respond to remote procedure call (RPC) bind command
>   MIPS: PS2: SIF: Respond to RPC bind end command
>   MIPS: PS2: SIF: Reset the SIF0 (sub-to-main) DMA controller
>   MIPS: PS2: SIF: Handle SIF0 (sub-to-main) RPCs via interrupts
>   MIPS: PS2: SIF: Enable the IOP to issue SIF commands
>   MIPS: PS2: SIF: Enable the IOP to issue SIF RPCs
>   MIPS: PS2: SIF: sif_rpc_bind() to request an RPC server connection
>   MIPS: PS2: SIF: sif_rpc_unbind() to release an RPC server connection
>   MIPS: PS2: SIF: sif_rpc() to issue a remote procedure call
>   MIPS: PS2: IOP: Permit /dev/mem to access IOP memory
>   MIPS: PS2: IOP: I/O processor memory support
>   FIXME: Export _dma_cache_{wback,wback_inv,inv}
>   MIPS: PS2: IOP: Module linking support
>   MIPS: PS2: IOP: Verify that modules are IRX objects
>   MIPS: PS2: IOP: Module version compatibility verification
>   MIPS: PS2: IOP: Avoid linking already linked library modules
>   MIPS: PS2: IOP: Resolve module dependencies
>   MIPS: PS2: IOP: SIF printk command support
>   MIPS: PS2: IOP: Heap memory allocate and free
>   MIPS: PS2: SIF: Request RPC IRQ command
>   MIPS: PS2: IOP: IRQ support
>   MIPS: PS2: GS: Define privileged Graphics Synthesizer registers
>   MIPS: PS2: GS: Write privileged registers
>   MIPS: PS2: GS: Read privileged registers
>   MIPS: PS2: GS: Define privileged register structures
>   MIPS: PS2: GS: Define gs_xorq_imr()
>   MIPS: PS2: GS: Privileged register write macros with named fields
>   MIPS: PS2: GS: IRQ support
>   MIPS: PS2: GS: Define Graphics Synthesizer primitive structures
>   MIPS: PS2: GIF: Define Graphics Synthesizer interface structures
>   MIPS: PS2: GIF: Graphics Synthesizer interface support
>   MIPS: PS2: GS: Graphics Synthesizer device init and video clock
>   MIPS: PS2: GS: Compute block count and indices
>   MIPS: PS2: GS: Primitive and texel coordinate transformations
>   MIPS: PS2: GS: Approximate video region with ROM region
>   macro: Extend COUNT_ARGS() from 12 to 32 arguments
>   MIPS: PS2: GS: Show privileged registers with sysfs
>   MIPS: PS2: GS: Store privileged registers with sysfs
>   fbdev: Add fb_warn_once() variant that only prints a warning once
>   MIPS: PS2: FB: Frame buffer driver for the PlayStation 2
>   MIPS: PS2: FB: fb_set_par() standard-definition television support
>   MIPS: PS2: FB: fb_set_par() high-definition television support
>   MIPS: PS2: FB: fb_set_par() VESA computer display mode support
>   MIPS: PS2: FB: Preconfigure standard PAL, NTSC and VESA display modes
>   MIPS: PS2: FB: Reset the Graphics Synthesizer drawing environment
>   MIPS: PS2: FB: Clear the display buffer when changing video modes
>   MIPS: PS2: FB: fb_setcolreg() 256 colour pseudo palette support
>   MIPS: PS2: FB: fb_settile() with font stored as palette indexed textures
>   MIPS: PS2: FB: Hardware accelerated fb_tilecopy() support
>   MIPS: PS2: FB: Hardware accelerated fb_tilefill() support
>   MIPS: PS2: FB: Simplified fb_tileblit() support
>   MIPS: PS2: FB: fb_tilecursor() placeholder
>   MIPS: PS2: FB: Hardware accelerated fb_pan_display() support
>   MIPS: PS2: FB: fb_blank() display power management signaling (DPMS)
>   MIPS: PS2: FB: Disable GIF DMA completion interrupts
>   MIPS: PS2: FB: PAL and NTSC grayscale support
>   MIPS: PS2: FB: Analogue display mode adjustment module parameter
>   USB: OHCI: Support for the PlayStation 2
>   USB: OHCI: OHCI_INTR_MIE workaround for freeze on the PlayStation 2
>   MIPS: PS2: Workaround for unexpected uLaunchELF CP0 Status user mode
>   MIPS: PS2: Define initial PlayStation 2 devices
>   MIPS: PS2: Define workarounds related to the PlayStation 2
>   MIPS: PS2: Define R5900 feature overrides
>   MIPS: PS2: Define the PlayStation 2 platform
>   MIPS: PS2: Initial support for the Sony PlayStation 2
>   MIPS: Fix name of BOOT_MEM_ROM_DATA
> 
>  arch/mips/Kbuild.platforms                    |    1 +
>  arch/mips/Kconfig                             |   35 +-
>  arch/mips/Makefile                            |    1 +
>  arch/mips/alchemy/board-gpr.c                 |    7 +-
>  arch/mips/alchemy/board-mtx1.c                |    7 +-
>  arch/mips/alchemy/board-xxs1500.c             |    7 +-
>  arch/mips/alchemy/devboards/platform.c        |    4 +-
>  arch/mips/ar7/setup.c                         |    4 +-
>  arch/mips/ath79/setup.c                       |    8 +-
>  arch/mips/bcm47xx/setup.c                     |    9 +-
>  arch/mips/bcm63xx/setup.c                     |   12 +-
>  arch/mips/boot/compressed/decompress.c        |    4 +-
>  arch/mips/boot/compressed/head.S              |   16 +-
>  arch/mips/cavium-octeon/smp.c                 |    4 +-
>  arch/mips/cobalt/reset.c                      |    5 +-
>  arch/mips/emma/markeins/setup.c               |    5 +-
>  arch/mips/fw/arc/init.c                       |    4 +-
>  arch/mips/include/asm/asmmacro.h              |   53 +
>  arch/mips/include/asm/cacheops.h              |   17 +
>  arch/mips/include/asm/cpu-type.h              |    4 +
>  arch/mips/include/asm/cpu.h                   |    3 +-
>  arch/mips/include/asm/io.h                    |   60 +-
>  arch/mips/include/asm/irqflags.h              |   15 +
>  .../asm/mach-ps2/cpu-feature-overrides.h      |   35 +
>  arch/mips/include/asm/mach-ps2/dmac.h         |  254 ++
>  arch/mips/include/asm/mach-ps2/gif.h          |   77 +
>  arch/mips/include/asm/mach-ps2/gs-registers.h |  646 +++++
>  arch/mips/include/asm/mach-ps2/gs.h           |   81 +
>  arch/mips/include/asm/mach-ps2/iop-error.h    |   76 +
>  arch/mips/include/asm/mach-ps2/iop-heap.h     |   19 +
>  arch/mips/include/asm/mach-ps2/iop-memory.h   |   21 +
>  arch/mips/include/asm/mach-ps2/iop-module.h   |   13 +
>  .../mips/include/asm/mach-ps2/iop-registers.h |   19 +
>  arch/mips/include/asm/mach-ps2/iop.h          |   21 +
>  arch/mips/include/asm/mach-ps2/irq.h          |  130 +
>  arch/mips/include/asm/mach-ps2/rom.h          |  171 ++
>  arch/mips/include/asm/mach-ps2/scmd.h         |   56 +
>  arch/mips/include/asm/mach-ps2/sif.h          |   94 +
>  arch/mips/include/asm/mach-ps2/war.h          |   24 +
>  arch/mips/include/asm/mipsregs.h              |  103 +
>  arch/mips/include/asm/module.h                |    2 +
>  arch/mips/include/asm/processor.h             |    6 +
>  arch/mips/include/asm/r4kcache.h              |  244 +-
>  arch/mips/include/asm/stackframe.h            |  108 +
>  arch/mips/include/asm/string.h                |    3 +
>  arch/mips/include/asm/traps.h                 |    2 +
>  arch/mips/include/asm/uasm.h                  |   23 +
>  arch/mips/include/uapi/asm/gif.h              |  164 ++
>  arch/mips/include/uapi/asm/gs.h               |  723 +++++
>  arch/mips/jz4740/reset.c                      |    9 +-
>  arch/mips/kernel/cpu-probe.c                  |    8 +
>  arch/mips/kernel/genex.S                      |   65 +
>  arch/mips/kernel/head.S                       |    9 +
>  arch/mips/kernel/r4k_switch.S                 |    9 +
>  arch/mips/kernel/scall32-o32.S                |   12 +
>  arch/mips/kernel/setup.c                      |    6 +-
>  arch/mips/kernel/traps.c                      |   19 +-
>  arch/mips/kernel/unaligned.c                  |   36 +-
>  arch/mips/lib/delay.c                         |    7 +-
>  arch/mips/lib/memset.S                        |    2 +
>  arch/mips/loongson64/common/reset.c           |   16 +-
>  arch/mips/mm/Makefile                         |    1 +
>  arch/mips/mm/c-r4k.c                          |   27 +-
>  arch/mips/mm/cache.c                          |    4 +
>  arch/mips/mm/cerr-sb1.c                       |    4 +-
>  arch/mips/mm/cex-gen.S                        |    6 +
>  arch/mips/mm/tlbex-fault.S                    |    3 +
>  arch/mips/mm/tlbex.c                          |   94 +-
>  arch/mips/mm/uasm-mips.c                      |    1 +
>  arch/mips/mm/uasm.c                           |    5 +-
>  arch/mips/pic32/common/reset.c                |    9 +-
>  arch/mips/pnx833x/common/reset.c              |    5 +-
>  arch/mips/ps2/Kconfig                         |   16 +
>  arch/mips/ps2/Makefile                        |   12 +
>  arch/mips/ps2/Platform                        |    7 +
>  arch/mips/ps2/devices.c                       |   98 +
>  arch/mips/ps2/dmac-irq.c                      |  102 +
>  arch/mips/ps2/identify.c                      |   86 +
>  arch/mips/ps2/intc-irq.c                      |  118 +
>  arch/mips/ps2/irq.c                           |   38 +
>  arch/mips/ps2/memory.c                        |   45 +
>  arch/mips/ps2/prom.c                          |   18 +
>  arch/mips/ps2/reboot.c                        |   29 +
>  arch/mips/ps2/rom-sysfs.c                     |  392 +++
>  arch/mips/ps2/rom.c                           |  702 +++++
>  arch/mips/ps2/scmd.c                          |  379 +++
>  arch/mips/ps2/time.c                          |  153 ++
>  arch/mips/sgi-ip22/ip22-reset.c               |    3 +-
>  arch/mips/sgi-ip27/ip27-berr.c                |    4 +-
>  arch/mips/sgi-ip27/ip27-reset.c               |   13 +-
>  arch/mips/sgi-ip32/ip32-berr.c                |    4 +-
>  arch/mips/sgi-ip32/ip32-irq.c                 |    3 +-
>  arch/mips/sibyte/common/cfe.c                 |    3 +-
>  arch/mips/txx9/rbtx4939/setup.c               |    4 +-
>  arch/mips/vr41xx/common/pmu.c                 |    2 +-
>  drivers/Makefile                              |    1 +
>  drivers/ps2/Makefile                          |   12 +
>  drivers/ps2/gif.c                             |  106 +
>  drivers/ps2/gs-irq.c                          |   93 +
>  drivers/ps2/gs-registers.c                    |  189 ++
>  drivers/ps2/gs-sysfs.c                        |  592 +++++
>  drivers/ps2/gs.c                              |  319 +++
>  drivers/ps2/iop-heap.c                        |   90 +
>  drivers/ps2/iop-irq.c                         |  186 ++
>  drivers/ps2/iop-memory.c                      |   56 +
>  drivers/ps2/iop-module.c                      |  954 +++++++
>  drivers/ps2/iop-registers.c                   |   39 +
>  drivers/ps2/sif.c                             |  888 +++++++
>  drivers/rtc/Kconfig                           |   10 +
>  drivers/rtc/Makefile                          |    1 +
>  drivers/rtc/rtc-ps2.c                         |   74 +
>  drivers/usb/host/Kconfig                      |    8 +
>  drivers/usb/host/Makefile                     |    1 +
>  drivers/usb/host/ohci-ps2.c                   |  264 ++
>  drivers/video/fbdev/Kconfig                   |   12 +
>  drivers/video/fbdev/Makefile                  |    1 +
>  drivers/video/fbdev/ps2fb.c                   | 2362 +++++++++++++++++
>  include/linux/console_struct.h                |    2 +
>  include/linux/fb.h                            |    2 +
>  include/linux/kernel.h                        |   12 +-
>  include/uapi/linux/fb.h                       |    1 +
>  121 files changed, 12077 insertions(+), 186 deletions(-)
>  create mode 100644 arch/mips/include/asm/mach-ps2/cpu-feature-overrides.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/dmac.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/gif.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/gs-registers.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/gs.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop-error.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop-heap.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop-memory.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop-module.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop-registers.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/iop.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/irq.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/rom.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/scmd.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/sif.h
>  create mode 100644 arch/mips/include/asm/mach-ps2/war.h
>  create mode 100644 arch/mips/include/uapi/asm/gif.h
>  create mode 100644 arch/mips/include/uapi/asm/gs.h
>  create mode 100644 arch/mips/ps2/Kconfig
>  create mode 100644 arch/mips/ps2/Makefile
>  create mode 100644 arch/mips/ps2/Platform
>  create mode 100644 arch/mips/ps2/devices.c
>  create mode 100644 arch/mips/ps2/dmac-irq.c
>  create mode 100644 arch/mips/ps2/identify.c
>  create mode 100644 arch/mips/ps2/intc-irq.c
>  create mode 100644 arch/mips/ps2/irq.c
>  create mode 100644 arch/mips/ps2/memory.c
>  create mode 100644 arch/mips/ps2/prom.c
>  create mode 100644 arch/mips/ps2/reboot.c
>  create mode 100644 arch/mips/ps2/rom-sysfs.c
>  create mode 100644 arch/mips/ps2/rom.c
>  create mode 100644 arch/mips/ps2/scmd.c
>  create mode 100644 arch/mips/ps2/time.c
>  create mode 100644 drivers/ps2/Makefile
>  create mode 100644 drivers/ps2/gif.c
>  create mode 100644 drivers/ps2/gs-irq.c
>  create mode 100644 drivers/ps2/gs-registers.c
>  create mode 100644 drivers/ps2/gs-sysfs.c
>  create mode 100644 drivers/ps2/gs.c
>  create mode 100644 drivers/ps2/iop-heap.c
>  create mode 100644 drivers/ps2/iop-irq.c
>  create mode 100644 drivers/ps2/iop-memory.c
>  create mode 100644 drivers/ps2/iop-module.c
>  create mode 100644 drivers/ps2/iop-registers.c
>  create mode 100644 drivers/ps2/sif.c
>  create mode 100644 drivers/rtc/rtc-ps2.c
>  create mode 100644 drivers/usb/host/ohci-ps2.c
>  create mode 100644 drivers/video/fbdev/ps2fb.c
> 
> -- 
> 2.21.0
>
Fredrik Noring Sept. 5, 2019, 6:32 p.m. UTC | #2
> Wow - you've been busy, this patchset is huge!

I started in 2017 with a 2.6.35.14 patchset[1] maintained by Jürgen Urban,
and ported it through 3.x, 4.x and 5.x to present day. The history goes
back to 2.2.1[2] when Sony released a Linux kit.

Maciej W. Rozycki and Jürgen Urban have been very helpful along the way.

Most of the drivers in the 2.6 series are not present in this initial
patchset. It is supposed to be fairly small, after all. Most of the other
parts from 2.6 were eventually removed, reworked or expanded.

For example, the 2.6 kernel uses BIOS routines for certain services. The
BIOS is discarded and the kernel handles the hardware directly in this
patchset. Arbitrary video mode lines are now supported. The 2.6 kernel
supported n32, and 128-bit GPRs, but this patchset supports only o32,
and only 32-bit GPRs although I very much hope we can retain the support
for 128-bit GPRs, as suggested in the patchset cover letter, as that is
a defining feature of the R5900.

The input/output processor (IOP) modules, handled as firmware by the
kernel, have also been reworked and updated for a modern compiler[3].

Some ideas and discussions on further development etc. can be found here:

https://github.com/frno7/linux/issues

> I think we may be best to split this up into 8 (or more) different
> patchsets along these lines. In my experience large patchsets that touch
> lots of different subsystems are very difficult to get merged, so I'd
> suggest maybe we start with just the CPU support for arch/mips/ & if you
> have the bandwidth you could submit drivers to other subsystem
> maintainers in parallel.

Sure!

> I see you already got a few comments including on some of the early
> CPU-related patches. I'll start looking through them in detail soon.

Great, thanks!

Fredrik

References:

[1] https://github.com/frno7/linux/tree/ps2-v2.6.35.14

[2] https://github.com/frno7/linux/tree/ps2-v2.2.1

[3] https://github.com/frno7/iopmod