Merge branch 'modesetting-101' of git+ssh://git.freedesktop.org/git/mesa/drm into origin/modesetting-101
Conflicts: linux-core/drm_crtc.c - reconcile with locking changesmain
commit
a4929b921e
|
@ -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);
|
||||
|
||||
|
|
|
@ -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_
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 ) \
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 -
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 ??? */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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* */
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
if (dev_priv->sarea_priv->pfCurrentPage != 1)
|
||||
dev_priv->sarea_priv->pfCurrentPage = 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->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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue