blob: 37e2e9c138d01f207ef2d5dad04546b297367d30 [file] [log] [blame]
// Copyright 2017 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.
#pragma once
#include "display-device.h"
#include "dpcd.h"
#include "edid.h"
namespace i915 {
class DpAuxMessage;
class DpDisplay : public DisplayDevice, private edid::EdidSource {
public:
DpDisplay(Controller* controller, registers::Ddi ddi, registers::Pipe pipe);
private:
bool Init(zx_display_info* info) final;
bool ReadEdid(uint8_t segment, uint8_t offset, uint8_t* buf, uint8_t len) final;
bool DpAuxRead(uint32_t dp_cmd, uint32_t addr, uint8_t* buf, uint32_t size);
bool DpAuxReadChunk(uint32_t dp_cmd, uint32_t addr, uint8_t* buf, uint32_t size_in,
uint32_t* size_out);
bool DpAuxWrite(uint32_t dp_cmd, uint32_t addr, const uint8_t* buf, uint32_t size);
bool SendDpAuxMsg(const DpAuxMessage& request, DpAuxMessage* reply, bool* timeout_result);
bool SendDpAuxMsgWithRetry(const DpAuxMessage& request, DpAuxMessage* reply);
bool DpcdRead(uint32_t addr, uint8_t* buf, uint32_t size);
bool DpcdWrite(uint32_t addr, const uint8_t* buf, uint32_t size);
bool DpcdRequestLinkTraining(const dpcd::TrainingPatternSet& tp_set,
const dpcd::TrainingLaneSet lanes[]);
template<uint32_t addr, typename T> bool DpcdReadPairedRegs(
hwreg::RegisterBase<T, typename T::ValueType>* status);
bool DpcdHandleAdjustRequest(dpcd::TrainingLaneSet* training, dpcd::AdjustRequestLane* adjust);
bool DoLinkTraining();
bool LinkTrainingSetup();
// For locking Clock Recovery Circuit of the DisplayPort receiver
bool LinkTrainingStage1(dpcd::TrainingPatternSet* tp_set, dpcd::TrainingLaneSet* lanes);
// For optimizing equalization, determining symbol boundary, and achieving inter-lane alignment
bool LinkTrainingStage2(dpcd::TrainingPatternSet* tp_set, dpcd::TrainingLaneSet* lanes);
uint32_t dp_lane_count_;
};
} // namespace i915