// Copyright 2018 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 "edid.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include "vim-audio.h" #include "vpu.h" __BEGIN_CDECLS #define DISP_ERROR(fmt, ...) zxlogf(ERROR, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__) #define DISP_INFO(fmt, ...) zxlogf(INFO, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__) #define DISP_SPEW(fmt, ...) zxlogf(SPEW, "[%s %d]" fmt, __func__, __LINE__, ##__VA_ARGS__) #define DISP_TRACE zxlogf(INFO, "[%s %d]\n", __func__, __LINE__) #define NUM_CANVAS_ENTRIES 256 #define CANVAS_BYTE_STRIDE 32 // From uBoot source #define VFIFO2VD_TO_HDMI_LATENCY 2 #define EDID_BUF_SIZE 256 #define MAX_RDMA_CHANNELS 3 // Should match display_irqs table in board driver enum { IRQ_VSYNC, IRQ_RDMA, }; // MMIO indices (based on vim2_display_mmios) enum { MMIO_PRESET = 0, MMIO_HDMITX, MMIO_HIU, MMIO_VPU, MMIO_HDMTX_SEC, MMIO_DMC, MMIO_CBUS, MMIO_AUD_OUT, MMIO_COUNT // Must be the final entry }; // BTI indices (based on vim2_display_btis) enum { BTI_DISPLAY = 0, BTI_AUDIO, BTI_COUNT // Must be the final entry }; typedef struct vim2_display { zx_device_t* zxdev; pdev_protocol_t pdev; zx_device_t* parent; zx_device_t* mydevice; zx_handle_t bti; zx_handle_t inth; gpio_protocol_t gpio; amlogic_canvas_protocol_t canvas; thrd_t main_thread; thrd_t vsync_thread; // RDMA IRQ thread thrd_t rdma_thread; // Lock for general display state, in particular display_id. mtx_t display_lock; // Lock for imported images. mtx_t image_lock; mtx_t i2c_lock; // TODO(stevensd): This can race if this is changed right after // vsync but before the interrupt is handled. bool current_image_valid; uint8_t current_image; bool vd1_image_valid; uint32_t vd1_image; std::optional mmio_preset; std::optional mmio_hdmitx; std::optional mmio_hiu; std::optional mmio_vpu; std::optional mmio_hdmitx_sec; std::optional mmio_dmc; std::optional mmio_cbus; zx_handle_t vsync_interrupt; zx_handle_t rdma_interrupt; RdmaContainer rdma_container; bool display_attached; // The current display id (if display_attached), or the next display id uint64_t display_id; const char* manufacturer_name; char monitor_name[14]; char monitor_serial[14]; uint8_t input_color_format; uint8_t output_color_format; uint8_t color_depth; struct hdmi_param* p; display_mode_t cur_display_mode; display_controller_interface_t dc_intf; list_node_t imported_images; // A reference to the object which controls the VIM2 DAIs used to feed audio // into the HDMI stream. vim2_audio_t* audio; uint32_t audio_format_count; } vim2_display_t; void disable_vd(vim2_display_t* display, uint32_t vd_index); void configure_vd(vim2_display_t* display, uint32_t vd_index); void flip_vd(vim2_display_t* display, uint32_t vd_index, uint32_t index); void disable_osd(vim2_display_t* display, uint32_t osd_index); zx_status_t configure_osd(vim2_display_t* display, uint32_t osd_index); void flip_osd(vim2_display_t* display, uint32_t osd_index, uint8_t idx); void osd_debug_dump_register_all(vim2_display_t* display); void osd_dump(vim2_display_t* display); void release_osd(vim2_display_t* display); zx_status_t setup_rdma(vim2_display_t* display); int rdma_thread(void *arg); zx_status_t get_preferred_res(vim2_display_t* display, uint16_t edid_buf_size); struct hdmi_param** get_supported_formats(void); // TODO(johngro) : eliminate the need for these hooks if/when we start to // support composite device drivers and can separate the DAI driver from the // HDMI driver (which is currently playing the role of codec driver) // // TODO(johngro) : add any info needed to properly set up the audio info-frame. zx_status_t vim2_display_configure_audio_mode(const vim2_display_t* display, uint32_t N, uint32_t CTS, uint32_t frame_rate, uint32_t bits_per_sample); void vim2_display_disable_audio(const vim2_display_t* display); __END_CDECLS