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#include "dev/drm/drmP.h" 29203288Srnoland#include "dev/drm/via_drm.h" 30203288Srnoland#include "dev/drm/via_drv.h" 31203288Srnoland 32203288Srnolandstatic int via_do_init_map(struct drm_device * dev, drm_via_init_t * init) 33203288Srnoland{ 34203288Srnoland drm_via_private_t *dev_priv = dev->dev_private; 35203288Srnoland 36203288Srnoland DRM_DEBUG("\n"); 37203288Srnoland 38203288Srnoland dev_priv->sarea = drm_getsarea(dev); 39203288Srnoland if (!dev_priv->sarea) { 40203288Srnoland DRM_ERROR("could not find sarea!\n"); 41203288Srnoland dev->dev_private = (void *)dev_priv; 42203288Srnoland via_do_cleanup_map(dev); 43203288Srnoland return -EINVAL; 44203288Srnoland } 45203288Srnoland 46203288Srnoland dev_priv->fb = drm_core_findmap(dev, init->fb_offset); 47203288Srnoland if (!dev_priv->fb) { 48203288Srnoland DRM_ERROR("could not find framebuffer!\n"); 49203288Srnoland dev->dev_private = (void *)dev_priv; 50203288Srnoland via_do_cleanup_map(dev); 51203288Srnoland return -EINVAL; 52203288Srnoland } 53203288Srnoland dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset); 54203288Srnoland if (!dev_priv->mmio) { 55203288Srnoland DRM_ERROR("could not find mmio region!\n"); 56203288Srnoland dev->dev_private = (void *)dev_priv; 57203288Srnoland via_do_cleanup_map(dev); 58203288Srnoland return -EINVAL; 59203288Srnoland } 60203288Srnoland 61203288Srnoland dev_priv->sarea_priv = 62207066Srnoland (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->virtual + 63203288Srnoland init->sarea_priv_offset); 64203288Srnoland 65203288Srnoland dev_priv->agpAddr = init->agpAddr; 66203288Srnoland 67203288Srnoland via_init_futex(dev_priv); 68203288Srnoland 69203288Srnoland via_init_dmablit(dev); 70203288Srnoland 71203288Srnoland dev->dev_private = (void *)dev_priv; 72203288Srnoland return 0; 73203288Srnoland} 74203288Srnoland 75203288Srnolandint via_do_cleanup_map(struct drm_device * dev) 76203288Srnoland{ 77203288Srnoland via_dma_cleanup(dev); 78203288Srnoland 79203288Srnoland return 0; 80203288Srnoland} 81203288Srnoland 82203288Srnolandint via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv) 83203288Srnoland{ 84203288Srnoland drm_via_init_t *init = data; 85203288Srnoland 86203288Srnoland DRM_DEBUG("\n"); 87203288Srnoland 88203288Srnoland switch (init->func) { 89203288Srnoland case VIA_INIT_MAP: 90203288Srnoland return via_do_init_map(dev, init); 91203288Srnoland case VIA_CLEANUP_MAP: 92203288Srnoland return via_do_cleanup_map(dev); 93203288Srnoland } 94203288Srnoland 95203288Srnoland return -EINVAL; 96203288Srnoland} 97203288Srnoland 98203288Srnolandint via_driver_load(struct drm_device *dev, unsigned long chipset) 99203288Srnoland{ 100203288Srnoland drm_via_private_t *dev_priv; 101203288Srnoland int ret = 0; 102203288Srnoland 103203288Srnoland dev_priv = drm_alloc(sizeof(drm_via_private_t), DRM_MEM_DRIVER); 104203288Srnoland if (dev_priv == NULL) 105203288Srnoland return -ENOMEM; 106203288Srnoland 107203288Srnoland dev->dev_private = (void *)dev_priv; 108203288Srnoland 109203288Srnoland dev_priv->chipset = chipset; 110203288Srnoland 111203288Srnoland ret = drm_sman_init(&dev_priv->sman, 2, 12, 8); 112203288Srnoland if (ret) { 113203288Srnoland drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 114203288Srnoland return ret; 115203288Srnoland } 116203288Srnoland 117203288Srnoland ret = drm_vblank_init(dev, 1); 118203288Srnoland if (ret) { 119203288Srnoland drm_sman_takedown(&dev_priv->sman); 120203288Srnoland drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 121203288Srnoland return ret; 122203288Srnoland } 123203288Srnoland 124203288Srnoland return 0; 125203288Srnoland} 126203288Srnoland 127203288Srnolandint via_driver_unload(struct drm_device *dev) 128203288Srnoland{ 129203288Srnoland drm_via_private_t *dev_priv = dev->dev_private; 130203288Srnoland 131203288Srnoland drm_sman_takedown(&dev_priv->sman); 132203288Srnoland 133203288Srnoland drm_free(dev_priv, sizeof(drm_via_private_t), DRM_MEM_DRIVER); 134203288Srnoland dev->dev_private = NULL; 135203288Srnoland 136203288Srnoland return 0; 137203288Srnoland} 138