162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2010 Matt Turner. 462306a36Sopenharmony_ci * Copyright 2012 Red Hat 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Authors: Matthew Garrett 762306a36Sopenharmony_ci * Matt Turner 862306a36Sopenharmony_ci * Dave Airlie 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#ifndef __MGAG200_DRV_H__ 1162306a36Sopenharmony_ci#define __MGAG200_DRV_H__ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/i2c-algo-bit.h> 1462306a36Sopenharmony_ci#include <linux/i2c.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <video/vga.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <drm/drm_connector.h> 1962306a36Sopenharmony_ci#include <drm/drm_crtc.h> 2062306a36Sopenharmony_ci#include <drm/drm_encoder.h> 2162306a36Sopenharmony_ci#include <drm/drm_gem.h> 2262306a36Sopenharmony_ci#include <drm/drm_gem_shmem_helper.h> 2362306a36Sopenharmony_ci#include <drm/drm_plane.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "mgag200_reg.h" 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define DRIVER_AUTHOR "Matthew Garrett" 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define DRIVER_NAME "mgag200" 3062306a36Sopenharmony_ci#define DRIVER_DESC "MGA G200 SE" 3162306a36Sopenharmony_ci#define DRIVER_DATE "20110418" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define DRIVER_MAJOR 1 3462306a36Sopenharmony_ci#define DRIVER_MINOR 0 3562306a36Sopenharmony_ci#define DRIVER_PATCHLEVEL 0 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define RREG8(reg) ioread8(((void __iomem *)mdev->rmmio) + (reg)) 3862306a36Sopenharmony_ci#define WREG8(reg, v) iowrite8(v, ((void __iomem *)mdev->rmmio) + (reg)) 3962306a36Sopenharmony_ci#define RREG32(reg) ioread32(((void __iomem *)mdev->rmmio) + (reg)) 4062306a36Sopenharmony_ci#define WREG32(reg, v) iowrite32(v, ((void __iomem *)mdev->rmmio) + (reg)) 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci#define MGA_BIOS_OFFSET 0x7ffc 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define ATTR_INDEX 0x1fc0 4562306a36Sopenharmony_ci#define ATTR_DATA 0x1fc1 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define WREG_MISC(v) \ 4862306a36Sopenharmony_ci WREG8(MGA_MISC_OUT, v) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci#define RREG_MISC(v) \ 5162306a36Sopenharmony_ci ((v) = RREG8(MGA_MISC_IN)) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define WREG_MISC_MASKED(v, mask) \ 5462306a36Sopenharmony_ci do { \ 5562306a36Sopenharmony_ci u8 misc_; \ 5662306a36Sopenharmony_ci u8 mask_ = (mask); \ 5762306a36Sopenharmony_ci RREG_MISC(misc_); \ 5862306a36Sopenharmony_ci misc_ &= ~mask_; \ 5962306a36Sopenharmony_ci misc_ |= ((v) & mask_); \ 6062306a36Sopenharmony_ci WREG_MISC(misc_); \ 6162306a36Sopenharmony_ci } while (0) 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define WREG_ATTR(reg, v) \ 6462306a36Sopenharmony_ci do { \ 6562306a36Sopenharmony_ci RREG8(0x1fda); \ 6662306a36Sopenharmony_ci WREG8(ATTR_INDEX, reg); \ 6762306a36Sopenharmony_ci WREG8(ATTR_DATA, v); \ 6862306a36Sopenharmony_ci } while (0) \ 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci#define RREG_SEQ(reg, v) \ 7162306a36Sopenharmony_ci do { \ 7262306a36Sopenharmony_ci WREG8(MGAREG_SEQ_INDEX, reg); \ 7362306a36Sopenharmony_ci v = RREG8(MGAREG_SEQ_DATA); \ 7462306a36Sopenharmony_ci } while (0) \ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci#define WREG_SEQ(reg, v) \ 7762306a36Sopenharmony_ci do { \ 7862306a36Sopenharmony_ci WREG8(MGAREG_SEQ_INDEX, reg); \ 7962306a36Sopenharmony_ci WREG8(MGAREG_SEQ_DATA, v); \ 8062306a36Sopenharmony_ci } while (0) \ 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci#define RREG_CRT(reg, v) \ 8362306a36Sopenharmony_ci do { \ 8462306a36Sopenharmony_ci WREG8(MGAREG_CRTC_INDEX, reg); \ 8562306a36Sopenharmony_ci v = RREG8(MGAREG_CRTC_DATA); \ 8662306a36Sopenharmony_ci } while (0) \ 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci#define WREG_CRT(reg, v) \ 8962306a36Sopenharmony_ci do { \ 9062306a36Sopenharmony_ci WREG8(MGAREG_CRTC_INDEX, reg); \ 9162306a36Sopenharmony_ci WREG8(MGAREG_CRTC_DATA, v); \ 9262306a36Sopenharmony_ci } while (0) \ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define RREG_ECRT(reg, v) \ 9562306a36Sopenharmony_ci do { \ 9662306a36Sopenharmony_ci WREG8(MGAREG_CRTCEXT_INDEX, reg); \ 9762306a36Sopenharmony_ci v = RREG8(MGAREG_CRTCEXT_DATA); \ 9862306a36Sopenharmony_ci } while (0) \ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define WREG_ECRT(reg, v) \ 10162306a36Sopenharmony_ci do { \ 10262306a36Sopenharmony_ci WREG8(MGAREG_CRTCEXT_INDEX, reg); \ 10362306a36Sopenharmony_ci WREG8(MGAREG_CRTCEXT_DATA, v); \ 10462306a36Sopenharmony_ci } while (0) \ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#define GFX_INDEX 0x1fce 10762306a36Sopenharmony_ci#define GFX_DATA 0x1fcf 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#define WREG_GFX(reg, v) \ 11062306a36Sopenharmony_ci do { \ 11162306a36Sopenharmony_ci WREG8(GFX_INDEX, reg); \ 11262306a36Sopenharmony_ci WREG8(GFX_DATA, v); \ 11362306a36Sopenharmony_ci } while (0) \ 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define DAC_INDEX 0x3c00 11662306a36Sopenharmony_ci#define DAC_DATA 0x3c0a 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#define WREG_DAC(reg, v) \ 11962306a36Sopenharmony_ci do { \ 12062306a36Sopenharmony_ci WREG8(DAC_INDEX, reg); \ 12162306a36Sopenharmony_ci WREG8(DAC_DATA, v); \ 12262306a36Sopenharmony_ci } while (0) \ 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define MGA_MISC_OUT 0x1fc2 12562306a36Sopenharmony_ci#define MGA_MISC_IN 0x1fcc 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/* 12862306a36Sopenharmony_ci * TODO: This is a pretty large set of default values for all kinds of 12962306a36Sopenharmony_ci * settings. It should be split and set in the various DRM helpers, 13062306a36Sopenharmony_ci * such as the CRTC reset or atomic_enable helpers. The PLL values 13162306a36Sopenharmony_ci * probably belong to each model's PLL code. 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_ci#define MGAG200_DAC_DEFAULT(xvrefctrl, xpixclkctrl, xmiscctrl, xsyspllm, xsysplln, xsyspllp) \ 13462306a36Sopenharmony_ci /* 0x00: */ 0, 0, 0, 0, 0, 0, 0x00, 0, \ 13562306a36Sopenharmony_ci /* 0x08: */ 0, 0, 0, 0, 0, 0, 0, 0, \ 13662306a36Sopenharmony_ci /* 0x10: */ 0, 0, 0, 0, 0, 0, 0, 0, \ 13762306a36Sopenharmony_ci /* 0x18: */ (xvrefctrl), \ 13862306a36Sopenharmony_ci /* 0x19: */ 0, \ 13962306a36Sopenharmony_ci /* 0x1a: */ (xpixclkctrl), \ 14062306a36Sopenharmony_ci /* 0x1b: */ 0xff, 0xbf, 0x20, \ 14162306a36Sopenharmony_ci /* 0x1e: */ (xmiscctrl), \ 14262306a36Sopenharmony_ci /* 0x1f: */ 0x20, \ 14362306a36Sopenharmony_ci /* 0x20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 14462306a36Sopenharmony_ci /* 0x28: */ 0x00, 0x00, 0x00, 0x00, \ 14562306a36Sopenharmony_ci /* 0x2c: */ (xsyspllm), \ 14662306a36Sopenharmony_ci /* 0x2d: */ (xsysplln), \ 14762306a36Sopenharmony_ci /* 0x2e: */ (xsyspllp), \ 14862306a36Sopenharmony_ci /* 0x2f: */ 0x40, \ 14962306a36Sopenharmony_ci /* 0x30: */ 0x00, 0xb0, 0x00, 0xc2, 0x34, 0x14, 0x02, 0x83, \ 15062306a36Sopenharmony_ci /* 0x38: */ 0x00, 0x93, 0x00, 0x77, 0x00, 0x00, 0x00, 0x3a, \ 15162306a36Sopenharmony_ci /* 0x40: */ 0, 0, 0, 0, 0, 0, 0, 0, \ 15262306a36Sopenharmony_ci /* 0x48: */ 0, 0, 0, 0, 0, 0, 0, 0 \ 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci#define MGAG200_LUT_SIZE 256 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci#define MGAG200_MAX_FB_HEIGHT 4096 15762306a36Sopenharmony_ci#define MGAG200_MAX_FB_WIDTH 4096 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct mga_device; 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* 16262306a36Sopenharmony_ci * Stores parameters for programming the PLLs 16362306a36Sopenharmony_ci * 16462306a36Sopenharmony_ci * Fref: reference frequency (A: 25.175 Mhz, B: 28.361, C: XX Mhz) 16562306a36Sopenharmony_ci * Fo: output frequency 16662306a36Sopenharmony_ci * Fvco = Fref * (N / M) 16762306a36Sopenharmony_ci * Fo = Fvco / P 16862306a36Sopenharmony_ci * 16962306a36Sopenharmony_ci * S = [0..3] 17062306a36Sopenharmony_ci */ 17162306a36Sopenharmony_cistruct mgag200_pll_values { 17262306a36Sopenharmony_ci unsigned int m; 17362306a36Sopenharmony_ci unsigned int n; 17462306a36Sopenharmony_ci unsigned int p; 17562306a36Sopenharmony_ci unsigned int s; 17662306a36Sopenharmony_ci}; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_cistruct mgag200_crtc_state { 17962306a36Sopenharmony_ci struct drm_crtc_state base; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* Primary-plane format; required for modesetting and color mgmt. */ 18262306a36Sopenharmony_ci const struct drm_format_info *format; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci struct mgag200_pll_values pixpllc; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistatic inline struct mgag200_crtc_state *to_mgag200_crtc_state(struct drm_crtc_state *base) 18862306a36Sopenharmony_ci{ 18962306a36Sopenharmony_ci return container_of(base, struct mgag200_crtc_state, base); 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistruct mga_i2c_chan { 19362306a36Sopenharmony_ci struct i2c_adapter adapter; 19462306a36Sopenharmony_ci struct drm_device *dev; 19562306a36Sopenharmony_ci struct i2c_algo_bit_data bit; 19662306a36Sopenharmony_ci int data, clock; 19762306a36Sopenharmony_ci}; 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cienum mga_type { 20062306a36Sopenharmony_ci G200_PCI, 20162306a36Sopenharmony_ci G200_AGP, 20262306a36Sopenharmony_ci G200_SE_A, 20362306a36Sopenharmony_ci G200_SE_B, 20462306a36Sopenharmony_ci G200_WB, 20562306a36Sopenharmony_ci G200_EV, 20662306a36Sopenharmony_ci G200_EH, 20762306a36Sopenharmony_ci G200_EH3, 20862306a36Sopenharmony_ci G200_ER, 20962306a36Sopenharmony_ci G200_EW3, 21062306a36Sopenharmony_ci}; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistruct mgag200_device_info { 21362306a36Sopenharmony_ci u16 max_hdisplay; 21462306a36Sopenharmony_ci u16 max_vdisplay; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci /* 21762306a36Sopenharmony_ci * Maximum memory bandwidth (MiB/sec). Setting this to zero disables 21862306a36Sopenharmony_ci * the rsp test during mode validation. 21962306a36Sopenharmony_ci */ 22062306a36Sopenharmony_ci unsigned long max_mem_bandwidth; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci /* HW has external source (e.g., BMC) to synchronize with */ 22362306a36Sopenharmony_ci bool has_vidrst:1; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci struct { 22662306a36Sopenharmony_ci unsigned data_bit:3; 22762306a36Sopenharmony_ci unsigned clock_bit:3; 22862306a36Sopenharmony_ci } i2c; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci /* 23162306a36Sopenharmony_ci * HW does not handle 'startadd' register correctly. Always set 23262306a36Sopenharmony_ci * it's value to 0. 23362306a36Sopenharmony_ci */ 23462306a36Sopenharmony_ci bool bug_no_startadd:1; 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci#define MGAG200_DEVICE_INFO_INIT(_max_hdisplay, _max_vdisplay, _max_mem_bandwidth, \ 23862306a36Sopenharmony_ci _has_vidrst, _i2c_data_bit, _i2c_clock_bit, \ 23962306a36Sopenharmony_ci _bug_no_startadd) \ 24062306a36Sopenharmony_ci { \ 24162306a36Sopenharmony_ci .max_hdisplay = (_max_hdisplay), \ 24262306a36Sopenharmony_ci .max_vdisplay = (_max_vdisplay), \ 24362306a36Sopenharmony_ci .max_mem_bandwidth = (_max_mem_bandwidth), \ 24462306a36Sopenharmony_ci .has_vidrst = (_has_vidrst), \ 24562306a36Sopenharmony_ci .i2c = { \ 24662306a36Sopenharmony_ci .data_bit = (_i2c_data_bit), \ 24762306a36Sopenharmony_ci .clock_bit = (_i2c_clock_bit), \ 24862306a36Sopenharmony_ci }, \ 24962306a36Sopenharmony_ci .bug_no_startadd = (_bug_no_startadd), \ 25062306a36Sopenharmony_ci } 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_cistruct mgag200_device_funcs { 25362306a36Sopenharmony_ci /* 25462306a36Sopenharmony_ci * Disables an external reset source (i.e., BMC) before programming 25562306a36Sopenharmony_ci * a new display mode. 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_ci void (*disable_vidrst)(struct mga_device *mdev); 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci /* 26062306a36Sopenharmony_ci * Enables an external reset source (i.e., BMC) after programming 26162306a36Sopenharmony_ci * a new display mode. 26262306a36Sopenharmony_ci */ 26362306a36Sopenharmony_ci void (*enable_vidrst)(struct mga_device *mdev); 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci /* 26662306a36Sopenharmony_ci * Validate that the given state can be programmed into PIXPLLC. On 26762306a36Sopenharmony_ci * success, the calculated parameters should be stored in the CRTC's 26862306a36Sopenharmony_ci * state in struct @mgag200_crtc_state.pixpllc. 26962306a36Sopenharmony_ci */ 27062306a36Sopenharmony_ci int (*pixpllc_atomic_check)(struct drm_crtc *crtc, struct drm_atomic_state *new_state); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci /* 27362306a36Sopenharmony_ci * Program PIXPLLC from the CRTC state. The parameters should have been 27462306a36Sopenharmony_ci * stored in struct @mgag200_crtc_state.pixpllc by the corresponding 27562306a36Sopenharmony_ci * implementation of @pixpllc_atomic_check. 27662306a36Sopenharmony_ci */ 27762306a36Sopenharmony_ci void (*pixpllc_atomic_update)(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 27862306a36Sopenharmony_ci}; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistruct mga_device { 28162306a36Sopenharmony_ci struct drm_device base; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci const struct mgag200_device_info *info; 28462306a36Sopenharmony_ci const struct mgag200_device_funcs *funcs; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci struct resource *rmmio_res; 28762306a36Sopenharmony_ci void __iomem *rmmio; 28862306a36Sopenharmony_ci struct mutex rmmio_lock; /* Protects access to rmmio */ 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci struct resource *vram_res; 29162306a36Sopenharmony_ci void __iomem *vram; 29262306a36Sopenharmony_ci resource_size_t vram_available; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci struct drm_plane primary_plane; 29562306a36Sopenharmony_ci struct drm_crtc crtc; 29662306a36Sopenharmony_ci struct drm_encoder encoder; 29762306a36Sopenharmony_ci struct mga_i2c_chan i2c; 29862306a36Sopenharmony_ci struct drm_connector connector; 29962306a36Sopenharmony_ci}; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistatic inline struct mga_device *to_mga_device(struct drm_device *dev) 30262306a36Sopenharmony_ci{ 30362306a36Sopenharmony_ci return container_of(dev, struct mga_device, base); 30462306a36Sopenharmony_ci} 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_cistruct mgag200_g200_device { 30762306a36Sopenharmony_ci struct mga_device base; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci /* PLL constants */ 31062306a36Sopenharmony_ci long ref_clk; 31162306a36Sopenharmony_ci long pclk_min; 31262306a36Sopenharmony_ci long pclk_max; 31362306a36Sopenharmony_ci}; 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic inline struct mgag200_g200_device *to_mgag200_g200_device(struct drm_device *dev) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci return container_of(to_mga_device(dev), struct mgag200_g200_device, base); 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistruct mgag200_g200se_device { 32162306a36Sopenharmony_ci struct mga_device base; 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci /* SE model number stored in reg 0x1e24 */ 32462306a36Sopenharmony_ci u32 unique_rev_id; 32562306a36Sopenharmony_ci}; 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_cistatic inline struct mgag200_g200se_device *to_mgag200_g200se_device(struct drm_device *dev) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci return container_of(to_mga_device(dev), struct mgag200_g200se_device, base); 33062306a36Sopenharmony_ci} 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci /* mgag200_drv.c */ 33362306a36Sopenharmony_ciint mgag200_init_pci_options(struct pci_dev *pdev, u32 option, u32 option2); 33462306a36Sopenharmony_ciresource_size_t mgag200_probe_vram(void __iomem *mem, resource_size_t size); 33562306a36Sopenharmony_ciresource_size_t mgag200_device_probe_vram(struct mga_device *mdev); 33662306a36Sopenharmony_ciint mgag200_device_preinit(struct mga_device *mdev); 33762306a36Sopenharmony_ciint mgag200_device_init(struct mga_device *mdev, 33862306a36Sopenharmony_ci const struct mgag200_device_info *info, 33962306a36Sopenharmony_ci const struct mgag200_device_funcs *funcs); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci /* mgag200_<device type>.c */ 34262306a36Sopenharmony_cistruct mga_device *mgag200_g200_device_create(struct pci_dev *pdev, const struct drm_driver *drv); 34362306a36Sopenharmony_cistruct mga_device *mgag200_g200se_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 34462306a36Sopenharmony_ci enum mga_type type); 34562306a36Sopenharmony_civoid mgag200_g200wb_init_registers(struct mga_device *mdev); 34662306a36Sopenharmony_civoid mgag200_g200wb_pixpllc_atomic_update(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 34762306a36Sopenharmony_cistruct mga_device *mgag200_g200wb_device_create(struct pci_dev *pdev, const struct drm_driver *drv); 34862306a36Sopenharmony_cistruct mga_device *mgag200_g200ev_device_create(struct pci_dev *pdev, const struct drm_driver *drv); 34962306a36Sopenharmony_civoid mgag200_g200eh_init_registers(struct mga_device *mdev); 35062306a36Sopenharmony_civoid mgag200_g200eh_pixpllc_atomic_update(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 35162306a36Sopenharmony_cistruct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, 35262306a36Sopenharmony_ci const struct drm_driver *drv); 35362306a36Sopenharmony_cistruct mga_device *mgag200_g200eh3_device_create(struct pci_dev *pdev, 35462306a36Sopenharmony_ci const struct drm_driver *drv); 35562306a36Sopenharmony_cistruct mga_device *mgag200_g200er_device_create(struct pci_dev *pdev, 35662306a36Sopenharmony_ci const struct drm_driver *drv); 35762306a36Sopenharmony_cistruct mga_device *mgag200_g200ew3_device_create(struct pci_dev *pdev, 35862306a36Sopenharmony_ci const struct drm_driver *drv); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci/* 36162306a36Sopenharmony_ci * mgag200_mode.c 36262306a36Sopenharmony_ci */ 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistruct drm_crtc; 36562306a36Sopenharmony_cistruct drm_crtc_state; 36662306a36Sopenharmony_cistruct drm_display_mode; 36762306a36Sopenharmony_cistruct drm_plane; 36862306a36Sopenharmony_cistruct drm_atomic_state; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ciextern const uint32_t mgag200_primary_plane_formats[]; 37162306a36Sopenharmony_ciextern const size_t mgag200_primary_plane_formats_size; 37262306a36Sopenharmony_ciextern const uint64_t mgag200_primary_plane_fmtmods[]; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ciint mgag200_primary_plane_helper_atomic_check(struct drm_plane *plane, 37562306a36Sopenharmony_ci struct drm_atomic_state *new_state); 37662306a36Sopenharmony_civoid mgag200_primary_plane_helper_atomic_update(struct drm_plane *plane, 37762306a36Sopenharmony_ci struct drm_atomic_state *old_state); 37862306a36Sopenharmony_civoid mgag200_primary_plane_helper_atomic_enable(struct drm_plane *plane, 37962306a36Sopenharmony_ci struct drm_atomic_state *state); 38062306a36Sopenharmony_civoid mgag200_primary_plane_helper_atomic_disable(struct drm_plane *plane, 38162306a36Sopenharmony_ci struct drm_atomic_state *old_state); 38262306a36Sopenharmony_ci#define MGAG200_PRIMARY_PLANE_HELPER_FUNCS \ 38362306a36Sopenharmony_ci DRM_GEM_SHADOW_PLANE_HELPER_FUNCS, \ 38462306a36Sopenharmony_ci .atomic_check = mgag200_primary_plane_helper_atomic_check, \ 38562306a36Sopenharmony_ci .atomic_update = mgag200_primary_plane_helper_atomic_update, \ 38662306a36Sopenharmony_ci .atomic_enable = mgag200_primary_plane_helper_atomic_enable, \ 38762306a36Sopenharmony_ci .atomic_disable = mgag200_primary_plane_helper_atomic_disable 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci#define MGAG200_PRIMARY_PLANE_FUNCS \ 39062306a36Sopenharmony_ci .update_plane = drm_atomic_helper_update_plane, \ 39162306a36Sopenharmony_ci .disable_plane = drm_atomic_helper_disable_plane, \ 39262306a36Sopenharmony_ci .destroy = drm_plane_cleanup, \ 39362306a36Sopenharmony_ci DRM_GEM_SHADOW_PLANE_FUNCS 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_civoid mgag200_crtc_set_gamma_linear(struct mga_device *mdev, const struct drm_format_info *format); 39662306a36Sopenharmony_civoid mgag200_crtc_set_gamma(struct mga_device *mdev, 39762306a36Sopenharmony_ci const struct drm_format_info *format, 39862306a36Sopenharmony_ci struct drm_color_lut *lut); 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cienum drm_mode_status mgag200_crtc_helper_mode_valid(struct drm_crtc *crtc, 40162306a36Sopenharmony_ci const struct drm_display_mode *mode); 40262306a36Sopenharmony_ciint mgag200_crtc_helper_atomic_check(struct drm_crtc *crtc, struct drm_atomic_state *new_state); 40362306a36Sopenharmony_civoid mgag200_crtc_helper_atomic_flush(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 40462306a36Sopenharmony_civoid mgag200_crtc_helper_atomic_enable(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 40562306a36Sopenharmony_civoid mgag200_crtc_helper_atomic_disable(struct drm_crtc *crtc, struct drm_atomic_state *old_state); 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci#define MGAG200_CRTC_HELPER_FUNCS \ 40862306a36Sopenharmony_ci .mode_valid = mgag200_crtc_helper_mode_valid, \ 40962306a36Sopenharmony_ci .atomic_check = mgag200_crtc_helper_atomic_check, \ 41062306a36Sopenharmony_ci .atomic_flush = mgag200_crtc_helper_atomic_flush, \ 41162306a36Sopenharmony_ci .atomic_enable = mgag200_crtc_helper_atomic_enable, \ 41262306a36Sopenharmony_ci .atomic_disable = mgag200_crtc_helper_atomic_disable 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_civoid mgag200_crtc_reset(struct drm_crtc *crtc); 41562306a36Sopenharmony_cistruct drm_crtc_state *mgag200_crtc_atomic_duplicate_state(struct drm_crtc *crtc); 41662306a36Sopenharmony_civoid mgag200_crtc_atomic_destroy_state(struct drm_crtc *crtc, struct drm_crtc_state *crtc_state); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci#define MGAG200_CRTC_FUNCS \ 41962306a36Sopenharmony_ci .reset = mgag200_crtc_reset, \ 42062306a36Sopenharmony_ci .destroy = drm_crtc_cleanup, \ 42162306a36Sopenharmony_ci .set_config = drm_atomic_helper_set_config, \ 42262306a36Sopenharmony_ci .page_flip = drm_atomic_helper_page_flip, \ 42362306a36Sopenharmony_ci .atomic_duplicate_state = mgag200_crtc_atomic_duplicate_state, \ 42462306a36Sopenharmony_ci .atomic_destroy_state = mgag200_crtc_atomic_destroy_state 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci#define MGAG200_DAC_ENCODER_FUNCS \ 42762306a36Sopenharmony_ci .destroy = drm_encoder_cleanup 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ciint mgag200_vga_connector_helper_get_modes(struct drm_connector *connector); 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_ci#define MGAG200_VGA_CONNECTOR_HELPER_FUNCS \ 43262306a36Sopenharmony_ci .get_modes = mgag200_vga_connector_helper_get_modes 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci#define MGAG200_VGA_CONNECTOR_FUNCS \ 43562306a36Sopenharmony_ci .reset = drm_atomic_helper_connector_reset, \ 43662306a36Sopenharmony_ci .fill_modes = drm_helper_probe_single_connector_modes, \ 43762306a36Sopenharmony_ci .destroy = drm_connector_cleanup, \ 43862306a36Sopenharmony_ci .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, \ 43962306a36Sopenharmony_ci .atomic_destroy_state = drm_atomic_helper_connector_destroy_state 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_civoid mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mode *mode); 44262306a36Sopenharmony_civoid mgag200_set_format_regs(struct mga_device *mdev, const struct drm_format_info *format); 44362306a36Sopenharmony_civoid mgag200_enable_display(struct mga_device *mdev); 44462306a36Sopenharmony_civoid mgag200_init_registers(struct mga_device *mdev); 44562306a36Sopenharmony_ciint mgag200_mode_config_init(struct mga_device *mdev, resource_size_t vram_available); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci /* mgag200_bmc.c */ 44862306a36Sopenharmony_civoid mgag200_bmc_disable_vidrst(struct mga_device *mdev); 44962306a36Sopenharmony_civoid mgag200_bmc_enable_vidrst(struct mga_device *mdev); 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ci /* mgag200_i2c.c */ 45262306a36Sopenharmony_ciint mgag200_i2c_init(struct mga_device *mdev, struct mga_i2c_chan *i2c); 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci#endif /* __MGAG200_DRV_H__ */ 455