1e7e0e8acSRob Bradford // Portions Copyright 2017 The Chromium OS Authors. All rights reserved. 2e7e0e8acSRob Bradford // Use of this source code is governed by a BSD-style license that can be 3e7e0e8acSRob Bradford // found in the LICENSE-BSD-3-Clause file. 4e7e0e8acSRob Bradford // 5e7e0e8acSRob Bradford // Copyright © 2020 Intel Corporation 6e7e0e8acSRob Bradford // 7e7e0e8acSRob Bradford // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause 8e7e0e8acSRob Bradford // 9e7e0e8acSRob Bradford 101fc6d50fSRob Bradford use std::sync::{Arc, Barrier}; 11*88a9f799SRob Bradford 1215025d71SRob Bradford use vm_device::BusDevice; 13e7e0e8acSRob Bradford 14e7e0e8acSRob Bradford /// Provides firmware debug output via I/O port controls 15e7e0e8acSRob Bradford #[derive(Default)] 16e7e0e8acSRob Bradford pub struct FwDebugDevice {} 17e7e0e8acSRob Bradford 18e7e0e8acSRob Bradford impl FwDebugDevice { new() -> Self19e7e0e8acSRob Bradford pub fn new() -> Self { 20e7e0e8acSRob Bradford Self {} 21e7e0e8acSRob Bradford } 22e7e0e8acSRob Bradford } 23e7e0e8acSRob Bradford 24e7e0e8acSRob Bradford /// FwDebugDevice sits on the I/O bus as 0x402 and receives ASCII characters 25e7e0e8acSRob Bradford impl BusDevice for FwDebugDevice { 26e7e0e8acSRob Bradford /// Upon read return the magic value to indicate that there is a debug port read(&mut self, _base: u64, _offset: u64, data: &mut [u8])27e7e0e8acSRob Bradford fn read(&mut self, _base: u64, _offset: u64, data: &mut [u8]) { 28e7e0e8acSRob Bradford if data.len() == 1 { 29e7e0e8acSRob Bradford data[0] = 0xe9 30e7e0e8acSRob Bradford } else { 31e7e0e8acSRob Bradford error!("Invalid read size on debug port: {}", data.len()) 32e7e0e8acSRob Bradford } 33e7e0e8acSRob Bradford } 34e7e0e8acSRob Bradford write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>>351fc6d50fSRob Bradford fn write(&mut self, _base: u64, _offset: u64, data: &[u8]) -> Option<Arc<Barrier>> { 36e7e0e8acSRob Bradford if data.len() == 1 { 37e7e0e8acSRob Bradford print!("{}", data[0] as char); 38e7e0e8acSRob Bradford } else { 39e7e0e8acSRob Bradford error!("Invalid write size on debug port: {}", data.len()) 40e7e0e8acSRob Bradford } 411fc6d50fSRob Bradford 421fc6d50fSRob Bradford None 43e7e0e8acSRob Bradford } 44e7e0e8acSRob Bradford } 45