blob: c0ff6b1d3698f14826eb50769635fc94035f1808 [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 SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_VPU_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_VPU_H_
#include <fidl/fuchsia.hardware.platform.device/cpp/wire.h>
#include <lib/mmio/mmio-buffer.h>
#include <lib/zx/result.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <cstdint>
#include <memory>
#include <fbl/auto_lock.h>
#include <fbl/mutex.h>
#include "src/graphics/display/drivers/amlogic-display/common.h"
namespace amlogic_display {
// Mode of color space conversion from the internal Video Input Unit (VIU) to
// the Video output module (Vout) by the Video Post Processor (VPP).
enum class ColorSpaceConversionMode {
kRgbInternalRgbOut,
kRgbInternalYuvOut,
};
// TODO(https://fxbug.dev/42076950): `Vpu` currently contains multiple relatively
// independent units of the greater Video Processing Unit (VPU) including power
// control, AFBC engine control, Video Post-processing matrices and capture
// engine. These functional units should be split into different classes.
class Vpu {
public:
// Factory method intended for production use.
//
// `platform_device` must be valid.
static zx::result<std::unique_ptr<Vpu>> Create(
fidl::UnownedClientEnd<fuchsia_hardware_platform_device::Device> platform_device);
// Production code should prefer the `Create()` factory method.
//
// `vpu_mmio` is the region documented as "VPU" in Section 8.1 "Memory Map"
// of the AMLogic A311D datasheet. It must be valid.
//
// `hhi_mmio` is the region documented as "HIU" in Section 8.1 "Memory Map"
// of the AMLogic A311D datasheet. It must be valid.
//
// `aobus_mmio` is the region documented as "RTI" in Section 8.1 "Memory Map"
// of the AMLogic A311D datasheet. It must be valid.
//
// `reset_mmio` is the region documented as "RESET" in Section 8.1
// "Memory Map" of the AMLogic A311D datasheet. It must be valid.
Vpu(fdf::MmioBuffer vpu_mmio, fdf::MmioBuffer hhi_mmio, fdf::MmioBuffer aobus_mmio,
fdf::MmioBuffer reset_mmio);
~Vpu() = default;
// Disallows copying and moving.
Vpu(const Vpu&) = delete;
Vpu(Vpu&&) = delete;
Vpu& operator=(const Vpu&) = delete;
Vpu& operator=(Vpu&&) = delete;
// Powers on the hardware.
void PowerOn();
// Powers off the hardware.
void PowerOff();
// Sets up video post processor (VPP) output interfaces.
// The hardware must be powered on.
void SetupPostProcessorOutputInterface();
// Sets up video post processor (VPP) color conversion matrices.
// The hardware must be powered on.
void SetupPostProcessorColorConversion(ColorSpaceConversionMode mode);
// Claims the ownership of the driver by changing the hardware state.
// The hardware state change reflects that the driver owns and drives
// the hardware and it can survive driver reloads.
//
// Returns true iff the hardware was owned by a different driver.
bool CheckAndClaimHardwareOwnership();
// Powers on/off AFBC Engine.
// The main power of the Video Processing Unit must be powered on.
void AfbcPower(bool power_on);
zx_status_t CaptureInit(uint8_t canvas_idx, uint32_t height, uint32_t stride);
zx_status_t CaptureStart();
zx_status_t CaptureDone();
void CapturePrintRegisters();
CaptureState GetCaptureState() {
fbl::AutoLock lock(&capture_mutex_);
return capture_state_;
}
private:
// This function configures the VPU-related clocks. It contains undocumented registers
// and/or clock initialization sequences
void ConfigureClock();
fdf::MmioBuffer vpu_mmio_;
fdf::MmioBuffer hhi_mmio_;
fdf::MmioBuffer aobus_mmio_;
fdf::MmioBuffer reset_mmio_;
uint32_t first_time_load_ = false;
fbl::Mutex capture_mutex_;
CaptureState capture_state_ __TA_GUARDED(capture_mutex_);
};
} // namespace amlogic_display
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_AMLOGIC_DISPLAY_VPU_H_