1203288Srnoland/*- 2203288Srnoland * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. 3203288Srnoland * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. 4203288Srnoland * 5203288Srnoland * Permission is hereby granted, free of charge, to any person obtaining a 6203288Srnoland * copy of this software and associated documentation files (the "Software"), 7203288Srnoland * to deal in the Software without restriction, including without limitation 8203288Srnoland * the rights to use, copy, modify, merge, publish, distribute, sub license, 9203288Srnoland * and/or sell copies of the Software, and to permit persons to whom the 10203288Srnoland * Software is furnished to do so, subject to the following conditions: 11203288Srnoland * 12203288Srnoland * The above copyright notice and this permission notice (including the 13203288Srnoland * next paragraph) shall be included in all copies or substantial portions 14203288Srnoland * of the Software. 15203288Srnoland * 16203288Srnoland * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17203288Srnoland * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18203288Srnoland * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 19203288Srnoland * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20203288Srnoland * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21203288Srnoland * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22203288Srnoland * DEALINGS IN THE SOFTWARE. 23203288Srnoland */ 24203288Srnoland 25203288Srnoland#include <sys/cdefs.h> 26203288Srnoland__FBSDID("$FreeBSD$"); 27203288Srnoland 28203288Srnoland#ifndef _VIA_DRV_H_ 29203288Srnoland#define _VIA_DRV_H_ 30203288Srnoland 31203288Srnoland#include "dev/drm/drm_sman.h" 32203288Srnoland#define DRIVER_AUTHOR "Various" 33203288Srnoland 34203288Srnoland#define DRIVER_NAME "via" 35203288Srnoland#define DRIVER_DESC "VIA Unichrome / Pro" 36203288Srnoland#define DRIVER_DATE "20070202" 37203288Srnoland 38203288Srnoland#define DRIVER_MAJOR 2 39203288Srnoland#define DRIVER_MINOR 11 40203288Srnoland#define DRIVER_PATCHLEVEL 1 41203288Srnoland 42203288Srnoland#include "dev/drm/via_verifier.h" 43203288Srnoland 44203288Srnoland#include "dev/drm/via_dmablit.h" 45203288Srnoland 46203288Srnoland#define VIA_PCI_BUF_SIZE 60000 47203288Srnoland#define VIA_FIRE_BUF_SIZE 1024 48203288Srnoland#define VIA_NUM_IRQS 4 49203288Srnoland 50203288Srnolandtypedef struct drm_via_ring_buffer { 51203288Srnoland drm_local_map_t map; 52203288Srnoland char *virtual_start; 53203288Srnoland} drm_via_ring_buffer_t; 54203288Srnoland 55203288Srnolandtypedef uint32_t maskarray_t[5]; 56203288Srnoland 57203288Srnolandtypedef struct drm_via_irq { 58203288Srnoland atomic_t irq_received; 59203288Srnoland uint32_t pending_mask; 60203288Srnoland uint32_t enable_mask; 61203288Srnoland wait_queue_head_t irq_queue; 62203288Srnoland} drm_via_irq_t; 63203288Srnoland 64203288Srnolandtypedef struct drm_via_private { 65203288Srnoland drm_via_sarea_t *sarea_priv; 66203288Srnoland drm_local_map_t *sarea; 67203288Srnoland drm_local_map_t *fb; 68203288Srnoland drm_local_map_t *mmio; 69203288Srnoland unsigned long agpAddr; 70203288Srnoland wait_queue_head_t decoder_queue[VIA_NR_XVMC_LOCKS]; 71203288Srnoland char *dma_ptr; 72203288Srnoland unsigned int dma_low; 73203288Srnoland unsigned int dma_high; 74203288Srnoland unsigned int dma_offset; 75203288Srnoland uint32_t dma_wrap; 76203288Srnoland volatile uint32_t *last_pause_ptr; 77203288Srnoland volatile uint32_t *hw_addr_ptr; 78203288Srnoland drm_via_ring_buffer_t ring; 79203288Srnoland struct timeval last_vblank; 80203288Srnoland int last_vblank_valid; 81203288Srnoland unsigned usec_per_vblank; 82203288Srnoland atomic_t vbl_received; 83203288Srnoland drm_via_state_t hc_state; 84203288Srnoland char pci_buf[VIA_PCI_BUF_SIZE]; 85203288Srnoland const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE]; 86203288Srnoland uint32_t num_fire_offsets; 87203288Srnoland int chipset; 88203288Srnoland drm_via_irq_t via_irqs[VIA_NUM_IRQS]; 89203288Srnoland unsigned num_irqs; 90203288Srnoland maskarray_t *irq_masks; 91203288Srnoland uint32_t irq_enable_mask; 92203288Srnoland uint32_t irq_pending_mask; 93203288Srnoland int *irq_map; 94203288Srnoland unsigned int idle_fault; 95203288Srnoland struct drm_sman sman; 96203288Srnoland int vram_initialized; 97203288Srnoland int agp_initialized; 98203288Srnoland unsigned long vram_offset; 99203288Srnoland unsigned long agp_offset; 100203288Srnoland drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES]; 101203288Srnoland uint32_t dma_diff; 102203288Srnoland} drm_via_private_t; 103203288Srnoland 104203288Srnolandenum via_family { 105203288Srnoland VIA_OTHER = 0, /* Baseline */ 106203288Srnoland VIA_PRO_GROUP_A, /* Another video engine and DMA commands */ 107203288Srnoland VIA_DX9_0 /* Same video as pro_group_a, but 3D is unsupported */ 108203288Srnoland}; 109203288Srnoland 110203288Srnoland/* VIA MMIO register access */ 111203288Srnoland#define VIA_BASE ((dev_priv->mmio)) 112203288Srnoland 113203288Srnoland#define VIA_READ(reg) DRM_READ32(VIA_BASE, reg) 114203288Srnoland#define VIA_WRITE(reg,val) DRM_WRITE32(VIA_BASE, reg, val) 115203288Srnoland#define VIA_READ8(reg) DRM_READ8(VIA_BASE, reg) 116203288Srnoland#define VIA_WRITE8(reg,val) DRM_WRITE8(VIA_BASE, reg, val) 117203288Srnoland 118203288Srnolandextern struct drm_ioctl_desc via_ioctls[]; 119203288Srnolandextern int via_max_ioctl; 120203288Srnoland 121203288Srnolandextern int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv); 122203288Srnolandextern int via_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv); 123203288Srnolandextern int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv); 124203288Srnolandextern int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv); 125203288Srnolandextern int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv); 126203288Srnolandextern int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_priv); 127203288Srnolandextern int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv); 128203288Srnolandextern int via_dma_blit_sync( struct drm_device *dev, void *data, struct drm_file *file_priv ); 129203288Srnolandextern int via_dma_blit( struct drm_device *dev, void *data, struct drm_file *file_priv ); 130203288Srnoland 131203288Srnolandextern int via_driver_load(struct drm_device *dev, unsigned long chipset); 132203288Srnolandextern int via_driver_unload(struct drm_device *dev); 133203288Srnoland 134203288Srnolandextern int via_init_context(struct drm_device * dev, int context); 135203288Srnolandextern int via_final_context(struct drm_device * dev, int context); 136203288Srnoland 137203288Srnolandextern int via_do_cleanup_map(struct drm_device * dev); 138203288Srnolandextern u32 via_get_vblank_counter(struct drm_device *dev, int crtc); 139203288Srnolandextern int via_enable_vblank(struct drm_device *dev, int crtc); 140203288Srnolandextern void via_disable_vblank(struct drm_device *dev, int crtc); 141203288Srnoland 142203288Srnolandextern irqreturn_t via_driver_irq_handler(DRM_IRQ_ARGS); 143203288Srnolandextern void via_driver_irq_preinstall(struct drm_device * dev); 144203288Srnolandextern int via_driver_irq_postinstall(struct drm_device *dev); 145203288Srnolandextern void via_driver_irq_uninstall(struct drm_device * dev); 146203288Srnoland 147203288Srnolandextern int via_dma_cleanup(struct drm_device * dev); 148203288Srnolandextern void via_init_command_verifier(void); 149203288Srnolandextern int via_driver_dma_quiescent(struct drm_device * dev); 150203288Srnolandextern void via_init_futex(drm_via_private_t *dev_priv); 151203288Srnolandextern void via_cleanup_futex(drm_via_private_t *dev_priv); 152203288Srnolandextern void via_release_futex(drm_via_private_t *dev_priv, int context); 153203288Srnoland 154203288Srnolandextern void via_reclaim_buffers_locked(struct drm_device *dev, 155203288Srnoland struct drm_file *file_priv); 156203288Srnolandextern void via_lastclose(struct drm_device *dev); 157203288Srnoland 158203288Srnolandextern void via_dmablit_handler(struct drm_device *dev, int engine, int from_irq); 159203288Srnolandextern void via_init_dmablit(struct drm_device *dev); 160203288Srnoland 161203288Srnoland#endif 162