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 <zircon/compiler.h>
8#include <ddk/driver.h>
9#include <zircon/pixelformat.h>
10
11#if __cplusplus
12
13#include <ddktl/device.h>
14#include <ddktl/protocol/display-controller.h>
15#include <fbl/unique_ptr.h>
16#include <lib/zx/vmo.h>
17
18class SimpleDisplay;
19using DeviceType = ddk::Device<SimpleDisplay, ddk::Unbindable>;
20
21class SimpleDisplay : public DeviceType,
22                      public ddk::DisplayControllerProtocol<SimpleDisplay> {
23public:
24    SimpleDisplay(zx_device_t* parent, zx_handle_t vmo,
25                  uintptr_t framebuffer, uint64_t framebuffer_size,
26                  uint32_t width, uint32_t height,
27                  uint32_t stride, zx_pixel_format_t format);
28    ~SimpleDisplay();
29
30    void DdkUnbind();
31    void DdkRelease();
32    zx_status_t Bind(const char* name, fbl::unique_ptr<SimpleDisplay>* controller_ptr);
33
34    void SetDisplayControllerCb(void* cb_ctx, display_controller_cb_t* cb);
35    zx_status_t ImportVmoImage(image_t* image, const zx::vmo& vmo, size_t offset);
36    void ReleaseImage(image_t* image);
37    void CheckConfiguration(const display_config_t** display_config,
38                            uint32_t* display_cfg_result, uint32_t** layer_cfg_result,
39                            uint32_t display_count);
40    void ApplyConfiguration(const display_config_t** display_config, uint32_t display_count);
41    uint32_t ComputeLinearStride(uint32_t width, zx_pixel_format_t format);
42    zx_status_t AllocateVmo(uint64_t size, zx_handle_t* vmo_out);
43
44private:
45    zx::vmo framebuffer_handle_;
46    uintptr_t framebuffer_;
47    uint64_t framebuffer_size_;
48    zx_koid_t framebuffer_koid_;
49
50    uint32_t width_;
51    uint32_t height_;
52    uint32_t stride_;
53    zx_pixel_format_t format_;
54
55    display_controller_cb_t* cb_;
56    void* cb_ctx_;
57};
58
59#endif // __cplusplus
60
61__BEGIN_CDECLS
62zx_status_t bind_simple_pci_display(zx_device_t* dev, const char* name, uint32_t bar,
63                                    uint32_t width, uint32_t height,
64                                    uint32_t stride, zx_pixel_format_t format);
65
66zx_status_t bind_simple_pci_display_bootloader(zx_device_t* dev, const char* name, uint32_t bar);
67__END_CDECLS
68