From 950f68e3b2b5322eab76e73ece031b08039d4b80 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Mon, 16 Aug 2021 16:09:16 -0500 Subject: [PATCH] kernel/uart: Fix PPC, drop needless abstraction Change-Id: I4b8f69271ede117701725f9cce30de5bb8ba30bb Reviewed-on: https://review.haiku-os.org/c/haiku/+/4332 Reviewed-by: Alex von Gluck IV Reviewed-by: Jessica Hamilton --- .../kernel/arch/generic/debug_uart_8250.h | 3 + .../kernel/arch/generic/debug_uart_8250.cpp | 12 ++++ src/system/kernel/arch/ppc/Jamfile | 1 - src/system/kernel/arch/ppc/arch_platform.cpp | 56 +++++++++---------- src/system/kernel/arch/ppc/arch_uart_8250.cpp | 45 --------------- 5 files changed, 43 insertions(+), 74 deletions(-) delete mode 100644 src/system/kernel/arch/ppc/arch_uart_8250.cpp diff --git a/headers/private/kernel/arch/generic/debug_uart_8250.h b/headers/private/kernel/arch/generic/debug_uart_8250.h index fad17be4ce..e8edf8552d 100644 --- a/headers/private/kernel/arch/generic/debug_uart_8250.h +++ b/headers/private/kernel/arch/generic/debug_uart_8250.h @@ -4,6 +4,7 @@ * * Authors: * François Revol, revol@free.fr + * Alexander von Gluck IV, kallisti5@unixzen.com */ #ifndef _KERNEL_ARCH_DEBUG_UART_8250_H #define _KERNEL_ARCH_DEBUG_UART_8250_H @@ -30,6 +31,8 @@ public: void FlushTx(); void FlushRx(); + + virtual void Barrier(); }; diff --git a/src/system/kernel/arch/generic/debug_uart_8250.cpp b/src/system/kernel/arch/generic/debug_uart_8250.cpp index 7de1ad4703..240c8047e5 100644 --- a/src/system/kernel/arch/generic/debug_uart_8250.cpp +++ b/src/system/kernel/arch/generic/debug_uart_8250.cpp @@ -177,6 +177,18 @@ DebugUART8250::FlushRx() } +void +DebugUART8250::Barrier() +{ + // Simple memory barriers +#if defined(__POWERPC__) + asm volatile("eieio; sync"); +#elif defined(__ARM__) + asm volatile ("" : : : "memory"); +#endif +} + + DebugUART8250* arch_get_uart_8250(addr_t base, int64 clock) { diff --git a/src/system/kernel/arch/ppc/Jamfile b/src/system/kernel/arch/ppc/Jamfile index e8578682f8..8af2ede337 100644 --- a/src/system/kernel/arch/ppc/Jamfile +++ b/src/system/kernel/arch/ppc/Jamfile @@ -57,7 +57,6 @@ KernelMergeObject kernel_arch_ppc.o : # serial uart debug_uart_8250.cpp - arch_uart_8250.cpp # paging generic_vm_physical_page_mapper.cpp diff --git a/src/system/kernel/arch/ppc/arch_platform.cpp b/src/system/kernel/arch/ppc/arch_platform.cpp index f7b621ab59..c20efe5040 100644 --- a/src/system/kernel/arch/ppc/arch_platform.cpp +++ b/src/system/kernel/arch/ppc/arch_platform.cpp @@ -15,24 +15,22 @@ #include #include -#include "fdt_serial.h" void *gFDT; static PPCPlatform *sPPCPlatform; -// constructor PPCPlatform::PPCPlatform(ppc_platform_type platformType) : fPlatformType(platformType) { } -// destructor + PPCPlatform::~PPCPlatform() { } -// Default + PPCPlatform * PPCPlatform::Default() { @@ -72,12 +70,13 @@ private: } // namespace BPrivate + using BPrivate::PPCOpenFirmware; // OF debugger commands -// debug_command_of_exit + static int debug_command_of_exit(int argc, char **argv) { @@ -86,7 +85,7 @@ debug_command_of_exit(int argc, char **argv) return 0; } -// debug_command_of_enter + static int debug_command_of_enter(int argc, char **argv) { @@ -95,7 +94,6 @@ debug_command_of_enter(int argc, char **argv) } -// constructor PPCOpenFirmware::PPCOpenFirmware() : PPCPlatform(PPC_PLATFORM_OPEN_FIRMWARE), fInput(-1), @@ -104,12 +102,12 @@ PPCOpenFirmware::PPCOpenFirmware() { } -// destructor + PPCOpenFirmware::~PPCOpenFirmware() { } -// Init + status_t PPCOpenFirmware::Init(struct kernel_args *kernelArgs) { @@ -117,7 +115,7 @@ PPCOpenFirmware::Init(struct kernel_args *kernelArgs) (intptr_t(*)(void*))kernelArgs->platform_args.openfirmware_entry); } -// InitSerialDebug + status_t PPCOpenFirmware::InitSerialDebug(struct kernel_args *kernelArgs) { @@ -131,7 +129,7 @@ PPCOpenFirmware::InitSerialDebug(struct kernel_args *kernelArgs) return B_OK; } -// InitPostVM + status_t PPCOpenFirmware::InitPostVM(struct kernel_args *kernelArgs) { @@ -144,6 +142,7 @@ PPCOpenFirmware::InitPostVM(struct kernel_args *kernelArgs) return B_OK; } + // InitRTC status_t PPCOpenFirmware::InitRTC(struct kernel_args *kernelArgs, @@ -159,7 +158,7 @@ PPCOpenFirmware::InitRTC(struct kernel_args *kernelArgs, return B_OK; } -// DebugSerialGetChar + char PPCOpenFirmware::SerialDebugGetChar() { @@ -169,7 +168,7 @@ PPCOpenFirmware::SerialDebugGetChar() return (char)key; } -// DebugSerialPutChar + void PPCOpenFirmware::SerialDebugPutChar(char c) { @@ -182,7 +181,7 @@ PPCOpenFirmware::SerialDebugPutChar(char c) of_write(fOutput, &c, 1); } -// SetHardwareRTC + void PPCOpenFirmware::SetHardwareRTC(uint32 seconds) { @@ -198,7 +197,7 @@ PPCOpenFirmware::SetHardwareRTC(uint32 seconds) } } -// GetHardwareRTC + uint32 PPCOpenFirmware::GetHardwareRTC() { @@ -215,7 +214,7 @@ PPCOpenFirmware::GetHardwareRTC() return rtc_tm_to_secs(&t); } -// ShutDown + void PPCOpenFirmware::ShutDown(bool reboot) { @@ -264,7 +263,6 @@ private: using BPrivate::PPCUBoot; -// constructor PPCUBoot::PPCUBoot() : PPCPlatform(PPC_PLATFORM_U_BOOT), fInput(-1), @@ -274,12 +272,12 @@ PPCUBoot::PPCUBoot() { } -// destructor + PPCUBoot::~PPCUBoot() { } -// Init + status_t PPCUBoot::Init(struct kernel_args *kernelArgs) { @@ -288,24 +286,25 @@ PPCUBoot::Init(struct kernel_args *kernelArgs) return B_OK; } -// InitSerialDebug + status_t PPCUBoot::InitSerialDebug(struct kernel_args *kernelArgs) { - fDebugUART = debug_uart_from_fdt(gFDT); + // TODO: get relevant debug uart from fdt + //fDebugUART = debug_uart_from_fdt(gFDT); if (fDebugUART == NULL) return B_ERROR; return B_OK; } -// InitPostVM + status_t PPCUBoot::InitPostVM(struct kernel_args *kernelArgs) { return B_ERROR; } -// InitRTC + status_t PPCUBoot::InitRTC(struct kernel_args *kernelArgs, struct real_time_data *data) @@ -313,7 +312,7 @@ PPCUBoot::InitRTC(struct kernel_args *kernelArgs, return B_ERROR; } -// DebugSerialGetChar + char PPCUBoot::SerialDebugGetChar() { @@ -322,7 +321,7 @@ PPCUBoot::SerialDebugGetChar() return 0; } -// DebugSerialPutChar + void PPCUBoot::SerialDebugPutChar(char c) { @@ -330,20 +329,20 @@ PPCUBoot::SerialDebugPutChar(char c) fDebugUART->PutChar(c); } -// SetHardwareRTC + void PPCUBoot::SetHardwareRTC(uint32 seconds) { } -// GetHardwareRTC + uint32 PPCUBoot::GetHardwareRTC() { return 0; } -// ShutDown + void PPCUBoot::ShutDown(bool reboot) { @@ -357,6 +356,7 @@ PPCUBoot::ShutDown(bool reboot) // static buffer for constructing the actual PPCPlatform static char *sPPCPlatformBuffer[PLATFORM_BUFFER_SIZE]; + status_t arch_platform_init(struct kernel_args *kernelArgs) { diff --git a/src/system/kernel/arch/ppc/arch_uart_8250.cpp b/src/system/kernel/arch/ppc/arch_uart_8250.cpp deleted file mode 100644 index 15894de3b2..0000000000 --- a/src/system/kernel/arch/ppc/arch_uart_8250.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012, François Revol, revol@free.fr - * Distributed under the terms of the MIT License. - */ - -#include -#include -#include -#include - - -class ArchUART8250 : public DebugUART8250 { -public: - ArchUART8250(addr_t base, int64 clock); - ~ArchUART8250(); - - virtual void Barrier(); -}; - - -ArchUART8250::ArchUART8250(addr_t base, int64 clock) - : DebugUART8250(base, clock) -{ -} - - -ArchUART8250::~ArchUART8250() -{ -} - - -void -ArchUART8250::Barrier() -{ - eieio(); -} - - -DebugUART8250 *arch_get_uart_8250(addr_t base, int64 clock) -{ - static char buffer[sizeof(ArchUART8250)]; - ArchUART8250 *uart = new(buffer) ArchUART8250(base, clock); - return uart; -} -