diff options
40 files changed, 264 insertions, 243 deletions
| diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c index 2473162b..78efcf2a 100644 --- a/libdrm/xf86drm.c +++ b/libdrm/xf86drm.c @@ -31,10 +31,6 @@   * DEALINGS IN THE SOFTWARE.   */ -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif -  #ifdef HAVE_CONFIG_H  # include <config.h>  #endif @@ -2503,7 +2499,7 @@ void drmBOFreeList(drmBOList *list)  	DRMLISTDEL(l);  	node = DRMLISTENTRY(drmBONode, l, head);  	free(node); -	l = list->free.next; +	l = list->list.next;  	list->numCurrent--;  	list->numOnList--;      } @@ -2892,7 +2888,7 @@ int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle)      req->handle = buf->handle;      req->mask = flags;      req->arg_handle = fenceHandle; -    req->op = drm_bo_validate; +    req->op = drm_bo_fence;      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg); diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h index e84b23d7..d4260cc9 100644 --- a/libdrm/xf86drm.h +++ b/libdrm/xf86drm.h @@ -31,8 +31,6 @@   *   */ -/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/xf86drm.h,v 1.26 2003/08/16 19:26:37 dawes Exp $ */ -  #ifndef _XF86DRM_H_  #define _XF86DRM_H_ diff --git a/libdrm/xf86drmHash.c b/libdrm/xf86drmHash.c index a1908d09..d1ade063 100644 --- a/libdrm/xf86drmHash.c +++ b/libdrm/xf86drmHash.c @@ -25,8 +25,6 @@   *   * Authors: Rickard E. (Rik) Faith <faith@valinux.com>   * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmHash.c,v 1.4 2001/03/21 18:08:54 dawes Exp $ - *   * DESCRIPTION   *   * This file contains a straightforward implementation of a fixed-sized @@ -70,25 +68,14 @@   *   */ -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif +#include <stdio.h> +#include <stdlib.h>  #define HASH_MAIN 0 -#if HASH_MAIN -# include <stdio.h> -# include <stdlib.h> -#else +#if !HASH_MAIN  # include "drm.h"  # include "xf86drm.h" -# ifdef XFree86LOADER -#  include "xf86.h" -#  include "xf86_ansic.h" -# else -#  include <stdio.h> -#  include <stdlib.h> -# endif  #endif  #define HASH_MAGIC 0xdeadbeef diff --git a/libdrm/xf86drmRandom.c b/libdrm/xf86drmRandom.c index 3f5bf611..61ffb078 100644 --- a/libdrm/xf86drmRandom.c +++ b/libdrm/xf86drmRandom.c @@ -25,8 +25,6 @@   *    * Authors: Rickard E. (Rik) Faith <faith@valinux.com>   * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmRandom.c,v 1.4 2000/06/17 00:03:34 martin Exp $ - *   * DESCRIPTION   *   * This file contains a simple, straightforward implementation of the Park @@ -73,25 +71,14 @@   *   */ -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif +#include <stdio.h> +#include <stdlib.h>  #define RANDOM_MAIN 0 -#if RANDOM_MAIN -# include <stdio.h> -# include <stdlib.h> -#else +#if !RANDOM_MAIN  # include "drm.h"  # include "xf86drm.h" -# ifdef XFree86LOADER -#  include "xf86.h" -#  include "xf86_ansic.h" -# else -#  include <stdio.h> -#  include <stdlib.h> -# endif  #endif  #define RANDOM_MAGIC 0xfeedbeef diff --git a/libdrm/xf86drmSL.c b/libdrm/xf86drmSL.c index ab2cc098..ce60648d 100644 --- a/libdrm/xf86drmSL.c +++ b/libdrm/xf86drmSL.c @@ -25,8 +25,6 @@   *    * Authors: Rickard E. (Rik) Faith <faith@valinux.com>   * - * $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/drm/xf86drmSL.c,v 1.3 2000/06/17 00:03:34 martin Exp $ - *   * DESCRIPTION   *   * This file contains a straightforward skip list implementation.n @@ -40,26 +38,16 @@   *   */ -#ifdef HAVE_XORG_CONFIG_H -#include <xorg-config.h> -#endif +#include <stdio.h> +#include <stdlib.h>  #define SL_MAIN 0 -#if SL_MAIN -# include <stdio.h> -# include <stdlib.h> -#  include <sys/time.h> -#else +#if !SL_MAIN  # include "drm.h"  # include "xf86drm.h" -# ifdef XFree86LOADER -#  include "xf86.h" -#  include "xf86_ansic.h" -# else -#  include <stdio.h> -#  include <stdlib.h> -# endif +#else +# include <sys/time.h>  #endif  #define SL_LIST_MAGIC  0xfacade00LU diff --git a/linux-core/Makefile b/linux-core/Makefile index af29bd6a..1758777c 100644 --- a/linux-core/Makefile +++ b/linux-core/Makefile @@ -283,6 +283,7 @@ CONFIG_DRM_SAVAGE := n  CONFIG_DRM_VIA := n  CONFIG_DRM_MACH64 := n  CONFIG_DRM_NV := n +CONFIG_DRM_NOUVEAU := n  # Enable module builds for the modules requested/supported. diff --git a/linux-core/drmP.h b/linux-core/drmP.h index 380570bc..4e36dab1 100644 --- a/linux-core/drmP.h +++ b/linux-core/drmP.h @@ -1139,6 +1139,10 @@ extern drm_head_t **drm_heads;  extern struct drm_sysfs_class *drm_class;  extern struct proc_dir_entry *drm_proc_root; +extern drm_local_map_t *drm_getsarea(struct drm_device *dev); +extern int drm_wait_on(drm_device_t *dev, wait_queue_head_t *queue, +		       int timeout, int (*fn)(drm_device_t *dev, void *priv), +		       void *priv);  				/* Proc support (drm_proc.h) */  extern int drm_proc_init(drm_device_t * dev,  			 int minor, diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index 27016d8c..50f62dce 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -2309,6 +2309,9 @@ void drm_bo_unmap_virtual(drm_buffer_object_t * bo)  	loff_t offset = ((loff_t) bo->map_list.hash.key) << PAGE_SHIFT;  	loff_t holelen = ((loff_t) bo->mem.num_pages) << PAGE_SHIFT; +	if (!dev->dev_mapping) +		return; +  	unmap_mapping_range(dev->dev_mapping, offset, holelen, 1);  } diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index e5a4b32b..245fe5be 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -170,6 +170,7 @@ void drm_framebuffer_destroy(struct drm_framebuffer *fb)  	kfree(fb);  } +EXPORT_SYMBOL(drm_framebuffer_destroy);  /**   * drm_crtc_create - create a new CRTC object @@ -790,10 +791,8 @@ static void drm_pick_crtcs (drm_device_t *dev)  				break;  		} -  		/* No preferred mode, let's select another which should pick    		 * the default 640x480 if nothing else is here. -  		 *   		 */  		if (!des_mode || !(des_mode->flags & DRM_MODE_TYPE_PREFERRED)) {  			list_for_each_entry(des_mode, &output->modes, head) { @@ -857,12 +856,7 @@ clone:   */  bool drm_initial_config(drm_device_t *dev, bool can_grow)  { -	/* do a hardcoded initial configuration here */ -	struct drm_display_mode *des_mode = NULL;  	struct drm_output *output; -	struct drm_framebuffer *fb; -	drm_buffer_object_t *fbo; -	unsigned long size, bytes_per_pixel;  	int ret = false;  	spin_lock(&dev->mode_config.config_lock); @@ -877,48 +871,10 @@ bool drm_initial_config(drm_device_t *dev, bool can_grow)  		if (!output->crtc || !output->crtc->desired_mode)  			continue; -		fb = drm_framebuffer_create(dev); -		if (!fb) { -			DRM_ERROR("failed to allocate fb.\n"); -			ret = true; -			goto out; -		} -		output->crtc->fb = fb; -		des_mode = output->crtc->desired_mode; - -		if (des_mode->hdisplay > fb->width) -			fb->width = des_mode->hdisplay; -		if (des_mode->vdisplay > fb->height) -			fb->height = des_mode->vdisplay; - -		/* FIXME: multiple depths */ -		bytes_per_pixel = 4; -		fb->bits_per_pixel = 32; -		fb->pitch = fb->width * ((fb->bits_per_pixel + 1) / 8); -		fb->depth = 24; -		size = fb->width * fb->height * bytes_per_pixel; -		/* FIXME - what about resizeable objects ??? */ -		ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel, -					       DRM_BO_FLAG_READ | -					       DRM_BO_FLAG_WRITE | -					       DRM_BO_FLAG_MEM_PRIV0 | -					       DRM_BO_FLAG_NO_MOVE, -					       0, 0, 0, -					       &fbo); -		if (ret) { -			printk(KERN_ERR "failed to allocate framebuffer\n"); -			drm_framebuffer_destroy(fb); -			continue; -		} -		fb->offset = fbo->offset; -		fb->bo = fbo; -		printk("allocated %dx%d fb: 0x%08lx, bo %p\n", fb->width, -		       fb->height, fbo->offset, fbo);  		dev->driver->fb_probe(dev, output->crtc);  	}  	drm_disable_unused_functions(dev); -out:  	spin_unlock(&dev->mode_config.config_lock);  	return ret;  } @@ -946,10 +902,6 @@ void drm_mode_config_cleanup(drm_device_t *dev)  		drm_output_destroy(output);  	} -	list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { -		drm_crtc_destroy(crtc); -	} -  	list_for_each_entry_safe(mode, mt, &dev->mode_config.usermode_list, head) {  		drm_mode_destroy(dev, mode);  	} @@ -964,6 +916,11 @@ void drm_mode_config_cleanup(drm_device_t *dev)  		}  		drm_framebuffer_destroy(fb);  	} + +	list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { +		drm_crtc_destroy(crtc); +	} +  }  EXPORT_SYMBOL(drm_mode_config_cleanup); diff --git a/linux-core/drm_crtc.h b/linux-core/drm_crtc.h index 7ca8311b..e8a527b0 100644 --- a/linux-core/drm_crtc.h +++ b/linux-core/drm_crtc.h @@ -520,8 +520,12 @@ extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev);  extern bool drm_initial_config(struct drm_device *dev, bool cangrow);  extern void drm_framebuffer_set_object(struct drm_device *dev,  				       unsigned long handle); +extern struct drm_framebuffer *drm_framebuffer_create(struct drm_device *dev); +extern void drm_framebuffer_destroy(struct drm_framebuffer *fb);  extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc);  extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); +extern bool drm_crtc_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, +		       int x, int y);  /* IOCTLs */  extern int drm_mode_getresources(struct inode *inode, struct file *filp, diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index dc52f302..76fb90c9 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -632,3 +632,45 @@ err_i1:  	return retcode;  }  EXPORT_SYMBOL(drm_ioctl); + +int drm_wait_on(drm_device_t *dev, wait_queue_head_t *queue, int timeout, +		int (*fn)(drm_device_t *dev, void *priv), void *priv) +{ +	DECLARE_WAITQUEUE(entry, current); +	unsigned long end = jiffies + (timeout); +	int ret = 0; +	add_wait_queue(queue, &entry); + +	for (;;) { +		__set_current_state(TASK_INTERRUPTIBLE); +		if ((*fn)(dev, priv)) +			break; +		if (time_after_eq(jiffies, end)) { +			ret = -EBUSY; +			break; +		} +		schedule_timeout((HZ/100 > 1) ? HZ/100 : 1); +		if (signal_pending(current)) { +			ret = -EINTR; +			break; +		} +	} +	__set_current_state(TASK_RUNNING); +	remove_wait_queue(queue, &entry); +	return ret; +} +EXPORT_SYMBOL(drm_wait_on); + +drm_local_map_t *drm_getsarea(struct drm_device *dev) +{ +	drm_map_list_t *entry; + +	list_for_each_entry(entry, &dev->maplist->head, head) { +		if (entry->map && entry->map->type == _DRM_SHM && +		    (entry->map->flags & _DRM_CONTAINS_LOCK)) { +			return entry->map; +		} +	} +	return NULL; +} +EXPORT_SYMBOL(drm_getsarea); diff --git a/linux-core/drm_fb.c b/linux-core/drm_fb.c index 7a105d59..775fd180 100644 --- a/linux-core/drm_fb.c +++ b/linux-core/drm_fb.c @@ -259,6 +259,7 @@ static int drmfb_set_par(struct fb_info *info)  	drm_mode->clock = PICOS2KHZ(var->pixclock);  	drm_mode->vrefresh = drm_mode_vrefresh(drm_mode);  	drm_mode_set_name(drm_mode); +	drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V);  #endif  	if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0)) @@ -418,9 +419,10 @@ int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc)  }  EXPORT_SYMBOL(drmfb_probe); -int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) +int drmfb_remove(struct drm_device *dev, struct drm_crtc *crtc)  {  	struct fb_info *info = fb->fbdev; +	struct drm_framebuffer *fb = crtc->fb;  	if (info) {  		drm_mem_reg_iounmap(dev, &fb->bo->mem, fb->virtual_base); diff --git a/linux-core/drm_fence.c b/linux-core/drm_fence.c index 088c50d6..ce161dc3 100644 --- a/linux-core/drm_fence.c +++ b/linux-core/drm_fence.c @@ -1,8 +1,8 @@  /************************************************************************** - *  + *   * Copyright (c) 2006-2007 Tungsten Graphics, Inc., Cedar Park, TX., USA   * All Rights Reserved. - *  + *   * Permission is hereby granted, free of charge, to any person obtaining a   * copy of this software and associated documentation files (the   * "Software"), to deal in the Software without restriction, including @@ -10,17 +10,17 @@   * distribute, sub license, and/or sell copies of the Software, and to   * permit persons to whom the Software is furnished to do so, subject to   * the following conditions: - *  + *   * The above copyright notice and this permission notice (including the   * next paragraph) shall be included in all copies or substantial portions   * of the Software. - *  + *   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,   * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL   * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, - * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR  - * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE  + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE   * USE OR OTHER DEALINGS IN THE SOFTWARE.   *   **************************************************************************/ @@ -49,8 +49,6 @@ void drm_fence_handler(drm_device_t * dev, uint32_t class,  	int is_exe = (type & DRM_FENCE_TYPE_EXE);  	int ge_last_exe; - -	  	diff = (sequence - fc->exe_flush_sequence) & driver->sequence_mask;  	if (fc->pending_exe_flush && is_exe && diff < driver->wrap_diff) @@ -59,13 +57,13 @@ void drm_fence_handler(drm_device_t * dev, uint32_t class,  	diff = (sequence - fc->last_exe_flush) & driver->sequence_mask;  	ge_last_exe = diff < driver->wrap_diff; -	if (ge_last_exe)  +	if (ge_last_exe)  		fc->pending_flush &= ~type;  	if (is_exe && ge_last_exe) {  		fc->last_exe_flush = sequence;  	} -	 +  	if (list_empty(&fc->ring))  		return; @@ -107,9 +105,8 @@ void drm_fence_handler(drm_device_t * dev, uint32_t class,  				  fence->base.hash.key);  			list_del_init(&fence->ring);  		} -  	} -	 +  	if (wake) {  		DRM_WAKEUP(&fc->fence_queue);  	} @@ -266,7 +263,7 @@ void drm_fence_flush_old(drm_device_t * dev, uint32_t class, uint32_t sequence)  		fc->exe_flush_sequence = sequence - (driver->flush_diff / 2);  	}  	write_unlock_irqrestore(&fm->lock, flags); -	 +  	mutex_lock(&dev->struct_mutex);  	read_lock_irqsave(&fm->lock, flags); @@ -413,7 +410,7 @@ int drm_fence_object_emit(drm_device_t * dev, drm_fence_object_t * fence,  	fence->signaled = 0x00;  	fence->sequence = sequence;  	fence->native_type = native_type; -	if (list_empty(&fc->ring))  +	if (list_empty(&fc->ring))  		fc->last_exe_flush = sequence - 1;  	list_add_tail(&fence->ring, &fc->ring);  	write_unlock_irqrestore(&fm->lock, flags); @@ -498,7 +495,6 @@ void drm_fence_manager_init(drm_device_t * dev)  	drm_fence_driver_t *fed = dev->driver->fence_driver;  	int i; -  	rwlock_init(&fm->lock);  	write_lock(&fm->lock);  	fm->initialized = 0; diff --git a/linux-core/drm_memory.c b/linux-core/drm_memory.c index 86c869f1..759e1f15 100644 --- a/linux-core/drm_memory.c +++ b/linux-core/drm_memory.c @@ -47,7 +47,7 @@ static struct {  static inline size_t drm_size_align(size_t size) { -	register size_t tmpSize = 4; +	size_t tmpSize = 4;  	if (size > PAGE_SIZE)  		return PAGE_ALIGN(size); diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 0c7f2e32..b6754453 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -29,8 +29,7 @@   */  #ifndef _DRM_OBJECTS_H -#define _DRM_OJBECTS_H -#define DRM_HAS_TTM +#define _DRM_OBJECTS_H  struct drm_device; @@ -248,9 +247,9 @@ typedef struct drm_ttm_backend_func {  typedef struct drm_ttm_backend { -        uint32_t flags; -        int mem_type; -        drm_ttm_backend_func_t *func; +	uint32_t flags; +	int mem_type; +	drm_ttm_backend_func_t *func;  } drm_ttm_backend_t;  typedef struct drm_ttm { diff --git a/linux-core/drm_os_linux.h b/linux-core/drm_os_linux.h index 816959e8..2ea105c5 100644 --- a/linux-core/drm_os_linux.h +++ b/linux-core/drm_os_linux.h @@ -119,24 +119,6 @@ static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size)  #define DRM_GET_PRIV_WITH_RETURN(_priv, _filp) _priv = _filp->private_data -/** - * Get the pointer to the SAREA. - * - * Searches the SAREA on the mapping lists and points drm_device::sarea to it. - */ -#define DRM_GETSAREA()							 \ -do { 									 \ -	drm_map_list_t *entry;						 \ -	list_for_each_entry( entry, &dev->maplist->head, head ) {	 \ -		if ( entry->map &&					 \ -		     entry->map->type == _DRM_SHM &&			 \ -		     (entry->map->flags & _DRM_CONTAINS_LOCK) ) {	 \ -			dev_priv->sarea = entry->map;			 \ - 			break;						 \ - 		}							 \ - 	}								 \ -} while (0) -  #define DRM_HZ HZ  #define DRM_WAIT_ON( ret, queue, timeout, condition )		\ diff --git a/linux-core/drm_vm.c b/linux-core/drm_vm.c index 1f905fba..b8871539 100644 --- a/linux-core/drm_vm.c +++ b/linux-core/drm_vm.c @@ -516,8 +516,7 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma)  		return -EINVAL;  	} -	if (!capable(CAP_SYS_ADMIN) && -	    (dma->flags & _DRM_DMA_USE_PCI_RO)) { +	if (!capable(CAP_SYS_ADMIN) && (dma->flags & _DRM_DMA_USE_PCI_RO)) {  		vma->vm_flags &= ~(VM_WRITE | VM_MAYWRITE);  #if defined(__i386__) || defined(__x86_64__)  		pgprot_val(vma->vm_page_prot) &= ~_PAGE_RW; @@ -739,7 +738,7 @@ static unsigned long drm_bo_vm_nopfn(struct vm_area_struct *vma,  	unsigned long bus_base;  	unsigned long bus_offset;  	unsigned long bus_size; -	int ret = NOPFN_REFAULT; +	unsigned long ret = NOPFN_REFAULT;  	if (address > vma->vm_end)  		return NOPFN_SIGBUS; diff --git a/linux-core/intel_drv.h b/linux-core/intel_drv.h index 9205b99b..0a03e37b 100644 --- a/linux-core/intel_drv.h +++ b/linux-core/intel_drv.h @@ -76,7 +76,7 @@ extern struct drm_display_mode *intel_crtc_mode_get(drm_device_t *dev,  extern void intel_wait_for_vblank(drm_device_t *dev);  extern struct drm_crtc *intel_get_crtc_from_pipe(drm_device_t *dev, int pipe); -extern int intelfb_probe(struct drm_device *dev, struct drm_framebuffer *fb); -extern int intelfb_remove(struct drm_device *dev, struct drm_framebuffer *fb); +extern int intelfb_probe(struct drm_device *dev, struct drm_crtc *crtc); +extern int intelfb_remove(struct drm_device *dev, struct drm_crtc *crtc);  #endif /* __INTEL_DRV_H__ */ diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c index 2ce66460..449ef543 100644 --- a/linux-core/intel_fb.c +++ b/linux-core/intel_fb.c @@ -211,7 +211,6 @@ static int intelfb_set_par(struct fb_info *info)  	struct drm_device *dev = par->dev;          struct drm_display_mode *drm_mode;          struct fb_var_screeninfo *var = &info->var; -        struct drm_output *output;          switch (var->bits_per_pixel) {          case 16: @@ -263,6 +262,7 @@ static int intelfb_set_par(struct fb_info *info)          drm_mode->clock = PICOS2KHZ(var->pixclock);          drm_mode->vrefresh = drm_mode_vrefresh(drm_mode);          drm_mode_set_name(drm_mode); +	drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V);  #endif          if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0)) @@ -444,8 +444,9 @@ int intelfb_probe(struct drm_device *dev, struct drm_crtc *crtc)  	struct fb_info *info;  	struct intelfb_par *par;  	struct device *device = &dev->pdev->dev;  -	struct drm_framebuffer *fb = crtc->fb; +	struct drm_framebuffer *fb;  	struct drm_display_mode *mode = crtc->desired_mode; +	drm_buffer_object_t *fbo = NULL;  	int ret;  	info = framebuffer_alloc(sizeof(struct intelfb_par), device); @@ -453,6 +454,41 @@ int intelfb_probe(struct drm_device *dev, struct drm_crtc *crtc)  		return -EINVAL;  	} +	fb = drm_framebuffer_create(dev); +	if (!fb) { +		framebuffer_release(info); +		DRM_ERROR("failed to allocate fb.\n"); +		return -EINVAL; +	} +	crtc->fb = fb; + +	fb->width = crtc->desired_mode->hdisplay; +	fb->height = crtc->desired_mode->vdisplay; + +	fb->bits_per_pixel = 32; +	fb->pitch = fb->width * ((fb->bits_per_pixel + 1) / 8); +	fb->depth = 24; +	ret = drm_buffer_object_create(dev,  +				       fb->width * fb->height * 4,  +				       drm_bo_type_kernel, +				       DRM_BO_FLAG_READ | +				       DRM_BO_FLAG_WRITE | +				       DRM_BO_FLAG_MEM_PRIV0 | /* FIXME! */ +				       DRM_BO_FLAG_NO_MOVE, +				       0, 0, 0, +				       &fbo); +	if (ret || !fbo) { +		printk(KERN_ERR "failed to allocate framebuffer\n"); +		drm_framebuffer_destroy(fb); +		framebuffer_release(info); +		return -EINVAL; +	} +	fb->offset = fbo->offset; +	fb->bo = fbo; +	printk("allocated %dx%d fb: 0x%08lx, bo %p\n", fb->width, +		       fb->height, fbo->offset, fbo); + +  	fb->fbdev = info;  	par = info->par; @@ -505,7 +541,9 @@ int intelfb_probe(struct drm_device *dev, struct drm_crtc *crtc)          info->var.vsync_len = mode->vsync_end - mode->vsync_start;  	info->var.upper_margin = mode->vtotal - mode->vsync_end;          info->var.pixclock = 10000000 / mode->htotal * 1000 / -		mode->vtotal * 100000 / mode->vrefresh; +		mode->vtotal * 100; +	/* avoid overflow */ +	info->var.pixclock = info->var.pixclock * 1000 / mode->vrefresh;  	info->pixmap.size = 64*1024;  	info->pixmap.buf_align = 8; diff --git a/linux-core/intel_sdvo.c b/linux-core/intel_sdvo.c index c02fd958..196298ff 100644 --- a/linux-core/intel_sdvo.c +++ b/linux-core/intel_sdvo.c @@ -213,20 +213,20 @@ static void intel_sdvo_write_cmd(struct drm_output *output, u8 cmd,  	int i;          if (1) { -                printk("%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd); +                DRM_DEBUG("%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd);                  for (i = 0; i < args_len; i++) -                        printk("%02X ", ((u8 *)args)[i]); +                        DRM_DEBUG("%02X ", ((u8 *)args)[i]);                  for (; i < 8; i++) -                        printk("   "); +                        DRM_DEBUG("   ");                  for (i = 0; i < sizeof(sdvo_cmd_names) / sizeof(sdvo_cmd_names[0]); i++) {                          if (cmd == sdvo_cmd_names[i].cmd) { -                                printk("(%s)", sdvo_cmd_names[i].name); +                                DRM_DEBUG("(%s)", sdvo_cmd_names[i].name);                                  break;                          }                  }                  if (i == sizeof(sdvo_cmd_names)/ sizeof(sdvo_cmd_names[0])) -                        printk("(%02X)",cmd); -                printk("\n"); +                        DRM_DEBUG("(%02X)",cmd); +                DRM_DEBUG("\n");          }  	for (i = 0; i < args_len; i++) { @@ -266,16 +266,16 @@ static u8 intel_sdvo_read_response(struct drm_output *output, void *response,  		intel_sdvo_read_byte(output, SDVO_I2C_CMD_STATUS, &status);  	        if (1) { -			printk("%s: R: ", SDVO_NAME(sdvo_priv)); +			DRM_DEBUG("%s: R: ", SDVO_NAME(sdvo_priv));         			for (i = 0; i < response_len; i++) -                        	printk("%02X ", ((u8 *)response)[i]); +                        	DRM_DEBUG("%02X ", ((u8 *)response)[i]);                  	for (; i < 8; i++) -                        	printk("   "); +                        	DRM_DEBUG("   ");                  	if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP) -                        	printk("(%s)", cmd_status_names[status]); +                        	DRM_DEBUG("(%s)", cmd_status_names[status]);                  	else -                        	printk("(??? %d)", status); -                	printk("\n"); +                        	DRM_DEBUG("(??? %d)", status); +                	DRM_DEBUG("\n");          	}  		if (status != SDVO_CMD_STATUS_PENDING) diff --git a/scripts/create_lk_drm.sh b/scripts/create_lk_drm.sh index 1028853a..ddfbf499 100755 --- a/scripts/create_lk_drm.sh +++ b/scripts/create_lk_drm.sh @@ -48,4 +48,10 @@ do  unifdef -D__linux__ -DI915_HAVE_FENCE -DI915_HAVE_BUFFER $i > $i.tmp  mv $i.tmp $i  done + +for i in drm*.[ch] +do +unifdef -UDRM_ODD_MM_COMPAT -D__linux__ $i > $i.tmp +mv $i.tmp $i +done  cd - diff --git a/shared-core/drm.h b/shared-core/drm.h index 890dcf88..0f4a878b 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -80,14 +80,7 @@  #define DRM_IOC_READWRITE	_IOC_READ|_IOC_WRITE  #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)  #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) -#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && defined(IN_MODULE) -/* Prevent name collision when including sys/ioccom.h */ -#undef ioctl  #include <sys/ioccom.h> -#define ioctl(a,b,c)		xf86ioctl(a,b,c) -#else -#include <sys/ioccom.h> -#endif				/* __FreeBSD__ && xf86ioctl */  #define DRM_IOCTL_NR(n)		((n) & 0xff)  #define DRM_IOC_VOID		IOC_VOID  #define DRM_IOC_READ		IOC_OUT @@ -796,9 +789,9 @@ typedef struct drm_fence_arg {  typedef enum {  	drm_bo_type_dc, -	drm_bo_type_kernel, /* for initial kernel allocations */  	drm_bo_type_user, -	drm_bo_type_fake +	drm_bo_type_fake, +	drm_bo_type_kernel, /* for initial kernel allocations */  }drm_bo_type_t; diff --git a/shared-core/drm_pciids.txt b/shared-core/drm_pciids.txt index f090489f..ad67dda2 100644 --- a/shared-core/drm_pciids.txt +++ b/shared-core/drm_pciids.txt @@ -187,7 +187,6 @@  0x1002 0x4c51 0 "3D Rage LT Pro"  0x1002 0x4c42 0 "3D Rage LT Pro AGP-133"  0x1002 0x4c44 0 "3D Rage LT Pro AGP-66" -0x1002 0x4759 0 "Rage 3D IICATI 3D RAGE IIC AGP(A12/A13)"  0x1002 0x474c 0 "Rage XC"  0x1002 0x474f 0 "Rage XL"  0x1002 0x4752 0 "Rage XL" diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index f4761da9..a5e51de4 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -98,10 +98,13 @@ static int i915_initialize(drm_device_t * dev,  			   drm_i915_private_t * dev_priv,  			   drm_i915_init_t * init)  { - -	/* reset ring pointers */ -	I915_WRITE(LP_RING + RING_LEN, 0); -	mb(); +	dev_priv->sarea = drm_getsarea(dev); +	if (!dev_priv->sarea) { +		DRM_ERROR("can not find sarea!\n"); +		dev->dev_private = (void *)dev_priv; +		i915_dma_cleanup(dev); +		return DRM_ERR(EINVAL); +	}  	memset((void *)(dev_priv->ring.virtual_start), 0, dev_priv->ring.Size); @@ -121,6 +124,29 @@ static int i915_initialize(drm_device_t * dev,  	 */  	dev_priv->allow_batchbuffer = 1; +	/* Enable vblank on pipe A for older X servers +	 */ +    	dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A; + +	/* Program Hardware Status Page */ +	dev_priv->status_page_dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE,  +	    0xffffffff); + +	if (!dev_priv->status_page_dmah) { +		dev->dev_private = (void *)dev_priv; +		i915_dma_cleanup(dev); +		DRM_ERROR("Can not allocate hardware status page\n"); +		return DRM_ERR(ENOMEM); +	} +	dev_priv->hw_status_page = dev_priv->status_page_dmah->vaddr; +	dev_priv->dma_status_page = dev_priv->status_page_dmah->busaddr; +	 +	memset(dev_priv->hw_status_page, 0, PAGE_SIZE); +	DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page); + +	I915_WRITE(0x02080, dev_priv->dma_status_page); +	DRM_DEBUG("Enabled hardware status page\n"); +	dev->dev_private = (void *)dev_priv;  	return 0;  } diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index 870fe402..4ceed3e3 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -381,6 +381,13 @@ void i915_user_irq_off(drm_i915_private_t *dev_priv)  	spin_unlock(&dev_priv->user_irq_lock);  } +static int wait_compare(struct drm_device *dev, void *priv) +{ +	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; +	int irq_nr = (u64)priv; + +	return (READ_BREADCRUMB(dev_priv) >= irq_nr); +}  static int i915_wait_irq(drm_device_t * dev, int irq_nr)  { @@ -396,8 +403,8 @@ static int i915_wait_irq(drm_device_t * dev, int irq_nr)  	dev_priv->sarea_priv->perf_boxes |= I915_BOX_WAIT;  	i915_user_irq_on(dev_priv); -	DRM_WAIT_ON(ret, dev_priv->irq_queue, 3 * DRM_HZ, -		    READ_BREADCRUMB(dev_priv) >= irq_nr); +	ret = drm_wait_on(dev, &dev_priv->irq_queue, 3 * DRM_HZ, wait_compare, +			  (void *)(u64)irq_nr);  	i915_user_irq_off(dev_priv);  	if (ret == DRM_ERR(EBUSY)) { @@ -719,9 +726,6 @@ void i915_driver_irq_postinstall(drm_device_t * dev)  	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);  	dev_priv->swaps_pending = 0; -	if (!dev_priv->vblank_pipe) -		dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A; -  	dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED;  	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);  	dev_priv->swaps_pending = 0; @@ -729,8 +733,6 @@ void i915_driver_irq_postinstall(drm_device_t * dev)  	dev_priv->user_irq_lock = SPIN_LOCK_UNLOCKED;  	dev_priv->user_irq_refcount = 0; -	if (!dev_priv->vblank_pipe) -		dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;  	i915_enable_interrupt(dev);  	DRM_INIT_WAITQUEUE(&dev_priv->irq_queue); diff --git a/shared-core/mach64_dma.c b/shared-core/mach64_dma.c index 3a5fdee8..60f55900 100644 --- a/shared-core/mach64_dma.c +++ b/shared-core/mach64_dma.c @@ -792,8 +792,7 @@ static int mach64_do_dma_init(drm_device_t * dev, drm_mach64_init_t * init)  	INIT_LIST_HEAD(&dev_priv->placeholders);  	INIT_LIST_HEAD(&dev_priv->pending); -	DRM_GETSAREA(); - +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("can not find sarea!\n");  		dev->dev_private = (void *)dev_priv; diff --git a/shared-core/mga_dma.c b/shared-core/mga_dma.c index e6468d67..78448282 100644 --- a/shared-core/mga_dma.c +++ b/shared-core/mga_dma.c @@ -830,8 +830,7 @@ static int mga_do_init_dma(drm_device_t * dev, drm_mga_init_t * init)  	dev_priv->texture_offset = init->texture_offset[0];  	dev_priv->texture_size = init->texture_size[0]; -	DRM_GETSAREA(); - +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("failed to find sarea!\n");  		return DRM_ERR(EINVAL); diff --git a/shared-core/nouveau_drm.h b/shared-core/nouveau_drm.h index 3ba7e961..1e7322e0 100644 --- a/shared-core/nouveau_drm.h +++ b/shared-core/nouveau_drm.h @@ -114,7 +114,7 @@ enum nouveau_card_type {  	NV_10      =10,  	NV_11      =10,  	NV_15      =10, -	NV_17      =10, +	NV_17      =17,  	NV_20      =20,  	NV_25      =20,  	NV_30      =30, diff --git a/shared-core/nouveau_fifo.c b/shared-core/nouveau_fifo.c index 92166eeb..8e66ca2e 100644 --- a/shared-core/nouveau_fifo.c +++ b/shared-core/nouveau_fifo.c @@ -51,7 +51,7 @@ int nouveau_fifo_ctx_size(drm_device_t* dev)  	if (dev_priv->card_type >= NV_40)  		return 128; -	else if (dev_priv->card_type >= NV_10) +	else if (dev_priv->card_type >= NV_17)  		return 64;  	else  		return 32; @@ -90,10 +90,12 @@ static int nouveau_fifo_instmem_configure(drm_device_t *dev)  			break;  		case NV_30:  		case NV_20: -		case NV_10: +		case NV_17:  			NV_WRITE(NV03_PFIFO_RAMFC, (dev_priv->ramfc_offset>>8) |  					(1 << 16) /* 64 Bytes entry*/); +			/* XXX nvidia blob set bit 18, 21,23 for nv20 & nv30 */  			break; +		case NV_10:  		case NV_04:  		case NV_03:  			NV_WRITE(NV03_PFIFO_RAMFC, dev_priv->ramfc_offset>>8); @@ -269,11 +271,12 @@ static void nouveau_nv10_context_init(drm_device_t *dev, int channel)          drm_nouveau_private_t *dev_priv = dev->dev_private;          struct nouveau_object *cb_obj;          uint32_t fifoctx; +        int ctx_size = nouveau_fifo_ctx_size(dev);          int i;          cb_obj  = dev_priv->fifos[channel].cmdbuf_obj; -        fifoctx = NV_RAMIN + dev_priv->ramfc_offset + channel*64; +        fifoctx = NV_RAMIN + dev_priv->ramfc_offset + channel*ctx_size; -        for (i=0;i<64;i+=4) +        for (i=0;i<ctx_size;i+=4)                  NV_WRITE(fifoctx + i, 0);          /* Fill entries that are seen filled in dumps of nvidia driver just @@ -327,6 +330,7 @@ static void nouveau_nv30_context_init(drm_device_t *dev, int channel)          RAMFC_WR(SEMAPHORE,             NV_READ(NV10_PFIFO_CACHE1_SEMAPHORE));  } +#if 0  static void nouveau_nv10_context_save(drm_device_t *dev)  {  	drm_nouveau_private_t *dev_priv = dev->dev_private; @@ -350,6 +354,7 @@ static void nouveau_nv10_context_save(drm_device_t *dev)  	RAMFC_WR(SEMAPHORE        , NV_READ(NV10_PFIFO_CACHE1_SEMAPHORE));  	RAMFC_WR(DMA_SUBROUTINE   , NV_READ(NV10_PFIFO_CACHE1_DMA_SUBROUTINE));  } +#endif  #undef RAMFC_WR  #define RAMFC_WR(offset, val) NV_WRITE(fifoctx + NV40_RAMFC_##offset, (val)) @@ -507,6 +512,7 @@ static int nouveau_fifo_alloc(drm_device_t* dev, int *chan_ret, DRMFILE filp)  			nouveau_nv04_context_init(dev, channel);  			break;  		case NV_10: +		case NV_17:  			nv10_graph_context_create(dev, channel);  			nouveau_nv10_context_init(dev, channel);  			break; diff --git a/shared-core/nouveau_irq.c b/shared-core/nouveau_irq.c index b7c1d532..8de6e705 100644 --- a/shared-core/nouveau_irq.c +++ b/shared-core/nouveau_irq.c @@ -372,6 +372,7 @@ static void nouveau_pgraph_irq_handler(drm_device_t *dev)  				nouveau_nv04_context_switch(dev);  				break;  			case NV_10: +			case NV_17:  				nouveau_nv10_context_switch(dev);  				break;  			case NV_20: diff --git a/shared-core/nouveau_mem.c b/shared-core/nouveau_mem.c index 541f1545..a5343b99 100644 --- a/shared-core/nouveau_mem.c +++ b/shared-core/nouveau_mem.c @@ -248,6 +248,7 @@ uint64_t nouveau_mem_fb_amount(struct drm_device *dev)  			}  			break;  		case NV_10: +		case NV_17:  		case NV_20:  		case NV_30:  		case NV_40: @@ -521,6 +522,7 @@ nouveau_instmem_configure_fixed_tables(struct drm_device *dev)  			break;  		case NV_30:  		case NV_20: +		case NV_17:  		case NV_10:  		case NV_04:  		case NV_03: diff --git a/shared-core/nv10_graph.c b/shared-core/nv10_graph.c index 4cc44e21..fb189709 100644 --- a/shared-core/nv10_graph.c +++ b/shared-core/nv10_graph.c @@ -640,6 +640,10 @@ int nv10_graph_context_create(drm_device_t *dev, int channel) {  	NV_WRITE_CTX(NV04_PGRAPH_PATTERN_SHAPE, 0x00000000);  	NV_WRITE_CTX(NV04_PGRAPH_BETA_AND     , 0xFFFFFFFF); +	NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_XMIN, 0); +	NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_YMIN, 0); +	NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_XMAX, 0x7fff); +	NV_WRITE_CTX(NV03_PGRAPH_ABS_UCLIP_YMAX, 0x7fff);  	NV_WRITE_CTX(NV03_PGRAPH_XY_LOGIC_MISC0, 0x0001ffff);  	/* is it really needed ??? */ diff --git a/shared-core/r128_cce.c b/shared-core/r128_cce.c index fc7bb8fc..a2ee18b7 100644 --- a/shared-core/r128_cce.c +++ b/shared-core/r128_cce.c @@ -456,8 +456,7 @@ static int r128_do_init_cce(drm_device_t * dev, drm_r128_init_t * init)  	dev_priv->span_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |  					 (dev_priv->span_offset >> 5)); -	DRM_GETSAREA(); - +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("could not find sarea!\n");  		dev->dev_private = (void *)dev_priv; diff --git a/shared-core/r300_cmdbuf.c b/shared-core/r300_cmdbuf.c index 667a829b..d3c52d43 100644 --- a/shared-core/r300_cmdbuf.c +++ b/shared-core/r300_cmdbuf.c @@ -148,15 +148,15 @@ void r300_init_reg_flags(void)  	/* these match cmducs() command in r300_driver/r300/r300_cmdbuf.c */  	ADD_RANGE(R300_SE_VPORT_XSCALE, 6); -	ADD_RANGE(0x2080, 1); +	ADD_RANGE(R300_VAP_CNTL, 1);  	ADD_RANGE(R300_SE_VTE_CNTL, 2);  	ADD_RANGE(0x2134, 2); -	ADD_RANGE(0x2140, 1); +	ADD_RANGE(R300_VAP_CNTL_STATUS, 1);  	ADD_RANGE(R300_VAP_INPUT_CNTL_0, 2);  	ADD_RANGE(0x21DC, 1); -	ADD_RANGE(0x221C, 1); +	ADD_RANGE(R300_VAP_UNKNOWN_221C, 1);  	ADD_RANGE(0x2220, 4); -	ADD_RANGE(0x2288, 1); +	ADD_RANGE(R300_VAP_UNKNOWN_2288, 1);  	ADD_RANGE(R300_VAP_OUTPUT_VTX_FMT_0, 2);  	ADD_RANGE(R300_VAP_PVS_CNTL_1, 3);  	ADD_RANGE(R300_GB_ENABLE, 1); @@ -168,13 +168,13 @@ void r300_init_reg_flags(void)  	ADD_RANGE(R300_RE_POINTSIZE, 1);  	ADD_RANGE(0x4230, 3);  	ADD_RANGE(R300_RE_LINE_CNT, 1); -	ADD_RANGE(0x4238, 1); +	ADD_RANGE(R300_RE_UNK4238, 1);  	ADD_RANGE(0x4260, 3); -	ADD_RANGE(0x4274, 4); -	ADD_RANGE(0x4288, 5); -	ADD_RANGE(0x42A0, 1); +	ADD_RANGE(R300_RE_SHADE, 4); +	ADD_RANGE(R300_RE_POLYGON_MODE, 5); +	ADD_RANGE(R300_RE_ZBIAS_CNTL, 1);  	ADD_RANGE(R300_RE_ZBIAS_T_FACTOR, 4); -	ADD_RANGE(0x42B4, 1); +	ADD_RANGE(R300_RE_OCCLUSION_CNTL, 1);  	ADD_RANGE(R300_RE_CULL_CNTL, 1);  	ADD_RANGE(0x42C0, 2);  	ADD_RANGE(R300_RS_CNTL_0, 2); @@ -190,22 +190,22 @@ void r300_init_reg_flags(void)  	ADD_RANGE(R300_PFS_INSTR1_0, 64);  	ADD_RANGE(R300_PFS_INSTR2_0, 64);  	ADD_RANGE(R300_PFS_INSTR3_0, 64); -	ADD_RANGE(0x4BC0, 1); -	ADD_RANGE(0x4BC8, 3); +	ADD_RANGE(R300_RE_FOG_STATE, 1); +	ADD_RANGE(R300_FOG_COLOR_R, 3);  	ADD_RANGE(R300_PP_ALPHA_TEST, 2);  	ADD_RANGE(0x4BD8, 1);  	ADD_RANGE(R300_PFS_PARAM_0_X, 64);  	ADD_RANGE(0x4E00, 1);  	ADD_RANGE(R300_RB3D_CBLEND, 2);  	ADD_RANGE(R300_RB3D_COLORMASK, 1); -	ADD_RANGE(0x4E10, 3); +	ADD_RANGE(R300_RB3D_BLEND_COLOR, 3);  	ADD_RANGE_MARK(R300_RB3D_COLOROFFSET0, 1, MARK_CHECK_OFFSET);	/* check offset */  	ADD_RANGE(R300_RB3D_COLORPITCH0, 1);  	ADD_RANGE(0x4E50, 9);  	ADD_RANGE(0x4E88, 1);  	ADD_RANGE(0x4EA0, 2);  	ADD_RANGE(R300_RB3D_ZSTENCIL_CNTL_0, 3); -	ADD_RANGE(0x4F10, 4); +	ADD_RANGE(R300_RB3D_ZSTENCIL_FORMAT, 4);  	ADD_RANGE_MARK(R300_RB3D_DEPTHOFFSET, 1, MARK_CHECK_OFFSET);	/* check offset */  	ADD_RANGE(R300_RB3D_DEPTHPITCH, 1);  	ADD_RANGE(0x4F28, 1); diff --git a/shared-core/r300_reg.h b/shared-core/r300_reg.h index 1f65f9a7..0a31f0b9 100644 --- a/shared-core/r300_reg.h +++ b/shared-core/r300_reg.h @@ -23,6 +23,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  **************************************************************************/ +/* *INDENT-OFF* */ +  #ifndef _R300_REG_H  #define _R300_REG_H @@ -145,6 +147,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #	define R300_VC_NO_SWAP                  (0 << 0)  #	define R300_VC_16BIT_SWAP               (1 << 0)  #	define R300_VC_32BIT_SWAP               (2 << 0) +#	define R300_VAP_TCL_BYPASS		(1 << 8)  /* gap */ @@ -487,6 +490,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #	define R300_GB_W_SELECT_1		(1<<4)  #define R300_GB_AA_CONFIG		0x4020 +#	define R300_AA_DISABLE			0x00  #	define R300_AA_ENABLE			0x01  #	define R300_AA_SUBSAMPLES_2		0  #	define R300_AA_SUBSAMPLES_3		(1<<1) @@ -669,6 +673,11 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  /* Special handling for color: When the fragment program uses color,   * the ROUTE_0_COLOR bit is set and ROUTE_0_COLOR_DEST contains the   * color register index. + * + * Apperently you may set the R300_RS_ROUTE_0_COLOR bit, but not provide any + * R300_RS_ROUTE_0_COLOR_DEST value; this setup is used for clearing the state. + * See r300_ioctl.c:r300EmitClearState. I'm not sure if this setup is strictly + * correct or not. - Oliver.   */  #       define R300_RS_ROUTE_0_COLOR             (1 << 14)  #       define R300_RS_ROUTE_0_COLOR_DEST_SHIFT  17 @@ -1553,6 +1562,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #define R300_PRIM_COLOR_ORDER_BGRA              (0 << 6)  #define R300_PRIM_COLOR_ORDER_RGBA              (1 << 6)  #define R300_PRIM_NUM_VERTICES_SHIFT            16 +#define R300_PRIM_NUM_VERTICES_MASK             0xffff  /* Draw a primitive from vertex data in arrays loaded via 3D_LOAD_VBPNTR.   * Two parameter dwords: @@ -1601,5 +1611,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.   */  #define R300_CP_CMD_BITBLT_MULTI	0xC0009B00 -  #endif /* _R300_REG_H */ + +/* *INDENT-ON* */ diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index bfc2d088..bde98b30 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -1505,13 +1505,13 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  					 RADEON_ROUND_MODE_TRUNC |  					 RADEON_ROUND_PREC_8TH_PIX); -	DRM_GETSAREA();  	dev_priv->ring_offset = init->ring_offset;  	dev_priv->ring_rptr_offset = init->ring_rptr_offset;  	dev_priv->buffers_offset = init->buffers_offset;  	dev_priv->gart_textures_offset = init->gart_textures_offset; +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("could not find sarea!\n");  		radeon_do_cleanup_cp(dev); diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index 00646c8f..4a36ea70 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -245,7 +245,6 @@ typedef struct drm_radeon_private {  	int do_boxes;  	int page_flipping; -	int current_page;  	u32 color_fmt;  	unsigned int front_offset; diff --git a/shared-core/radeon_state.c b/shared-core/radeon_state.c index b95549d8..bad054d7 100644 --- a/shared-core/radeon_state.c +++ b/shared-core/radeon_state.c @@ -773,7 +773,7 @@ static void radeon_clear_box(drm_radeon_private_t * dev_priv,  		 RADEON_GMC_SRC_DATATYPE_COLOR |  		 RADEON_ROP3_P | RADEON_GMC_CLR_CMP_CNTL_DIS); -	if (dev_priv->page_flipping && dev_priv->current_page == 1) { +	if (dev_priv->sarea_priv->pfCurrentPage == 1) {  		OUT_RING(dev_priv->front_pitch_offset);  	} else {  		OUT_RING(dev_priv->back_pitch_offset); @@ -861,7 +861,7 @@ static void radeon_cp_dispatch_clear(drm_device_t * dev,  	dev_priv->stats.clears++; -	if (dev_priv->page_flipping && dev_priv->current_page == 1) { +	if (dev_priv->sarea_priv->pfCurrentPage == 1) {  		unsigned int tmp = flags;  		flags &= ~(RADEON_FRONT | RADEON_BACK); @@ -1382,7 +1382,7 @@ static void radeon_cp_dispatch_swap(drm_device_t * dev)  		/* Make this work even if front & back are flipped:  		 */  		OUT_RING(CP_PACKET0(RADEON_SRC_PITCH_OFFSET, 1)); -		if (dev_priv->current_page == 0) { +		if (dev_priv->sarea_priv->pfCurrentPage == 0) {  			OUT_RING(dev_priv->back_pitch_offset);  			OUT_RING(dev_priv->front_pitch_offset);  		} else { @@ -1416,12 +1416,12 @@ static void radeon_cp_dispatch_flip(drm_device_t * dev)  {  	drm_radeon_private_t *dev_priv = dev->dev_private;  	drm_sarea_t *sarea = (drm_sarea_t *) dev_priv->sarea->handle; -	int offset = (dev_priv->current_page == 1) +	int offset = (dev_priv->sarea_priv->pfCurrentPage == 1)  	    ? dev_priv->front_offset : dev_priv->back_offset;  	RING_LOCALS; -	DRM_DEBUG("%s: page=%d pfCurrentPage=%d\n", +	DRM_DEBUG("%s: pfCurrentPage=%d\n",  		  __FUNCTION__, -		  dev_priv->current_page, dev_priv->sarea_priv->pfCurrentPage); +		  dev_priv->sarea_priv->pfCurrentPage);  	/* Do some trivial performance monitoring...  	 */ @@ -1449,8 +1449,8 @@ static void radeon_cp_dispatch_flip(drm_device_t * dev)  	 * performing the swapbuffer ioctl.  	 */  	dev_priv->sarea_priv->last_frame++; -	dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page = -	    1 - dev_priv->current_page; +	dev_priv->sarea_priv->pfCurrentPage = +		1 - dev_priv->sarea_priv->pfCurrentPage;  	BEGIN_RING(2); @@ -2162,24 +2162,10 @@ static int radeon_do_init_pageflip(drm_device_t * dev)  	ADVANCE_RING();  	dev_priv->page_flipping = 1; -	dev_priv->current_page = 0; -	dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page; -	return 0; -} - -/* Called whenever a client dies, from drm_release. - * NOTE:  Lock isn't necessarily held when this is called! - */ -static int radeon_do_cleanup_pageflip(drm_device_t * dev) -{ -	drm_radeon_private_t *dev_priv = dev->dev_private; -	DRM_DEBUG("\n"); +	if (dev_priv->sarea_priv->pfCurrentPage != 1) +		dev_priv->sarea_priv->pfCurrentPage = 0; -	if (dev_priv->current_page != 0) -		radeon_cp_dispatch_flip(dev); - -	dev_priv->page_flipping = 0;  	return 0;  } @@ -3225,9 +3211,7 @@ void radeon_driver_preclose(drm_device_t * dev, DRMFILE filp)  {  	if (dev->dev_private) {  		drm_radeon_private_t *dev_priv = dev->dev_private; -		if (dev_priv->page_flipping) { -			radeon_do_cleanup_pageflip(dev); -		} +		dev_priv->page_flipping = 0;  		radeon_mem_release(filp, dev_priv->gart_heap);  		radeon_mem_release(filp, dev_priv->fb_heap);  		radeon_surfaces_release(filp, dev_priv); @@ -3236,6 +3220,14 @@ void radeon_driver_preclose(drm_device_t * dev, DRMFILE filp)  void radeon_driver_lastclose(drm_device_t * dev)  { +	if (dev->dev_private) { +		drm_radeon_private_t *dev_priv = dev->dev_private; + +		if (dev_priv->sarea_priv && +		    dev_priv->sarea_priv->pfCurrentPage != 0) +			radeon_cp_dispatch_flip(dev); +	} +  	radeon_do_release(dev);  } diff --git a/shared-core/savage_bci.c b/shared-core/savage_bci.c index 5632b5c8..9a3ae1f1 100644 --- a/shared-core/savage_bci.c +++ b/shared-core/savage_bci.c @@ -710,7 +710,7 @@ static int savage_do_init_bci(drm_device_t *dev, drm_savage_init_t *init)  	dev_priv->texture_offset = init->texture_offset;  	dev_priv->texture_size = init->texture_size; -	DRM_GETSAREA(); +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("could not find sarea!\n");  		savage_do_cleanup_bci(dev); diff --git a/shared-core/via_map.c b/shared-core/via_map.c index 83324cfa..037a1c2c 100644 --- a/shared-core/via_map.c +++ b/shared-core/via_map.c @@ -32,7 +32,7 @@ static int via_do_init_map(drm_device_t * dev, drm_via_init_t * init)  	DRM_DEBUG("%s\n", __FUNCTION__); -	DRM_GETSAREA(); +	dev_priv->sarea = drm_getsarea(dev);  	if (!dev_priv->sarea) {  		DRM_ERROR("could not find sarea!\n");  		dev->dev_private = (void *)dev_priv; | 
