blob: 81c8a9a4b484ab89ad4923338e3770a97aaff9b2 [file] [log] [blame] [edit]
// Copyright 2022 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_INTEL_DISPLAY_HDMI_DISPLAY_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_HDMI_DISPLAY_H_
#include <lib/mmio/mmio-buffer.h>
#include <threads.h>
#include <zircon/compiler.h>
#include <zircon/types.h>
#include <cstddef>
#include <cstdint>
#include <optional>
#include <fbl/vector.h>
#include "src/graphics/display/drivers/intel-display/ddi-physical-layer-manager.h"
#include "src/graphics/display/drivers/intel-display/display-device.h"
#include "src/graphics/display/drivers/intel-display/dpll.h"
#include "src/graphics/display/drivers/intel-display/hardware-common.h"
#include "src/graphics/display/drivers/intel-display/i2c/gmbus-i2c.h"
#include "src/graphics/display/lib/api-types/cpp/display-id.h"
#include "src/graphics/display/lib/api-types/cpp/display-timing.h"
#include "src/graphics/display/lib/edid/edid.h"
namespace intel_display {
class HdmiDisplay final : public DisplayDevice {
public:
// `controller` and `gmbus_i2c` must be non-null and must outlive
// `HdmiDisplay`.
HdmiDisplay(Controller* controller, display::DisplayId id, DdiId ddi_id,
DdiReference ddi_reference, GMBusI2c* gmbus_i2c);
HdmiDisplay(const HdmiDisplay&) = delete;
HdmiDisplay(HdmiDisplay&&) = delete;
HdmiDisplay& operator=(const HdmiDisplay&) = delete;
HdmiDisplay& operator=(HdmiDisplay&&) = delete;
~HdmiDisplay() override;
bool InitDdi() final;
bool Query() final;
bool DdiModeset(const display::DisplayTiming& mode) final;
bool PipeConfigPreamble(const display::DisplayTiming& mode, PipeId pipe_id,
TranscoderId transcoder_id) final;
bool PipeConfigEpilogue(const display::DisplayTiming& mode, PipeId pipe_id,
TranscoderId transcoder_id) final;
DdiPllConfig ComputeDdiPllConfig(int32_t pixel_clock_khz) final;
// Hdmi doesn't need the clock rate when changing the transcoder
int32_t LoadPixelRateForTranscoderKhz(TranscoderId transcoder_id) final { return 0; }
bool CheckPixelRate(int64_t pixel_rate_hz) final;
AddedDisplayInfo CreateAddedDisplayInfo() override;
std::optional<display::DisplayTiming> GetDisplayTiming(display::ModeId mode_id) const override;
private:
GMBusI2c& gmbus_i2c_;
// Initialized in `Query()`.
std::optional<edid::Edid> edid_;
// Initialized in `Query()`.
// The timing parameter at index `k` corresponds to ModeId `k+1`.
fbl::Vector<display::DisplayTiming> timings_;
};
} // namespace intel_display
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_HDMI_DISPLAY_H_