blob: 4de1b847de15709057d1c9ef0c82a0a048c0f550 [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_INTEL_DISPLAY_DRIVER_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_INTEL_DISPLAY_DRIVER_H_
#include <fidl/fuchsia.driver.framework/cpp/wire.h>
#include <lib/driver/compat/cpp/banjo_server.h>
#include <lib/driver/compat/cpp/device_server.h>
#include <lib/driver/component/cpp/driver_base.h>
#include <lib/driver/component/cpp/prepare_stop_completer.h>
#include <lib/driver/component/cpp/start_completer.h>
#include <lib/zx/result.h>
#include <memory>
#include "src/graphics/display/drivers/intel-display/intel-display.h"
#include "src/graphics/display/lib/api-protocols/cpp/display-engine-events-fidl.h"
#include "src/graphics/display/lib/api-protocols/cpp/display-engine-fidl-adapter.h"
namespace intel_display {
// Driver instance that binds to the intel-display PCI device.
//
// This class is responsible for interfacing with the Fuchsia Driver Framework.
class IntelDisplayDriver : public fdf::DriverBase {
public:
IntelDisplayDriver(fdf::DriverStartArgs start_args,
fdf::UnownedSynchronizedDispatcher driver_dispatcher);
~IntelDisplayDriver() override;
// fdf::DriverBase:
void Start(fdf::StartCompleter completer) override;
void PrepareStop(fdf::PrepareStopCompleter completer) override;
void Stop() override;
zx::result<ddk::AnyProtocol> GetProtocol(uint32_t proto_id);
Controller* controller() const { return controller_.get(); }
private:
zx::result<> InitController();
// Must be called after `InitController()`.
zx::result<> InitDisplayNode();
// Must be called after `InitController()`.
zx::result<> InitGpuCoreNode();
void PrepareStopOnPowerOn(fdf::PrepareStopCompleter completer);
void PrepareStopOnPowerStateTransition(fuchsia_system_state::SystemPowerState power_state,
fdf::PrepareStopCompleter completer);
// Must outlive `controller_` and `engine_fidl_adapter_`.
display::DisplayEngineEventsFidl engine_events_;
// Must outlive `engine_fidl_adapter_`.
std::unique_ptr<Controller> controller_;
std::unique_ptr<display::DisplayEngineFidlAdapter> engine_fidl_adapter_;
std::optional<zbi_swfb_t> framebuffer_info_;
zx::resource mmio_resource_;
zx::resource ioport_resource_;
std::optional<compat::BanjoServer> gpu_banjo_server_;
compat::SyncInitializedDeviceServer gpu_compat_server_;
fidl::WireSyncClient<fuchsia_driver_framework::NodeController> display_node_controller_;
fidl::WireSyncClient<fuchsia_driver_framework::NodeController> gpu_core_node_controller_;
};
} // namespace intel_display
#endif // SRC_GRAPHICS_DISPLAY_DRIVERS_INTEL_DISPLAY_INTEL_DISPLAY_DRIVER_H_