| // 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_ |