Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm
commit
d70347bfc0
|
@ -41,7 +41,6 @@
|
||||||
* can build the DRM (part of PI DRI). 4/21/2000 S + B */
|
* can build the DRM (part of PI DRI). 4/21/2000 S + B */
|
||||||
#include <asm/current.h>
|
#include <asm/current.h>
|
||||||
#endif /* __alpha__ */
|
#endif /* __alpha__ */
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/highmem.h>
|
#include <linux/highmem.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
|
|
||||||
#ifdef DEBUG_MEMORY
|
#ifdef DEBUG_MEMORY
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
|
|
||||||
typedef struct drm_mem_stats {
|
typedef struct drm_mem_stats {
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/kdev_t.h>
|
#include <linux/kdev_t.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
* Copyright (C) 2000 David S. Miller (davem@redhat.com)
|
* Copyright (C) 2000 David S. Miller (davem@redhat.com)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/smp_lock.h>
|
#include <linux/smp_lock.h>
|
||||||
#include <asm/shmparam.h>
|
#include <asm/shmparam.h>
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
* Gareth Hughes <gareth@valinux.com>
|
* Gareth Hughes <gareth@valinux.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "i810_drm.h"
|
#include "i810_drm.h"
|
||||||
|
|
|
@ -32,8 +32,6 @@
|
||||||
* Keith Whitwell <keith@tungstengraphics.com>
|
* Keith Whitwell <keith@tungstengraphics.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "i830_drm.h"
|
#include "i830_drm.h"
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
|
|
||||||
/* derived from tdfx_drv.c */
|
/* derived from tdfx_drv.c */
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "imagine_drv.h"
|
#include "imagine_drv.h"
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
* Leif Delgass <ldelgass@retinalburn.net>
|
* Leif Delgass <ldelgass@retinalburn.net>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "mach64_drm.h"
|
#include "mach64_drm.h"
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
* Gareth Hughes <gareth@valinux.com>
|
* Gareth Hughes <gareth@valinux.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "mga_drm.h"
|
#include "mga_drm.h"
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
* Lars Knoll <lars@trolltech.com>
|
* Lars Knoll <lars@trolltech.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "nv_drv.h"
|
#include "nv_drv.h"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
* Gareth Hughes <gareth@valinux.com>
|
* Gareth Hughes <gareth@valinux.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "r128_drm.h"
|
#include "r128_drm.h"
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "drm.h"
|
#include "drm.h"
|
||||||
#include "radeon_drm.h"
|
#include "radeon_drm.h"
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "savage_drm.h"
|
#include "savage_drm.h"
|
||||||
#include "savage_drv.h"
|
#include "savage_drv.h"
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "sis_drm.h"
|
#include "sis_drm.h"
|
||||||
#include "sis_drv.h"
|
#include "sis_drv.h"
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
* Gareth Hughes <gareth@valinux.com>
|
* Gareth Hughes <gareth@valinux.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "tdfx_drv.h"
|
#include "tdfx_drv.h"
|
||||||
|
|
||||||
|
|
|
@ -69,9 +69,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
#if defined(__KERNEL__)
|
|
||||||
#include <linux/config.h>
|
|
||||||
#endif
|
|
||||||
#include <asm/ioctl.h> /* For _IO* macros */
|
#include <asm/ioctl.h> /* For _IO* macros */
|
||||||
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
#define DRM_IOCTL_NR(n) _IOC_NR(n)
|
||||||
#define DRM_IOC_VOID _IOC_NONE
|
#define DRM_IOC_VOID _IOC_NONE
|
||||||
|
|
|
@ -538,6 +538,36 @@ static __inline__ int r300_emit_bitblt_multi(drm_radeon_private_t *dev_priv,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __inline__ int r300_emit_indx_buffer(drm_radeon_private_t *dev_priv,
|
||||||
|
drm_radeon_kcmd_buffer_t *cmdbuf)
|
||||||
|
{
|
||||||
|
u32 *cmd = (u32 *) cmdbuf->buf;
|
||||||
|
int count, ret;
|
||||||
|
RING_LOCALS;
|
||||||
|
|
||||||
|
count=(cmd[0]>>16) & 0x3fff;
|
||||||
|
|
||||||
|
if ((cmd[1] & 0x8000ffff) != 0x80000810) {
|
||||||
|
DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
ret = r300_check_offset(dev_priv, cmd[2]);
|
||||||
|
if (ret) {
|
||||||
|
DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_RING(count+2);
|
||||||
|
OUT_RING(cmd[0]);
|
||||||
|
OUT_RING_TABLE((int *)(cmdbuf->buf + 4), count + 1);
|
||||||
|
ADVANCE_RING();
|
||||||
|
|
||||||
|
cmdbuf->buf += (count+2)*4;
|
||||||
|
cmdbuf->bufsz -= (count+2)*4;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
|
static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
|
||||||
drm_radeon_kcmd_buffer_t *cmdbuf)
|
drm_radeon_kcmd_buffer_t *cmdbuf)
|
||||||
{
|
{
|
||||||
|
@ -578,10 +608,11 @@ static __inline__ int r300_emit_raw_packet3(drm_radeon_private_t *dev_priv,
|
||||||
case RADEON_CNTL_BITBLT_MULTI:
|
case RADEON_CNTL_BITBLT_MULTI:
|
||||||
return r300_emit_bitblt_multi(dev_priv, cmdbuf);
|
return r300_emit_bitblt_multi(dev_priv, cmdbuf);
|
||||||
|
|
||||||
|
case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */
|
||||||
|
return r300_emit_indx_buffer(dev_priv, cmdbuf);
|
||||||
case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */
|
case RADEON_CP_3D_DRAW_IMMD_2: /* triggers drawing using in-packet vertex data */
|
||||||
case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */
|
case RADEON_CP_3D_DRAW_VBUF_2: /* triggers drawing of vertex buffers setup elsewhere */
|
||||||
case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */
|
case RADEON_CP_3D_DRAW_INDX_2: /* triggers drawing using indices to vertex buffer */
|
||||||
case RADEON_CP_INDX_BUFFER: /* DRAW_INDX_2 without INDX_BUFFER seems to lock up the gpu */
|
|
||||||
case RADEON_WAIT_FOR_IDLE:
|
case RADEON_WAIT_FOR_IDLE:
|
||||||
case RADEON_CP_NOP:
|
case RADEON_CP_NOP:
|
||||||
/* these packets are safe */
|
/* these packets are safe */
|
||||||
|
|
|
@ -275,6 +275,8 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
||||||
unsigned int *cmdsz)
|
unsigned int *cmdsz)
|
||||||
{
|
{
|
||||||
u32 *cmd = (u32 *) cmdbuf->buf;
|
u32 *cmd = (u32 *) cmdbuf->buf;
|
||||||
|
u32 offset, narrays;
|
||||||
|
int count, i, k;
|
||||||
|
|
||||||
*cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
|
*cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
|
||||||
|
|
||||||
|
@ -288,10 +290,106 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
||||||
return DRM_ERR(EINVAL);
|
return DRM_ERR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check client state and fix it up if necessary */
|
switch(cmd[0] & 0xff00) {
|
||||||
if (cmd[0] & 0x8000) { /* MSB of opcode: next DWORD GUI_CNTL */
|
/* XXX Are there old drivers needing other packets? */
|
||||||
u32 offset;
|
|
||||||
|
|
||||||
|
case RADEON_3D_DRAW_IMMD:
|
||||||
|
case RADEON_3D_DRAW_VBUF:
|
||||||
|
case RADEON_3D_DRAW_INDX:
|
||||||
|
case RADEON_WAIT_FOR_IDLE:
|
||||||
|
case RADEON_CP_NOP:
|
||||||
|
case RADEON_3D_CLEAR_ZMASK:
|
||||||
|
/* case RADEON_CP_NEXT_CHAR:
|
||||||
|
case RADEON_CP_PLY_NEXTSCAN:
|
||||||
|
case RADEON_CP_SET_SCISSORS: */ /* probably safe but will never need them? */
|
||||||
|
/* these packets are safe */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RADEON_CP_3D_DRAW_IMMD_2:
|
||||||
|
case RADEON_CP_3D_DRAW_VBUF_2:
|
||||||
|
case RADEON_CP_3D_DRAW_INDX_2:
|
||||||
|
case RADEON_3D_CLEAR_HIZ:
|
||||||
|
/* safe but r200 only */
|
||||||
|
if (dev_priv->microcode_version != UCODE_R200) {
|
||||||
|
DRM_ERROR("Invalid 3d packet for r100-class chip\n");
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RADEON_3D_LOAD_VBPNTR:
|
||||||
|
count = (cmd[0] >> 16) & 0x3fff;
|
||||||
|
|
||||||
|
if (count > 18) { /* 12 arrays max */
|
||||||
|
DRM_ERROR("Too large payload in 3D_LOAD_VBPNTR (count=%d)\n",
|
||||||
|
count);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* carefully check packet contents */
|
||||||
|
narrays = cmd[1] & ~0xc000;
|
||||||
|
k = 0;
|
||||||
|
i = 2;
|
||||||
|
while ((k < narrays) && (i < (count + 2))) {
|
||||||
|
i++; /* skip attribute field */
|
||||||
|
if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) {
|
||||||
|
DRM_ERROR
|
||||||
|
("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n",
|
||||||
|
k, i);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
k++;
|
||||||
|
i++;
|
||||||
|
if (k == narrays)
|
||||||
|
break;
|
||||||
|
/* have one more to process, they come in pairs */
|
||||||
|
if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) {
|
||||||
|
DRM_ERROR
|
||||||
|
("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n",
|
||||||
|
k, i);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
k++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
/* do the counts match what we expect ? */
|
||||||
|
if ((k != narrays) || (i != (count + 2))) {
|
||||||
|
DRM_ERROR
|
||||||
|
("Malformed 3D_LOAD_VBPNTR packet (k=%d i=%d narrays=%d count+1=%d).\n",
|
||||||
|
k, i, narrays, count + 1);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RADEON_3D_RNDR_GEN_INDX_PRIM:
|
||||||
|
if (dev_priv->microcode_version != UCODE_R100) {
|
||||||
|
DRM_ERROR("Invalid 3d packet for r200-class chip\n");
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[1])) {
|
||||||
|
DRM_ERROR("Invalid rndr_gen_indx offset\n");
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RADEON_CP_INDX_BUFFER:
|
||||||
|
if (dev_priv->microcode_version != UCODE_R200) {
|
||||||
|
DRM_ERROR("Invalid 3d packet for r100-class chip\n");
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
if ((cmd[1] & 0x8000ffff) != 0x80000810) {
|
||||||
|
DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[2])) {
|
||||||
|
DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RADEON_CNTL_HOSTDATA_BLT:
|
||||||
|
case RADEON_CNTL_PAINT_MULTI:
|
||||||
|
case RADEON_CNTL_BITBLT_MULTI:
|
||||||
|
/* MSB of opcode: next DWORD GUI_CNTL */
|
||||||
if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL
|
if (cmd[1] & (RADEON_GMC_SRC_PITCH_OFFSET_CNTL
|
||||||
| RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
|
| RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
|
||||||
offset = cmd[2] << 10;
|
offset = cmd[2] << 10;
|
||||||
|
@ -313,6 +411,11 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
||||||
}
|
}
|
||||||
cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10;
|
cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DRM_ERROR("Invalid packet type %x\n", cmd[0] & 0xff00);
|
||||||
|
return DRM_ERR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -725,6 +725,7 @@ static int savage_do_init_bci(drm_device_t *dev, drm_savage_init_t *init)
|
||||||
dev_priv->status = NULL;
|
dev_priv->status = NULL;
|
||||||
}
|
}
|
||||||
if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) {
|
if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) {
|
||||||
|
dev->agp_buffer_token = init->buffers_offset;
|
||||||
dev->agp_buffer_map = drm_core_findmap(dev,
|
dev->agp_buffer_map = drm_core_findmap(dev,
|
||||||
init->buffers_offset);
|
init->buffers_offset);
|
||||||
if (!dev->agp_buffer_map) {
|
if (!dev->agp_buffer_map) {
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
* DEALINGS IN THE SOFTWARE.
|
* DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/config.h>
|
|
||||||
#include "drmP.h"
|
#include "drmP.h"
|
||||||
#include "via_drm.h"
|
#include "via_drm.h"
|
||||||
#include "via_drv.h"
|
#include "via_drv.h"
|
||||||
|
|
Loading…
Reference in New Issue