Path: blob/master/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
26519 views
/* SPDX-License-Identifier: GPL-2.0 */1/*2* (C) COPYRIGHT 2018 ARM Limited. All rights reserved.3* Author: James.Qian.Wang <[email protected]>4*5*/6#ifndef _KOMEDA_DEV_H_7#define _KOMEDA_DEV_H_89#include <linux/device.h>10#include <linux/clk.h>11#include "komeda_pipeline.h"12#include "malidp_product.h"13#include "komeda_format_caps.h"1415#define KOMEDA_EVENT_VSYNC BIT_ULL(0)16#define KOMEDA_EVENT_FLIP BIT_ULL(1)17#define KOMEDA_EVENT_URUN BIT_ULL(2)18#define KOMEDA_EVENT_IBSY BIT_ULL(3)19#define KOMEDA_EVENT_OVR BIT_ULL(4)20#define KOMEDA_EVENT_EOW BIT_ULL(5)21#define KOMEDA_EVENT_MODE BIT_ULL(6)22#define KOMEDA_EVENT_FULL BIT_ULL(7)23#define KOMEDA_EVENT_EMPTY BIT_ULL(8)2425#define KOMEDA_ERR_TETO BIT_ULL(14)26#define KOMEDA_ERR_TEMR BIT_ULL(15)27#define KOMEDA_ERR_TITR BIT_ULL(16)28#define KOMEDA_ERR_CPE BIT_ULL(17)29#define KOMEDA_ERR_CFGE BIT_ULL(18)30#define KOMEDA_ERR_AXIE BIT_ULL(19)31#define KOMEDA_ERR_ACE0 BIT_ULL(20)32#define KOMEDA_ERR_ACE1 BIT_ULL(21)33#define KOMEDA_ERR_ACE2 BIT_ULL(22)34#define KOMEDA_ERR_ACE3 BIT_ULL(23)35#define KOMEDA_ERR_DRIFTTO BIT_ULL(24)36#define KOMEDA_ERR_FRAMETO BIT_ULL(25)37#define KOMEDA_ERR_CSCE BIT_ULL(26)38#define KOMEDA_ERR_ZME BIT_ULL(27)39#define KOMEDA_ERR_MERR BIT_ULL(28)40#define KOMEDA_ERR_TCF BIT_ULL(29)41#define KOMEDA_ERR_TTNG BIT_ULL(30)42#define KOMEDA_ERR_TTF BIT_ULL(31)4344#define KOMEDA_ERR_EVENTS \45(KOMEDA_EVENT_URUN | KOMEDA_EVENT_IBSY | KOMEDA_EVENT_OVR |\46KOMEDA_ERR_TETO | KOMEDA_ERR_TEMR | KOMEDA_ERR_TITR |\47KOMEDA_ERR_CPE | KOMEDA_ERR_CFGE | KOMEDA_ERR_AXIE |\48KOMEDA_ERR_ACE0 | KOMEDA_ERR_ACE1 | KOMEDA_ERR_ACE2 |\49KOMEDA_ERR_ACE3 | KOMEDA_ERR_DRIFTTO | KOMEDA_ERR_FRAMETO |\50KOMEDA_ERR_ZME | KOMEDA_ERR_MERR | KOMEDA_ERR_TCF |\51KOMEDA_ERR_TTNG | KOMEDA_ERR_TTF)5253#define KOMEDA_WARN_EVENTS \54(KOMEDA_ERR_CSCE | KOMEDA_EVENT_FULL | KOMEDA_EVENT_EMPTY)5556#define KOMEDA_INFO_EVENTS (0 \57| KOMEDA_EVENT_VSYNC \58| KOMEDA_EVENT_FLIP \59| KOMEDA_EVENT_EOW \60| KOMEDA_EVENT_MODE \61)6263/* pipeline DT ports */64enum {65KOMEDA_OF_PORT_OUTPUT = 0,66KOMEDA_OF_PORT_COPROC = 1,67};6869struct komeda_chip_info {70u32 arch_id;71u32 core_id;72u32 core_info;73u32 bus_width;74};7576struct komeda_dev;7778struct komeda_events {79u64 global;80u64 pipes[KOMEDA_MAX_PIPELINES];81};8283/**84* struct komeda_dev_funcs85*86* Supplied by chip level and returned by the chip entry function xxx_identify,87*/88struct komeda_dev_funcs {89/**90* @init_format_table:91*92* initialize &komeda_dev->format_table, this function should be called93* before the &enum_resource94*/95void (*init_format_table)(struct komeda_dev *mdev);96/**97* @enum_resources:98*99* for CHIP to report or add pipeline and component resources to CORE100*/101int (*enum_resources)(struct komeda_dev *mdev);102/** @cleanup: call to chip to cleanup komeda_dev->chip data */103void (*cleanup)(struct komeda_dev *mdev);104/** @connect_iommu: Optional, connect to external iommu */105int (*connect_iommu)(struct komeda_dev *mdev);106/** @disconnect_iommu: Optional, disconnect to external iommu */107int (*disconnect_iommu)(struct komeda_dev *mdev);108/**109* @irq_handler:110*111* for CORE to get the HW event from the CHIP when interrupt happened.112*/113irqreturn_t (*irq_handler)(struct komeda_dev *mdev,114struct komeda_events *events);115/** @enable_irq: enable irq */116int (*enable_irq)(struct komeda_dev *mdev);117/** @disable_irq: disable irq */118int (*disable_irq)(struct komeda_dev *mdev);119/** @on_off_vblank: notify HW to on/off vblank */120void (*on_off_vblank)(struct komeda_dev *mdev,121int master_pipe, bool on);122123/** @dump_register: Optional, dump registers to seq_file */124void (*dump_register)(struct komeda_dev *mdev, struct seq_file *seq);125/**126* @change_opmode:127*128* Notify HW to switch to a new display operation mode.129*/130int (*change_opmode)(struct komeda_dev *mdev, int new_mode);131/** @flush: Notify the HW to flush or kickoff the update */132void (*flush)(struct komeda_dev *mdev,133int master_pipe, u32 active_pipes);134};135136/*137* DISPLAY_MODE describes how many display been enabled, and which will be138* passed to CHIP by &komeda_dev_funcs->change_opmode(), then CHIP can do the139* pipeline resources assignment according to this usage hint.140* - KOMEDA_MODE_DISP0: Only one display enabled, pipeline-0 work as master.141* - KOMEDA_MODE_DISP1: Only one display enabled, pipeline-0 work as master.142* - KOMEDA_MODE_DUAL_DISP: Dual display mode, both display has been enabled.143* And D71 supports assign two pipelines to one single display on mode144* KOMEDA_MODE_DISP0/DISP1145*/146enum {147KOMEDA_MODE_INACTIVE = 0,148KOMEDA_MODE_DISP0 = BIT(0),149KOMEDA_MODE_DISP1 = BIT(1),150KOMEDA_MODE_DUAL_DISP = KOMEDA_MODE_DISP0 | KOMEDA_MODE_DISP1,151};152153/**154* struct komeda_dev155*156* Pipeline and component are used to describe how to handle the pixel data.157* komeda_device is for describing the whole view of the device, and the158* control-abilites of device.159*/160struct komeda_dev {161/** @dev: the base device structure */162struct device *dev;163/** @reg_base: the base address of komeda io space */164u32 __iomem *reg_base;165166/** @chip: the basic chip information */167struct komeda_chip_info chip;168/** @fmt_tbl: initialized by &komeda_dev_funcs->init_format_table */169struct komeda_format_caps_table fmt_tbl;170/** @aclk: HW main engine clk */171struct clk *aclk;172173/** @irq: irq number */174int irq;175176/** @lock: used to protect dpmode */177struct mutex lock;178/** @dpmode: current display mode */179u32 dpmode;180181/** @n_pipelines: the number of pipe in @pipelines */182int n_pipelines;183/** @pipelines: the komeda pipelines */184struct komeda_pipeline *pipelines[KOMEDA_MAX_PIPELINES];185186/** @funcs: chip funcs to access to HW */187const struct komeda_dev_funcs *funcs;188/**189* @chip_data:190*191* chip data will be added by &komeda_dev_funcs.enum_resources() and192* destroyed by &komeda_dev_funcs.cleanup()193*/194void *chip_data;195196/** @iommu: iommu domain */197struct iommu_domain *iommu;198199/** @debugfs_root: root directory of komeda debugfs */200struct dentry *debugfs_root;201/**202* @err_verbosity: bitmask for how much extra info to print on error203*204* See KOMEDA_DEV_* macros for details. Low byte contains the debug205* level categories, the high byte contains extra debug options.206*/207u16 err_verbosity;208/* Print a single line per error per frame with error events. */209#define KOMEDA_DEV_PRINT_ERR_EVENTS BIT(0)210/* Print a single line per warning per frame with error events. */211#define KOMEDA_DEV_PRINT_WARN_EVENTS BIT(1)212/* Print a single line per info event per frame with error events. */213#define KOMEDA_DEV_PRINT_INFO_EVENTS BIT(2)214/* Dump DRM state on an error or warning event. */215#define KOMEDA_DEV_PRINT_DUMP_STATE_ON_EVENT BIT(8)216/* Disable rate limiting of event prints (normally one per commit) */217#define KOMEDA_DEV_PRINT_DISABLE_RATELIMIT BIT(12)218};219220static inline bool221komeda_product_match(struct komeda_dev *mdev, u32 target)222{223return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target;224}225226typedef const struct komeda_dev_funcs *227(*komeda_identify_func)(u32 __iomem *reg, struct komeda_chip_info *chip);228229const struct komeda_dev_funcs *230d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);231232struct komeda_dev *komeda_dev_create(struct device *dev);233void komeda_dev_destroy(struct komeda_dev *mdev);234235struct komeda_dev *dev_to_mdev(struct device *dev);236237void komeda_print_events(struct komeda_events *evts, struct drm_device *dev);238239int komeda_dev_resume(struct komeda_dev *mdev);240int komeda_dev_suspend(struct komeda_dev *mdev);241242#endif /*_KOMEDA_DEV_H_*/243244245