1 // Copyright 2018 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 #include <lib/zx/bti.h> 8 #include <lib/zx/interrupt.h> 9 #include <unistd.h> 10 #include <zircon/compiler.h> 11 #include <zircon/thread_annotations.h> 12 13 #include <ddk/debug.h> 14 #include <ddktl/device.h> 15 #include <ddktl/mmio.h> 16 #include <ddktl/protocol/display/controller.h> 17 18 #include <fbl/auto_lock.h> 19 #include <fbl/mutex.h> 20 #include <fbl/unique_ptr.h> 21 #include <zircon/listnode.h> 22 #include <ddk/protocol/platform/device.h> 23 #include <ddk/protocol/platform-device-lib.h> 24 25 #include "ovl.h" 26 27 namespace mt8167s_display { 28 29 class Mt8167sDisplay; 30 31 // Mt8167sDisplay will implement only a few subset of Device 32 using DeviceType = ddk::Device<Mt8167sDisplay, ddk::Unbindable>; 33 34 class Mt8167sDisplay : public DeviceType, 35 public ddk::DisplayControllerImplProtocol<Mt8167sDisplay, 36 ddk::base_protocol> { 37 public: Mt8167sDisplay(zx_device_t * parent,uint32_t width,uint32_t height,uint32_t pitch)38 Mt8167sDisplay(zx_device_t* parent, uint32_t width, uint32_t height, uint32_t pitch) 39 : DeviceType(parent), width_(width), height_(height), pitch_(pitch) {} 40 41 // This function is called from the c-bind function upon driver matching 42 zx_status_t Bind(); 43 44 // Required functions needed to implement Display Controller Protocol 45 void DisplayControllerImplSetDisplayControllerInterface(const display_controller_interface_t* intf); 46 zx_status_t DisplayControllerImplImportVmoImage(image_t* image, zx::vmo vmo, size_t offset); 47 void DisplayControllerImplReleaseImage(image_t* image); 48 uint32_t DisplayControllerImplCheckConfiguration(const display_config_t** display_config, 49 size_t display_count, 50 uint32_t** layer_cfg_results, 51 size_t* layer_cfg_result_count); 52 void DisplayControllerImplApplyConfiguration(const display_config_t** display_config, 53 size_t display_count); 54 uint32_t DisplayControllerImplComputeLinearStride(uint32_t width, zx_pixel_format_t format); 55 zx_status_t DisplayControllerImplAllocateVmo(uint64_t size, zx::vmo* vmo_out); 56 57 int VSyncThread(); 58 59 // Required functions for DeviceType 60 void DdkUnbind(); 61 void DdkRelease(); 62 63 private: 64 void PopulateAddedDisplayArgs(added_display_args_t* args); 65 66 void Shutdown(); 67 68 // Zircon handles 69 zx::bti bti_; 70 71 // Thread handles 72 thrd_t vsync_thread_; 73 74 // Protocol handles 75 pdev_protocol_t pdev_ = {}; 76 77 // Interrupts 78 zx::interrupt vsync_irq_; 79 80 // Locks used by the display driver 81 fbl::Mutex display_lock_; // general display state (i.e. display_id) 82 fbl::Mutex image_lock_; // used for accessing imported_images_ 83 84 // display dimensions and format 85 const uint32_t width_; 86 const uint32_t height_; 87 const uint32_t pitch_; 88 89 // Imported Images 90 list_node_t imported_images_ TA_GUARDED(image_lock_); 91 92 // Display controller related data 93 ddk::DisplayControllerInterfaceClient dc_intf_ TA_GUARDED(display_lock_); 94 95 // Objects 96 fbl::unique_ptr<mt8167s_display::Ovl> ovl_; 97 }; 98 99 } // namespace mt8167s_display 100