| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIB_UART_QEMU_H_ |
| #define LIB_UART_QEMU_H_ |
| |
| // QEMU-only tests and boot shims hard-code a particular driver configuration. |
| |
| #include "ns8250.h" |
| #include "null.h" |
| #include "pl011.h" |
| #include "uart.h" |
| |
| namespace uart { |
| namespace qemu { |
| |
| // uart::qemu::Driver is a default-constructible UartDriver type. |
| |
| #ifdef __aarch64__ |
| |
| struct Driver : public pl011::Driver { |
| Driver(zbi_dcfg_simple_t cfg = pl011::kQemuConfig) : pl011::Driver(cfg) {} |
| }; |
| |
| #elif defined(__x86_64__) || defined(__i386__) |
| |
| struct Driver : public ns8250::PioDriver { |
| explicit Driver(zbi_dcfg_simple_pio_t cfg = ns8250::kLegacyConfig) : ns8250::PioDriver(cfg) {} |
| }; |
| |
| #elif defined(__riscv) |
| |
| struct Driver : public ns8250::Mmio8Driver { |
| static constexpr zbi_dcfg_simple_t kQemuConfig = { |
| .mmio_phys = 0x10000000, |
| .irq = 10, |
| }; |
| |
| explicit Driver(zbi_dcfg_simple_t cfg = kQemuConfig) : ns8250::Mmio8Driver(cfg) {} |
| }; |
| |
| #else |
| |
| using Driver = null::Driver; |
| |
| #endif |
| |
| // uart::qemu::KernelDriver is default-constructible and usable right away. |
| |
| template <template <typename, IoRegisterType> class IoProvider = BasicIoProvider, |
| typename Sync = UnsynchronizedPolicy> |
| using KernelDriver = uart::KernelDriver<Driver, IoProvider, Sync>; |
| |
| } // namespace qemu |
| } // namespace uart |
| |
| #endif // LIB_UART_QEMU_H_ |