blob: 7c4534347aa33c328f9f7856a704d5c75935ce12 [file] [log] [blame]
// Copyright 2018 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 GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_DECODER_CORE_H_
#define GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_DECODER_CORE_H_
#include <ddk/io-buffer.h>
#include <zx/handle.h>
#include "memory_barriers.h"
#include "registers.h"
struct MmioRegisters {
DosRegisterIo* dosbus;
AoRegisterIo* aobus;
DmcRegisterIo* dmc;
HiuRegisterIo* hiubus;
ResetRegisterIo* reset;
};
struct InputContext {
~InputContext() {
BarrierBeforeRelease();
io_buffer_release(&buffer);
}
io_buffer_t buffer = {};
uint32_t processed_video = 0;
};
enum class DeviceType;
class DecoderCore {
public:
class Owner {
public:
virtual __WARN_UNUSED_RESULT zx_handle_t bti() = 0;
virtual __WARN_UNUSED_RESULT MmioRegisters* mmio() = 0;
virtual void UngateClocks() = 0;
virtual void GateClocks() = 0;
virtual __WARN_UNUSED_RESULT DeviceType device_type() = 0;
};
virtual ~DecoderCore() {}
virtual __WARN_UNUSED_RESULT zx_status_t LoadFirmware(const uint8_t* data,
uint32_t len) = 0;
virtual void PowerOn() = 0;
virtual void PowerOff() = 0;
virtual void StartDecoding() = 0;
virtual void StopDecoding() = 0;
virtual void WaitForIdle() = 0;
virtual void InitializeStreamInput(bool use_parser, uint32_t buffer_address,
uint32_t buffer_size) = 0;
virtual void InitializeParserInput() = 0;
virtual void InitializeDirectInput() = 0;
// The write pointer points to just after the last thing that was written into
// the stream buffer.
virtual void UpdateWritePointer(uint32_t write_pointer) = 0;
// This is the offset between the start of the stream buffer and the write
// pointer.
virtual __WARN_UNUSED_RESULT uint32_t GetStreamInputOffset() = 0;
virtual __WARN_UNUSED_RESULT uint32_t GetReadOffset() = 0;
virtual __WARN_UNUSED_RESULT zx_status_t
InitializeInputContext(InputContext* context) {
return ZX_ERR_NOT_SUPPORTED;
}
virtual void SaveInputContext(InputContext* context) {}
virtual void RestoreInputContext(InputContext* context) {}
};
#endif // GARNET_DRIVERS_VIDEO_AMLOGIC_DECODER_DECODER_CORE_H_