|
@@ -39,7 +39,7 @@
|
|
|
|
|
|
static __inline__ int radeon_check_and_fixup_offset(drm_radeon_private_t *
|
|
|
dev_priv,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file * file_priv,
|
|
|
u32 *offset)
|
|
|
{
|
|
|
u64 off = *offset;
|
|
@@ -71,7 +71,7 @@ static __inline__ int radeon_check_and_fixup_offset(drm_radeon_private_t *
|
|
|
* magic offset we get from SETPARAM or calculated from fb_location
|
|
|
*/
|
|
|
if (off < (dev_priv->fb_size + dev_priv->gart_size)) {
|
|
|
- radeon_priv = filp_priv->driver_priv;
|
|
|
+ radeon_priv = file_priv->driver_priv;
|
|
|
off += radeon_priv->radeon_fb_delta;
|
|
|
}
|
|
|
|
|
@@ -85,29 +85,29 @@ static __inline__ int radeon_check_and_fixup_offset(drm_radeon_private_t *
|
|
|
*offset = off;
|
|
|
return 0;
|
|
|
}
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
dev_priv,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
int id, u32 *data)
|
|
|
{
|
|
|
switch (id) {
|
|
|
|
|
|
case RADEON_EMIT_PP_MISC:
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&data[(RADEON_RB3D_DEPTHOFFSET - RADEON_PP_MISC) / 4])) {
|
|
|
DRM_ERROR("Invalid depth buffer offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RADEON_EMIT_PP_CNTL:
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&data[(RADEON_RB3D_COLOROFFSET - RADEON_PP_CNTL) / 4])) {
|
|
|
DRM_ERROR("Invalid colour buffer offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -117,20 +117,20 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
case R200_EMIT_PP_TXOFFSET_3:
|
|
|
case R200_EMIT_PP_TXOFFSET_4:
|
|
|
case R200_EMIT_PP_TXOFFSET_5:
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&data[0])) {
|
|
|
DRM_ERROR("Invalid R200 texture offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RADEON_EMIT_PP_TXFILTER_0:
|
|
|
case RADEON_EMIT_PP_TXFILTER_1:
|
|
|
case RADEON_EMIT_PP_TXFILTER_2:
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&data[(RADEON_PP_TXOFFSET_0 - RADEON_PP_TXFILTER_0) / 4])) {
|
|
|
DRM_ERROR("Invalid R100 texture offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -143,11 +143,11 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
int i;
|
|
|
for (i = 0; i < 5; i++) {
|
|
|
if (radeon_check_and_fixup_offset(dev_priv,
|
|
|
- filp_priv,
|
|
|
+ file_priv,
|
|
|
&data[i])) {
|
|
|
DRM_ERROR
|
|
|
("Invalid R200 cubic texture offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -159,11 +159,11 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
int i;
|
|
|
for (i = 0; i < 5; i++) {
|
|
|
if (radeon_check_and_fixup_offset(dev_priv,
|
|
|
- filp_priv,
|
|
|
+ file_priv,
|
|
|
&data[i])) {
|
|
|
DRM_ERROR
|
|
|
("Invalid R100 cubic texture offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -256,7 +256,7 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
|
|
|
default:
|
|
|
DRM_ERROR("Unknown state packet ID %d\n", id);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -264,7 +264,7 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *
|
|
|
|
|
|
static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
dev_priv,
|
|
|
- struct drm_file *filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_kcmd_buffer_t *
|
|
|
cmdbuf,
|
|
|
unsigned int *cmdsz)
|
|
@@ -277,12 +277,12 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
|
|
|
if ((cmd[0] & 0xc0000000) != RADEON_CP_PACKET3) {
|
|
|
DRM_ERROR("Not a type 3 packet\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (4 * *cmdsz > cmdbuf->bufsz) {
|
|
|
DRM_ERROR("Packet size larger than size of data provided\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
switch(cmd[0] & 0xff00) {
|
|
@@ -307,7 +307,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
/* 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);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -317,7 +317,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
if (count > 18) { /* 12 arrays max */
|
|
|
DRM_ERROR("Too large payload in 3D_LOAD_VBPNTR (count=%d)\n",
|
|
|
count);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
/* carefully check packet contents */
|
|
@@ -326,22 +326,25 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
i = 2;
|
|
|
while ((k < narrays) && (i < (count + 2))) {
|
|
|
i++; /* skip attribute field */
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[i])) {
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
+ &cmd[i])) {
|
|
|
DRM_ERROR
|
|
|
("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n",
|
|
|
k, i);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -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])) {
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv,
|
|
|
+ file_priv, &cmd[i]))
|
|
|
+ {
|
|
|
DRM_ERROR
|
|
|
("Invalid offset (k=%d i=%d) in 3D_LOAD_VBPNTR packet.\n",
|
|
|
k, i);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
k++;
|
|
|
i++;
|
|
@@ -351,33 +354,33 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
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);
|
|
|
+ return -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);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[1])) {
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv, &cmd[1])) {
|
|
|
DRM_ERROR("Invalid rndr_gen_indx offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -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);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
if ((cmd[1] & 0x8000ffff) != 0x80000810) {
|
|
|
DRM_ERROR("Invalid indx_buffer reg address %08X\n", cmd[1]);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &cmd[2])) {
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv, &cmd[2])) {
|
|
|
DRM_ERROR("Invalid indx_buffer offset is %08X\n", cmd[2]);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
break;
|
|
|
|
|
@@ -389,9 +392,9 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
| RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
|
|
|
offset = cmd[2] << 10;
|
|
|
if (radeon_check_and_fixup_offset
|
|
|
- (dev_priv, filp_priv, &offset)) {
|
|
|
+ (dev_priv, file_priv, &offset)) {
|
|
|
DRM_ERROR("Invalid first packet offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
cmd[2] = (cmd[2] & 0xffc00000) | offset >> 10;
|
|
|
}
|
|
@@ -400,9 +403,9 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
(cmd[1] & RADEON_GMC_DST_PITCH_OFFSET_CNTL)) {
|
|
|
offset = cmd[3] << 10;
|
|
|
if (radeon_check_and_fixup_offset
|
|
|
- (dev_priv, filp_priv, &offset)) {
|
|
|
+ (dev_priv, file_priv, &offset)) {
|
|
|
DRM_ERROR("Invalid second packet offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
cmd[3] = (cmd[3] & 0xffc00000) | offset >> 10;
|
|
|
}
|
|
@@ -410,7 +413,7 @@ static __inline__ int radeon_check_and_fixup_packet3(drm_radeon_private_t *
|
|
|
|
|
|
default:
|
|
|
DRM_ERROR("Invalid packet type %x\n", cmd[0] & 0xff00);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -439,7 +442,7 @@ static __inline__ void radeon_emit_clip_rect(drm_radeon_private_t * dev_priv,
|
|
|
/* Emit 1.1 state
|
|
|
*/
|
|
|
static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_context_regs_t * ctx,
|
|
|
drm_radeon_texture_regs_t * tex,
|
|
|
unsigned int dirty)
|
|
@@ -448,16 +451,16 @@ static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
DRM_DEBUG("dirty=0x%08x\n", dirty);
|
|
|
|
|
|
if (dirty & RADEON_UPLOAD_CONTEXT) {
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&ctx->rb3d_depthoffset)) {
|
|
|
DRM_ERROR("Invalid depth buffer offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&ctx->rb3d_coloroffset)) {
|
|
|
DRM_ERROR("Invalid depth buffer offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
BEGIN_RING(14);
|
|
@@ -543,10 +546,10 @@ static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
}
|
|
|
|
|
|
if (dirty & RADEON_UPLOAD_TEX0) {
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&tex[0].pp_txoffset)) {
|
|
|
DRM_ERROR("Invalid texture offset for unit 0\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
BEGIN_RING(9);
|
|
@@ -563,10 +566,10 @@ static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
}
|
|
|
|
|
|
if (dirty & RADEON_UPLOAD_TEX1) {
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&tex[1].pp_txoffset)) {
|
|
|
DRM_ERROR("Invalid texture offset for unit 1\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
BEGIN_RING(9);
|
|
@@ -583,10 +586,10 @@ static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
}
|
|
|
|
|
|
if (dirty & RADEON_UPLOAD_TEX2) {
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv,
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv,
|
|
|
&tex[2].pp_txoffset)) {
|
|
|
DRM_ERROR("Invalid texture offset for unit 2\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
BEGIN_RING(9);
|
|
@@ -608,7 +611,7 @@ static int radeon_emit_state(drm_radeon_private_t * dev_priv,
|
|
|
/* Emit 1.2 state
|
|
|
*/
|
|
|
static int radeon_emit_state2(drm_radeon_private_t * dev_priv,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_state_t * state)
|
|
|
{
|
|
|
RING_LOCALS;
|
|
@@ -621,7 +624,7 @@ static int radeon_emit_state2(drm_radeon_private_t * dev_priv,
|
|
|
ADVANCE_RING();
|
|
|
}
|
|
|
|
|
|
- return radeon_emit_state(dev_priv, filp_priv, &state->context,
|
|
|
+ return radeon_emit_state(dev_priv, file_priv, &state->context,
|
|
|
state->tex, state->dirty);
|
|
|
}
|
|
|
|
|
@@ -1646,13 +1649,12 @@ static void radeon_cp_dispatch_indices(struct drm_device * dev,
|
|
|
|
|
|
#define RADEON_MAX_TEXTURE_SIZE RADEON_BUFFER_SIZE
|
|
|
|
|
|
-static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
- struct drm_device * dev,
|
|
|
+static int radeon_cp_dispatch_texture(struct drm_device * dev,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_texture_t * tex,
|
|
|
drm_radeon_tex_image_t * image)
|
|
|
{
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
struct drm_buf *buf;
|
|
|
u32 format;
|
|
|
u32 *buffer;
|
|
@@ -1664,11 +1666,9 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
u32 offset;
|
|
|
RING_LOCALS;
|
|
|
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- if (radeon_check_and_fixup_offset(dev_priv, filp_priv, &tex->offset)) {
|
|
|
+ if (radeon_check_and_fixup_offset(dev_priv, file_priv, &tex->offset)) {
|
|
|
DRM_ERROR("Invalid destination offset\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
dev_priv->stats.boxes |= RADEON_BOX_TEXTURE_LOAD;
|
|
@@ -1711,11 +1711,11 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
break;
|
|
|
default:
|
|
|
DRM_ERROR("invalid texture format %d\n", tex->format);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
spitch = blit_width >> 6;
|
|
|
if (spitch == 0 && image->height > 1)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
texpitch = tex->pitch;
|
|
|
if ((texpitch << 22) & RADEON_DST_TILE_MICRO) {
|
|
@@ -1760,8 +1760,8 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
if (!buf) {
|
|
|
DRM_DEBUG("radeon_cp_dispatch_texture: EAGAIN\n");
|
|
|
if (DRM_COPY_TO_USER(tex->image, image, sizeof(*image)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
- return DRM_ERR(EAGAIN);
|
|
|
+ return -EFAULT;
|
|
|
+ return -EAGAIN;
|
|
|
}
|
|
|
|
|
|
/* Dispatch the indirect buffer.
|
|
@@ -1774,7 +1774,7 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
do { \
|
|
|
if (DRM_COPY_FROM_USER(_buf, _data, (_width))) {\
|
|
|
DRM_ERROR("EFAULT on pad, %d bytes\n", (_width)); \
|
|
|
- return DRM_ERR(EFAULT); \
|
|
|
+ return -EFAULT; \
|
|
|
} \
|
|
|
} while(0)
|
|
|
|
|
@@ -1841,7 +1841,7 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
}
|
|
|
|
|
|
#undef RADEON_COPY_MT
|
|
|
- buf->filp = filp;
|
|
|
+ buf->file_priv = file_priv;
|
|
|
buf->used = size;
|
|
|
offset = dev_priv->gart_buffers_offset + buf->offset;
|
|
|
BEGIN_RING(9);
|
|
@@ -1861,6 +1861,7 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
OUT_RING((image->width << 16) | height);
|
|
|
RADEON_WAIT_UNTIL_2D_IDLE();
|
|
|
ADVANCE_RING();
|
|
|
+ COMMIT_RING();
|
|
|
|
|
|
radeon_cp_discard_buffer(dev, buf);
|
|
|
|
|
@@ -1878,6 +1879,8 @@ static int radeon_cp_dispatch_texture(DRMFILE filp,
|
|
|
RADEON_FLUSH_CACHE();
|
|
|
RADEON_WAIT_UNTIL_2D_IDLE();
|
|
|
ADVANCE_RING();
|
|
|
+ COMMIT_RING();
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1929,7 +1932,8 @@ static void radeon_apply_surface_regs(int surf_index,
|
|
|
* not always be available.
|
|
|
*/
|
|
|
static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
- drm_radeon_private_t *dev_priv, DRMFILE filp)
|
|
|
+ drm_radeon_private_t *dev_priv,
|
|
|
+ struct drm_file *file_priv)
|
|
|
{
|
|
|
struct radeon_virt_surface *s;
|
|
|
int i;
|
|
@@ -1959,7 +1963,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
|
|
|
/* find a virtual surface */
|
|
|
for (i = 0; i < 2 * RADEON_MAX_SURFACES; i++)
|
|
|
- if (dev_priv->virt_surfaces[i].filp == 0)
|
|
|
+ if (dev_priv->virt_surfaces[i].file_priv == 0)
|
|
|
break;
|
|
|
if (i == 2 * RADEON_MAX_SURFACES) {
|
|
|
return -1;
|
|
@@ -1977,7 +1981,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
s->lower = new_lower;
|
|
|
s->upper = new_upper;
|
|
|
s->flags = new->flags;
|
|
|
- s->filp = filp;
|
|
|
+ s->file_priv = file_priv;
|
|
|
dev_priv->surfaces[i].refcount++;
|
|
|
dev_priv->surfaces[i].lower = s->lower;
|
|
|
radeon_apply_surface_regs(s->surface_index, dev_priv);
|
|
@@ -1993,7 +1997,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
s->lower = new_lower;
|
|
|
s->upper = new_upper;
|
|
|
s->flags = new->flags;
|
|
|
- s->filp = filp;
|
|
|
+ s->file_priv = file_priv;
|
|
|
dev_priv->surfaces[i].refcount++;
|
|
|
dev_priv->surfaces[i].upper = s->upper;
|
|
|
radeon_apply_surface_regs(s->surface_index, dev_priv);
|
|
@@ -2009,7 +2013,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
s->lower = new_lower;
|
|
|
s->upper = new_upper;
|
|
|
s->flags = new->flags;
|
|
|
- s->filp = filp;
|
|
|
+ s->file_priv = file_priv;
|
|
|
dev_priv->surfaces[i].refcount = 1;
|
|
|
dev_priv->surfaces[i].lower = s->lower;
|
|
|
dev_priv->surfaces[i].upper = s->upper;
|
|
@@ -2023,7 +2027,8 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static int free_surface(DRMFILE filp, drm_radeon_private_t * dev_priv,
|
|
|
+static int free_surface(struct drm_file *file_priv,
|
|
|
+ drm_radeon_private_t * dev_priv,
|
|
|
int lower)
|
|
|
{
|
|
|
struct radeon_virt_surface *s;
|
|
@@ -2031,8 +2036,9 @@ static int free_surface(DRMFILE filp, drm_radeon_private_t * dev_priv,
|
|
|
/* find the virtual surface */
|
|
|
for (i = 0; i < 2 * RADEON_MAX_SURFACES; i++) {
|
|
|
s = &(dev_priv->virt_surfaces[i]);
|
|
|
- if (s->filp) {
|
|
|
- if ((lower == s->lower) && (filp == s->filp)) {
|
|
|
+ if (s->file_priv) {
|
|
|
+ if ((lower == s->lower) && (file_priv == s->file_priv))
|
|
|
+ {
|
|
|
if (dev_priv->surfaces[s->surface_index].
|
|
|
lower == s->lower)
|
|
|
dev_priv->surfaces[s->surface_index].
|
|
@@ -2048,7 +2054,7 @@ static int free_surface(DRMFILE filp, drm_radeon_private_t * dev_priv,
|
|
|
refcount == 0)
|
|
|
dev_priv->surfaces[s->surface_index].
|
|
|
flags = 0;
|
|
|
- s->filp = NULL;
|
|
|
+ s->file_priv = NULL;
|
|
|
radeon_apply_surface_regs(s->surface_index,
|
|
|
dev_priv);
|
|
|
return 0;
|
|
@@ -2058,13 +2064,13 @@ static int free_surface(DRMFILE filp, drm_radeon_private_t * dev_priv,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-static void radeon_surfaces_release(DRMFILE filp,
|
|
|
+static void radeon_surfaces_release(struct drm_file *file_priv,
|
|
|
drm_radeon_private_t * dev_priv)
|
|
|
{
|
|
|
int i;
|
|
|
for (i = 0; i < 2 * RADEON_MAX_SURFACES; i++) {
|
|
|
- if (dev_priv->virt_surfaces[i].filp == filp)
|
|
|
- free_surface(filp, dev_priv,
|
|
|
+ if (dev_priv->virt_surfaces[i].file_priv == file_priv)
|
|
|
+ free_surface(file_priv, dev_priv,
|
|
|
dev_priv->virt_surfaces[i].lower);
|
|
|
}
|
|
|
}
|
|
@@ -2072,61 +2078,48 @@ static void radeon_surfaces_release(DRMFILE filp,
|
|
|
/* ================================================================
|
|
|
* IOCTL functions
|
|
|
*/
|
|
|
-static int radeon_surface_alloc(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_surface_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- drm_radeon_surface_alloc_t alloc;
|
|
|
+ drm_radeon_surface_alloc_t *alloc = data;
|
|
|
|
|
|
- DRM_COPY_FROM_USER_IOCTL(alloc,
|
|
|
- (drm_radeon_surface_alloc_t __user *) data,
|
|
|
- sizeof(alloc));
|
|
|
-
|
|
|
- if (alloc_surface(&alloc, dev_priv, filp) == -1)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (alloc_surface(alloc, dev_priv, file_priv) == -1)
|
|
|
+ return -EINVAL;
|
|
|
else
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_surface_free(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_surface_free(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- drm_radeon_surface_free_t memfree;
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(memfree, (drm_radeon_surface_free_t __user *) data,
|
|
|
- sizeof(memfree));
|
|
|
+ drm_radeon_surface_free_t *memfree = data;
|
|
|
|
|
|
- if (free_surface(filp, dev_priv, memfree.address))
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (free_surface(file_priv, dev_priv, memfree->address))
|
|
|
+ return -EINVAL;
|
|
|
else
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_clear(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_clear(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
|
|
- drm_radeon_clear_t clear;
|
|
|
+ drm_radeon_clear_t *clear = data;
|
|
|
drm_radeon_clear_rect_t depth_boxes[RADEON_NR_SAREA_CLIPRECTS];
|
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(clear, (drm_radeon_clear_t __user *) data,
|
|
|
- sizeof(clear));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS)
|
|
|
sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS;
|
|
|
|
|
|
- if (DRM_COPY_FROM_USER(&depth_boxes, clear.depth_boxes,
|
|
|
+ if (DRM_COPY_FROM_USER(&depth_boxes, clear->depth_boxes,
|
|
|
sarea_priv->nbox * sizeof(depth_boxes[0])))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
- radeon_cp_dispatch_clear(dev, &clear, depth_boxes);
|
|
|
+ radeon_cp_dispatch_clear(dev, clear, depth_boxes);
|
|
|
|
|
|
COMMIT_RING();
|
|
|
return 0;
|
|
@@ -2162,13 +2155,12 @@ static int radeon_do_init_pageflip(struct drm_device * dev)
|
|
|
/* Swapping and flipping are different operations, need different ioctls.
|
|
|
* They can & should be intermixed to support multiple 3d windows.
|
|
|
*/
|
|
|
-static int radeon_cp_flip(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_flip(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
@@ -2181,14 +2173,13 @@ static int radeon_cp_flip(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_swap(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_swap(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
@@ -2202,64 +2193,57 @@ static int radeon_cp_swap(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_vertex(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_vertex(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
|
|
struct drm_device_dma *dma = dev->dma;
|
|
|
struct drm_buf *buf;
|
|
|
- drm_radeon_vertex_t vertex;
|
|
|
+ drm_radeon_vertex_t *vertex = data;
|
|
|
drm_radeon_tcl_prim_t prim;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(vertex, (drm_radeon_vertex_t __user *) data,
|
|
|
- sizeof(vertex));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
DRM_DEBUG("pid=%d index=%d count=%d discard=%d\n",
|
|
|
- DRM_CURRENTPID, vertex.idx, vertex.count, vertex.discard);
|
|
|
+ DRM_CURRENTPID, vertex->idx, vertex->count, vertex->discard);
|
|
|
|
|
|
- if (vertex.idx < 0 || vertex.idx >= dma->buf_count) {
|
|
|
+ if (vertex->idx < 0 || vertex->idx >= dma->buf_count) {
|
|
|
DRM_ERROR("buffer index %d (of %d max)\n",
|
|
|
- vertex.idx, dma->buf_count - 1);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ vertex->idx, dma->buf_count - 1);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
- if (vertex.prim < 0 || vertex.prim > RADEON_PRIM_TYPE_3VRT_LINE_LIST) {
|
|
|
- DRM_ERROR("buffer prim %d\n", vertex.prim);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (vertex->prim < 0 || vertex->prim > RADEON_PRIM_TYPE_3VRT_LINE_LIST) {
|
|
|
+ DRM_ERROR("buffer prim %d\n", vertex->prim);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- buf = dma->buflist[vertex.idx];
|
|
|
+ buf = dma->buflist[vertex->idx];
|
|
|
|
|
|
- if (buf->filp != filp) {
|
|
|
+ if (buf->file_priv != file_priv) {
|
|
|
DRM_ERROR("process %d using buffer owned by %p\n",
|
|
|
- DRM_CURRENTPID, buf->filp);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_CURRENTPID, buf->file_priv);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
if (buf->pending) {
|
|
|
- DRM_ERROR("sending pending buffer %d\n", vertex.idx);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_ERROR("sending pending buffer %d\n", vertex->idx);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
/* Build up a prim_t record:
|
|
|
*/
|
|
|
- if (vertex.count) {
|
|
|
- buf->used = vertex.count; /* not used? */
|
|
|
+ if (vertex->count) {
|
|
|
+ buf->used = vertex->count; /* not used? */
|
|
|
|
|
|
if (sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS) {
|
|
|
- if (radeon_emit_state(dev_priv, filp_priv,
|
|
|
+ if (radeon_emit_state(dev_priv, file_priv,
|
|
|
&sarea_priv->context_state,
|
|
|
sarea_priv->tex_state,
|
|
|
sarea_priv->dirty)) {
|
|
|
DRM_ERROR("radeon_emit_state failed\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
sarea_priv->dirty &= ~(RADEON_UPLOAD_TEX0IMAGES |
|
|
@@ -2269,15 +2253,15 @@ static int radeon_cp_vertex(DRM_IOCTL_ARGS)
|
|
|
}
|
|
|
|
|
|
prim.start = 0;
|
|
|
- prim.finish = vertex.count; /* unused */
|
|
|
- prim.prim = vertex.prim;
|
|
|
- prim.numverts = vertex.count;
|
|
|
+ prim.finish = vertex->count; /* unused */
|
|
|
+ prim.prim = vertex->prim;
|
|
|
+ prim.numverts = vertex->count;
|
|
|
prim.vc_format = dev_priv->sarea_priv->vc_format;
|
|
|
|
|
|
radeon_cp_dispatch_vertex(dev, buf, &prim);
|
|
|
}
|
|
|
|
|
|
- if (vertex.discard) {
|
|
|
+ if (vertex->discard) {
|
|
|
radeon_cp_discard_buffer(dev, buf);
|
|
|
}
|
|
|
|
|
@@ -2285,74 +2269,68 @@ static int radeon_cp_vertex(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_indices(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_indices(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
|
|
struct drm_device_dma *dma = dev->dma;
|
|
|
struct drm_buf *buf;
|
|
|
- drm_radeon_indices_t elts;
|
|
|
+ drm_radeon_indices_t *elts = data;
|
|
|
drm_radeon_tcl_prim_t prim;
|
|
|
int count;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(elts, (drm_radeon_indices_t __user *) data,
|
|
|
- sizeof(elts));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
DRM_DEBUG("pid=%d index=%d start=%d end=%d discard=%d\n",
|
|
|
- DRM_CURRENTPID, elts.idx, elts.start, elts.end, elts.discard);
|
|
|
+ DRM_CURRENTPID, elts->idx, elts->start, elts->end,
|
|
|
+ elts->discard);
|
|
|
|
|
|
- if (elts.idx < 0 || elts.idx >= dma->buf_count) {
|
|
|
+ if (elts->idx < 0 || elts->idx >= dma->buf_count) {
|
|
|
DRM_ERROR("buffer index %d (of %d max)\n",
|
|
|
- elts.idx, dma->buf_count - 1);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ elts->idx, dma->buf_count - 1);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
- if (elts.prim < 0 || elts.prim > RADEON_PRIM_TYPE_3VRT_LINE_LIST) {
|
|
|
- DRM_ERROR("buffer prim %d\n", elts.prim);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (elts->prim < 0 || elts->prim > RADEON_PRIM_TYPE_3VRT_LINE_LIST) {
|
|
|
+ DRM_ERROR("buffer prim %d\n", elts->prim);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- buf = dma->buflist[elts.idx];
|
|
|
+ buf = dma->buflist[elts->idx];
|
|
|
|
|
|
- if (buf->filp != filp) {
|
|
|
+ if (buf->file_priv != file_priv) {
|
|
|
DRM_ERROR("process %d using buffer owned by %p\n",
|
|
|
- DRM_CURRENTPID, buf->filp);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_CURRENTPID, buf->file_priv);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
if (buf->pending) {
|
|
|
- DRM_ERROR("sending pending buffer %d\n", elts.idx);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_ERROR("sending pending buffer %d\n", elts->idx);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- count = (elts.end - elts.start) / sizeof(u16);
|
|
|
- elts.start -= RADEON_INDEX_PRIM_OFFSET;
|
|
|
+ count = (elts->end - elts->start) / sizeof(u16);
|
|
|
+ elts->start -= RADEON_INDEX_PRIM_OFFSET;
|
|
|
|
|
|
- if (elts.start & 0x7) {
|
|
|
- DRM_ERROR("misaligned buffer 0x%x\n", elts.start);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (elts->start & 0x7) {
|
|
|
+ DRM_ERROR("misaligned buffer 0x%x\n", elts->start);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
- if (elts.start < buf->used) {
|
|
|
- DRM_ERROR("no header 0x%x - 0x%x\n", elts.start, buf->used);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (elts->start < buf->used) {
|
|
|
+ DRM_ERROR("no header 0x%x - 0x%x\n", elts->start, buf->used);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- buf->used = elts.end;
|
|
|
+ buf->used = elts->end;
|
|
|
|
|
|
if (sarea_priv->dirty & ~RADEON_UPLOAD_CLIPRECTS) {
|
|
|
- if (radeon_emit_state(dev_priv, filp_priv,
|
|
|
+ if (radeon_emit_state(dev_priv, file_priv,
|
|
|
&sarea_priv->context_state,
|
|
|
sarea_priv->tex_state,
|
|
|
sarea_priv->dirty)) {
|
|
|
DRM_ERROR("radeon_emit_state failed\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
sarea_priv->dirty &= ~(RADEON_UPLOAD_TEX0IMAGES |
|
|
@@ -2363,15 +2341,15 @@ static int radeon_cp_indices(DRM_IOCTL_ARGS)
|
|
|
|
|
|
/* Build up a prim_t record:
|
|
|
*/
|
|
|
- prim.start = elts.start;
|
|
|
- prim.finish = elts.end;
|
|
|
- prim.prim = elts.prim;
|
|
|
+ prim.start = elts->start;
|
|
|
+ prim.finish = elts->end;
|
|
|
+ prim.prim = elts->prim;
|
|
|
prim.offset = 0; /* offset from start of dma buffers */
|
|
|
prim.numverts = RADEON_MAX_VB_VERTS; /* duh */
|
|
|
prim.vc_format = dev_priv->sarea_priv->vc_format;
|
|
|
|
|
|
radeon_cp_dispatch_indices(dev, buf, &prim);
|
|
|
- if (elts.discard) {
|
|
|
+ if (elts->discard) {
|
|
|
radeon_cp_discard_buffer(dev, buf);
|
|
|
}
|
|
|
|
|
@@ -2379,52 +2357,43 @@ static int radeon_cp_indices(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_texture(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_texture(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- drm_radeon_texture_t tex;
|
|
|
+ drm_radeon_texture_t *tex = data;
|
|
|
drm_radeon_tex_image_t image;
|
|
|
int ret;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(tex, (drm_radeon_texture_t __user *) data,
|
|
|
- sizeof(tex));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
- if (tex.image == NULL) {
|
|
|
+ if (tex->image == NULL) {
|
|
|
DRM_ERROR("null texture image!\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (DRM_COPY_FROM_USER(&image,
|
|
|
- (drm_radeon_tex_image_t __user *) tex.image,
|
|
|
+ (drm_radeon_tex_image_t __user *) tex->image,
|
|
|
sizeof(image)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- ret = radeon_cp_dispatch_texture(filp, dev, &tex, &image);
|
|
|
+ ret = radeon_cp_dispatch_texture(dev, file_priv, tex, &image);
|
|
|
|
|
|
- COMMIT_RING();
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_stipple(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_stipple(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- drm_radeon_stipple_t stipple;
|
|
|
+ drm_radeon_stipple_t *stipple = data;
|
|
|
u32 mask[32];
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(stipple, (drm_radeon_stipple_t __user *) data,
|
|
|
- sizeof(stipple));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
- if (DRM_COPY_FROM_USER(&mask, stipple.mask, 32 * sizeof(u32)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32)))
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
@@ -2434,52 +2403,48 @@ static int radeon_cp_stipple(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_indirect(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_indirect(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
struct drm_device_dma *dma = dev->dma;
|
|
|
struct drm_buf *buf;
|
|
|
- drm_radeon_indirect_t indirect;
|
|
|
+ drm_radeon_indirect_t *indirect = data;
|
|
|
RING_LOCALS;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(indirect,
|
|
|
- (drm_radeon_indirect_t __user *) data,
|
|
|
- sizeof(indirect));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
DRM_DEBUG("indirect: idx=%d s=%d e=%d d=%d\n",
|
|
|
- indirect.idx, indirect.start, indirect.end, indirect.discard);
|
|
|
+ indirect->idx, indirect->start, indirect->end,
|
|
|
+ indirect->discard);
|
|
|
|
|
|
- if (indirect.idx < 0 || indirect.idx >= dma->buf_count) {
|
|
|
+ if (indirect->idx < 0 || indirect->idx >= dma->buf_count) {
|
|
|
DRM_ERROR("buffer index %d (of %d max)\n",
|
|
|
- indirect.idx, dma->buf_count - 1);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ indirect->idx, dma->buf_count - 1);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- buf = dma->buflist[indirect.idx];
|
|
|
+ buf = dma->buflist[indirect->idx];
|
|
|
|
|
|
- if (buf->filp != filp) {
|
|
|
+ if (buf->file_priv != file_priv) {
|
|
|
DRM_ERROR("process %d using buffer owned by %p\n",
|
|
|
- DRM_CURRENTPID, buf->filp);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_CURRENTPID, buf->file_priv);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
if (buf->pending) {
|
|
|
- DRM_ERROR("sending pending buffer %d\n", indirect.idx);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_ERROR("sending pending buffer %d\n", indirect->idx);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (indirect.start < buf->used) {
|
|
|
+ if (indirect->start < buf->used) {
|
|
|
DRM_ERROR("reusing indirect: start=0x%x actual=0x%x\n",
|
|
|
- indirect.start, buf->used);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ indirect->start, buf->used);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- buf->used = indirect.end;
|
|
|
+ buf->used = indirect->end;
|
|
|
|
|
|
/* Wait for the 3D stream to idle before the indirect buffer
|
|
|
* containing 2D acceleration commands is processed.
|
|
@@ -2494,8 +2459,8 @@ static int radeon_cp_indirect(DRM_IOCTL_ARGS)
|
|
|
* X server. This is insecure and is thus only available to
|
|
|
* privileged clients.
|
|
|
*/
|
|
|
- radeon_cp_dispatch_indirect(dev, buf, indirect.start, indirect.end);
|
|
|
- if (indirect.discard) {
|
|
|
+ radeon_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
|
|
|
+ if (indirect->discard) {
|
|
|
radeon_cp_discard_buffer(dev, buf);
|
|
|
}
|
|
|
|
|
@@ -2503,71 +2468,64 @@ static int radeon_cp_indirect(DRM_IOCTL_ARGS)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_vertex2(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_vertex2(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
drm_radeon_sarea_t *sarea_priv = dev_priv->sarea_priv;
|
|
|
struct drm_device_dma *dma = dev->dma;
|
|
|
struct drm_buf *buf;
|
|
|
- drm_radeon_vertex2_t vertex;
|
|
|
+ drm_radeon_vertex2_t *vertex = data;
|
|
|
int i;
|
|
|
unsigned char laststate;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(vertex, (drm_radeon_vertex2_t __user *) data,
|
|
|
- sizeof(vertex));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
DRM_DEBUG("pid=%d index=%d discard=%d\n",
|
|
|
- DRM_CURRENTPID, vertex.idx, vertex.discard);
|
|
|
+ DRM_CURRENTPID, vertex->idx, vertex->discard);
|
|
|
|
|
|
- if (vertex.idx < 0 || vertex.idx >= dma->buf_count) {
|
|
|
+ if (vertex->idx < 0 || vertex->idx >= dma->buf_count) {
|
|
|
DRM_ERROR("buffer index %d (of %d max)\n",
|
|
|
- vertex.idx, dma->buf_count - 1);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ vertex->idx, dma->buf_count - 1);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- buf = dma->buflist[vertex.idx];
|
|
|
+ buf = dma->buflist[vertex->idx];
|
|
|
|
|
|
- if (buf->filp != filp) {
|
|
|
+ if (buf->file_priv != file_priv) {
|
|
|
DRM_ERROR("process %d using buffer owned by %p\n",
|
|
|
- DRM_CURRENTPID, buf->filp);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_CURRENTPID, buf->file_priv);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (buf->pending) {
|
|
|
- DRM_ERROR("sending pending buffer %d\n", vertex.idx);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_ERROR("sending pending buffer %d\n", vertex->idx);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
- for (laststate = 0xff, i = 0; i < vertex.nr_prims; i++) {
|
|
|
+ for (laststate = 0xff, i = 0; i < vertex->nr_prims; i++) {
|
|
|
drm_radeon_prim_t prim;
|
|
|
drm_radeon_tcl_prim_t tclprim;
|
|
|
|
|
|
- if (DRM_COPY_FROM_USER(&prim, &vertex.prim[i], sizeof(prim)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ if (DRM_COPY_FROM_USER(&prim, &vertex->prim[i], sizeof(prim)))
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
if (prim.stateidx != laststate) {
|
|
|
drm_radeon_state_t state;
|
|
|
|
|
|
if (DRM_COPY_FROM_USER(&state,
|
|
|
- &vertex.state[prim.stateidx],
|
|
|
+ &vertex->state[prim.stateidx],
|
|
|
sizeof(state)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
|
|
|
- if (radeon_emit_state2(dev_priv, filp_priv, &state)) {
|
|
|
+ if (radeon_emit_state2(dev_priv, file_priv, &state)) {
|
|
|
DRM_ERROR("radeon_emit_state2 failed\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
laststate = prim.stateidx;
|
|
@@ -2594,7 +2552,7 @@ static int radeon_cp_vertex2(DRM_IOCTL_ARGS)
|
|
|
sarea_priv->nbox = 0;
|
|
|
}
|
|
|
|
|
|
- if (vertex.discard) {
|
|
|
+ if (vertex->discard) {
|
|
|
radeon_cp_discard_buffer(dev, buf);
|
|
|
}
|
|
|
|
|
@@ -2603,7 +2561,7 @@ static int radeon_cp_vertex2(DRM_IOCTL_ARGS)
|
|
|
}
|
|
|
|
|
|
static int radeon_emit_packets(drm_radeon_private_t * dev_priv,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_cmd_header_t header,
|
|
|
drm_radeon_kcmd_buffer_t *cmdbuf)
|
|
|
{
|
|
@@ -2613,19 +2571,19 @@ static int radeon_emit_packets(drm_radeon_private_t * dev_priv,
|
|
|
RING_LOCALS;
|
|
|
|
|
|
if (id >= RADEON_MAX_STATE_PACKETS)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
sz = packet[id].len;
|
|
|
reg = packet[id].start;
|
|
|
|
|
|
if (sz * sizeof(int) > cmdbuf->bufsz) {
|
|
|
DRM_ERROR("Packet size provided larger than data provided\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (radeon_check_and_fixup_packets(dev_priv, filp_priv, id, data)) {
|
|
|
+ if (radeon_check_and_fixup_packets(dev_priv, file_priv, id, data)) {
|
|
|
DRM_ERROR("Packet verification failed\n");
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
BEGIN_RING(sz + 1);
|
|
@@ -2713,7 +2671,7 @@ static __inline__ int radeon_emit_veclinear(drm_radeon_private_t *dev_priv,
|
|
|
if (!sz)
|
|
|
return 0;
|
|
|
if (sz * 4 > cmdbuf->bufsz)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
BEGIN_RING(5 + sz);
|
|
|
OUT_RING_REG(RADEON_SE_TCL_STATE_FLUSH, 0);
|
|
@@ -2729,7 +2687,7 @@ static __inline__ int radeon_emit_veclinear(drm_radeon_private_t *dev_priv,
|
|
|
}
|
|
|
|
|
|
static int radeon_emit_packet3(struct drm_device * dev,
|
|
|
- struct drm_file * filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_kcmd_buffer_t *cmdbuf)
|
|
|
{
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
@@ -2739,7 +2697,7 @@ static int radeon_emit_packet3(struct drm_device * dev,
|
|
|
|
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
- if ((ret = radeon_check_and_fixup_packet3(dev_priv, filp_priv,
|
|
|
+ if ((ret = radeon_check_and_fixup_packet3(dev_priv, file_priv,
|
|
|
cmdbuf, &cmdsz))) {
|
|
|
DRM_ERROR("Packet verification failed\n");
|
|
|
return ret;
|
|
@@ -2755,7 +2713,7 @@ static int radeon_emit_packet3(struct drm_device * dev,
|
|
|
}
|
|
|
|
|
|
static int radeon_emit_packet3_cliprect(struct drm_device *dev,
|
|
|
- struct drm_file *filp_priv,
|
|
|
+ struct drm_file *file_priv,
|
|
|
drm_radeon_kcmd_buffer_t *cmdbuf,
|
|
|
int orig_nbox)
|
|
|
{
|
|
@@ -2769,7 +2727,7 @@ static int radeon_emit_packet3_cliprect(struct drm_device *dev,
|
|
|
|
|
|
DRM_DEBUG("\n");
|
|
|
|
|
|
- if ((ret = radeon_check_and_fixup_packet3(dev_priv, filp_priv,
|
|
|
+ if ((ret = radeon_check_and_fixup_packet3(dev_priv, file_priv,
|
|
|
cmdbuf, &cmdsz))) {
|
|
|
DRM_ERROR("Packet verification failed\n");
|
|
|
return ret;
|
|
@@ -2781,7 +2739,7 @@ static int radeon_emit_packet3_cliprect(struct drm_device *dev,
|
|
|
do {
|
|
|
if (i < cmdbuf->nbox) {
|
|
|
if (DRM_COPY_FROM_USER(&box, &boxes[i], sizeof(box)))
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
/* FIXME The second and subsequent times round
|
|
|
* this loop, send a WAIT_UNTIL_3D_IDLE before
|
|
|
* calling emit_clip_rect(). This fixes a
|
|
@@ -2839,62 +2797,54 @@ static int radeon_emit_wait(struct drm_device * dev, int flags)
|
|
|
ADVANCE_RING();
|
|
|
break;
|
|
|
default:
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
struct drm_device_dma *dma = dev->dma;
|
|
|
struct drm_buf *buf = NULL;
|
|
|
int idx;
|
|
|
- drm_radeon_kcmd_buffer_t cmdbuf;
|
|
|
+ drm_radeon_kcmd_buffer_t *cmdbuf = data;
|
|
|
drm_radeon_cmd_header_t header;
|
|
|
int orig_nbox, orig_bufsz;
|
|
|
char *kbuf = NULL;
|
|
|
|
|
|
- LOCK_TEST_WITH_RETURN(dev, filp);
|
|
|
-
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(cmdbuf,
|
|
|
- (drm_radeon_cmd_buffer_t __user *) data,
|
|
|
- sizeof(cmdbuf));
|
|
|
+ LOCK_TEST_WITH_RETURN(dev, file_priv);
|
|
|
|
|
|
RING_SPACE_TEST_WITH_RETURN(dev_priv);
|
|
|
VB_AGE_TEST_WITH_RETURN(dev_priv);
|
|
|
|
|
|
- if (cmdbuf.bufsz > 64 * 1024 || cmdbuf.bufsz < 0) {
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ if (cmdbuf->bufsz > 64 * 1024 || cmdbuf->bufsz < 0) {
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
/* Allocate an in-kernel area and copy in the cmdbuf. Do this to avoid
|
|
|
* races between checking values and using those values in other code,
|
|
|
* and simply to avoid a lot of function calls to copy in data.
|
|
|
*/
|
|
|
- orig_bufsz = cmdbuf.bufsz;
|
|
|
+ orig_bufsz = cmdbuf->bufsz;
|
|
|
if (orig_bufsz != 0) {
|
|
|
- kbuf = drm_alloc(cmdbuf.bufsz, DRM_MEM_DRIVER);
|
|
|
+ kbuf = drm_alloc(cmdbuf->bufsz, DRM_MEM_DRIVER);
|
|
|
if (kbuf == NULL)
|
|
|
- return DRM_ERR(ENOMEM);
|
|
|
- if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf.buf,
|
|
|
- cmdbuf.bufsz)) {
|
|
|
+ return -ENOMEM;
|
|
|
+ if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf->buf,
|
|
|
+ cmdbuf->bufsz)) {
|
|
|
drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
- cmdbuf.buf = kbuf;
|
|
|
+ cmdbuf->buf = kbuf;
|
|
|
}
|
|
|
|
|
|
- orig_nbox = cmdbuf.nbox;
|
|
|
+ orig_nbox = cmdbuf->nbox;
|
|
|
|
|
|
if (dev_priv->microcode_version == UCODE_R300) {
|
|
|
int temp;
|
|
|
- temp = r300_do_cp_cmdbuf(dev, filp, filp_priv, &cmdbuf);
|
|
|
+ temp = r300_do_cp_cmdbuf(dev, file_priv, cmdbuf);
|
|
|
|
|
|
if (orig_bufsz != 0)
|
|
|
drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
|
|
@@ -2903,17 +2853,17 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
}
|
|
|
|
|
|
/* microcode_version != r300 */
|
|
|
- while (cmdbuf.bufsz >= sizeof(header)) {
|
|
|
+ while (cmdbuf->bufsz >= sizeof(header)) {
|
|
|
|
|
|
- header.i = *(int *)cmdbuf.buf;
|
|
|
- cmdbuf.buf += sizeof(header);
|
|
|
- cmdbuf.bufsz -= sizeof(header);
|
|
|
+ header.i = *(int *)cmdbuf->buf;
|
|
|
+ cmdbuf->buf += sizeof(header);
|
|
|
+ cmdbuf->bufsz -= sizeof(header);
|
|
|
|
|
|
switch (header.header.cmd_type) {
|
|
|
case RADEON_CMD_PACKET:
|
|
|
DRM_DEBUG("RADEON_CMD_PACKET\n");
|
|
|
if (radeon_emit_packets
|
|
|
- (dev_priv, filp_priv, header, &cmdbuf)) {
|
|
|
+ (dev_priv, file_priv, header, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_packets failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2921,7 +2871,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
|
|
|
case RADEON_CMD_SCALARS:
|
|
|
DRM_DEBUG("RADEON_CMD_SCALARS\n");
|
|
|
- if (radeon_emit_scalars(dev_priv, header, &cmdbuf)) {
|
|
|
+ if (radeon_emit_scalars(dev_priv, header, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_scalars failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2929,7 +2879,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
|
|
|
case RADEON_CMD_VECTORS:
|
|
|
DRM_DEBUG("RADEON_CMD_VECTORS\n");
|
|
|
- if (radeon_emit_vectors(dev_priv, header, &cmdbuf)) {
|
|
|
+ if (radeon_emit_vectors(dev_priv, header, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_vectors failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2945,9 +2895,10 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
}
|
|
|
|
|
|
buf = dma->buflist[idx];
|
|
|
- if (buf->filp != filp || buf->pending) {
|
|
|
+ if (buf->file_priv != file_priv || buf->pending) {
|
|
|
DRM_ERROR("bad buffer %p %p %d\n",
|
|
|
- buf->filp, filp, buf->pending);
|
|
|
+ buf->file_priv, file_priv,
|
|
|
+ buf->pending);
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
@@ -2956,7 +2907,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
|
|
|
case RADEON_CMD_PACKET3:
|
|
|
DRM_DEBUG("RADEON_CMD_PACKET3\n");
|
|
|
- if (radeon_emit_packet3(dev, filp_priv, &cmdbuf)) {
|
|
|
+ if (radeon_emit_packet3(dev, file_priv, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_packet3 failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2965,7 +2916,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
case RADEON_CMD_PACKET3_CLIP:
|
|
|
DRM_DEBUG("RADEON_CMD_PACKET3_CLIP\n");
|
|
|
if (radeon_emit_packet3_cliprect
|
|
|
- (dev, filp_priv, &cmdbuf, orig_nbox)) {
|
|
|
+ (dev, file_priv, cmdbuf, orig_nbox)) {
|
|
|
DRM_ERROR("radeon_emit_packet3_clip failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2973,7 +2924,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
|
|
|
case RADEON_CMD_SCALARS2:
|
|
|
DRM_DEBUG("RADEON_CMD_SCALARS2\n");
|
|
|
- if (radeon_emit_scalars2(dev_priv, header, &cmdbuf)) {
|
|
|
+ if (radeon_emit_scalars2(dev_priv, header, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_scalars2 failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2988,7 +2939,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
break;
|
|
|
case RADEON_CMD_VECLINEAR:
|
|
|
DRM_DEBUG("RADEON_CMD_VECLINEAR\n");
|
|
|
- if (radeon_emit_veclinear(dev_priv, header, &cmdbuf)) {
|
|
|
+ if (radeon_emit_veclinear(dev_priv, header, cmdbuf)) {
|
|
|
DRM_ERROR("radeon_emit_veclinear failed\n");
|
|
|
goto err;
|
|
|
}
|
|
@@ -2997,7 +2948,7 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
default:
|
|
|
DRM_ERROR("bad cmd_type %d at %p\n",
|
|
|
header.header.cmd_type,
|
|
|
- cmdbuf.buf - sizeof(header));
|
|
|
+ cmdbuf->buf - sizeof(header));
|
|
|
goto err;
|
|
|
}
|
|
|
}
|
|
@@ -3012,22 +2963,18 @@ static int radeon_cp_cmdbuf(DRM_IOCTL_ARGS)
|
|
|
err:
|
|
|
if (orig_bufsz != 0)
|
|
|
drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_getparam(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- drm_radeon_getparam_t param;
|
|
|
+ drm_radeon_getparam_t *param = data;
|
|
|
int value;
|
|
|
|
|
|
- DRM_COPY_FROM_USER_IOCTL(param, (drm_radeon_getparam_t __user *) data,
|
|
|
- sizeof(param));
|
|
|
-
|
|
|
DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
|
|
|
|
|
|
- switch (param.param) {
|
|
|
+ switch (param->param) {
|
|
|
case RADEON_PARAM_GART_BUFFER_OFFSET:
|
|
|
value = dev_priv->gart_buffers_offset;
|
|
|
break;
|
|
@@ -3074,7 +3021,7 @@ static int radeon_cp_getparam(DRM_IOCTL_ARGS)
|
|
|
break;
|
|
|
case RADEON_PARAM_SCRATCH_OFFSET:
|
|
|
if (!dev_priv->writeback_works)
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ return -EINVAL;
|
|
|
value = RADEON_SCRATCH_REG_OFFSET;
|
|
|
break;
|
|
|
case RADEON_PARAM_CARD_TYPE:
|
|
@@ -3089,43 +3036,37 @@ static int radeon_cp_getparam(DRM_IOCTL_ARGS)
|
|
|
value = radeon_vblank_crtc_get(dev);
|
|
|
break;
|
|
|
default:
|
|
|
- DRM_DEBUG("Invalid parameter %d\n", param.param);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_DEBUG("Invalid parameter %d\n", param->param);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if (DRM_COPY_TO_USER(param.value, &value, sizeof(int))) {
|
|
|
+ if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
|
|
|
DRM_ERROR("copy_to_user\n");
|
|
|
- return DRM_ERR(EFAULT);
|
|
|
+ return -EFAULT;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int radeon_cp_setparam(DRM_IOCTL_ARGS)
|
|
|
+static int radeon_cp_setparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
|
|
{
|
|
|
- DRM_DEVICE;
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
- struct drm_file *filp_priv;
|
|
|
- drm_radeon_setparam_t sp;
|
|
|
+ drm_radeon_setparam_t *sp = data;
|
|
|
struct drm_radeon_driver_file_fields *radeon_priv;
|
|
|
|
|
|
- DRM_GET_PRIV_WITH_RETURN(filp_priv, filp);
|
|
|
-
|
|
|
- DRM_COPY_FROM_USER_IOCTL(sp, (drm_radeon_setparam_t __user *) data,
|
|
|
- sizeof(sp));
|
|
|
-
|
|
|
- switch (sp.param) {
|
|
|
+ switch (sp->param) {
|
|
|
case RADEON_SETPARAM_FB_LOCATION:
|
|
|
- radeon_priv = filp_priv->driver_priv;
|
|
|
- radeon_priv->radeon_fb_delta = dev_priv->fb_location - sp.value;
|
|
|
+ radeon_priv = file_priv->driver_priv;
|
|
|
+ radeon_priv->radeon_fb_delta = dev_priv->fb_location -
|
|
|
+ sp->value;
|
|
|
break;
|
|
|
case RADEON_SETPARAM_SWITCH_TILING:
|
|
|
- if (sp.value == 0) {
|
|
|
+ if (sp->value == 0) {
|
|
|
DRM_DEBUG("color tiling disabled\n");
|
|
|
dev_priv->front_pitch_offset &= ~RADEON_DST_TILE_MACRO;
|
|
|
dev_priv->back_pitch_offset &= ~RADEON_DST_TILE_MACRO;
|
|
|
dev_priv->sarea_priv->tiling_enabled = 0;
|
|
|
- } else if (sp.value == 1) {
|
|
|
+ } else if (sp->value == 1) {
|
|
|
DRM_DEBUG("color tiling enabled\n");
|
|
|
dev_priv->front_pitch_offset |= RADEON_DST_TILE_MACRO;
|
|
|
dev_priv->back_pitch_offset |= RADEON_DST_TILE_MACRO;
|
|
@@ -3133,23 +3074,23 @@ static int radeon_cp_setparam(DRM_IOCTL_ARGS)
|
|
|
}
|
|
|
break;
|
|
|
case RADEON_SETPARAM_PCIGART_LOCATION:
|
|
|
- dev_priv->pcigart_offset = sp.value;
|
|
|
+ dev_priv->pcigart_offset = sp->value;
|
|
|
dev_priv->pcigart_offset_set = 1;
|
|
|
break;
|
|
|
case RADEON_SETPARAM_NEW_MEMMAP:
|
|
|
- dev_priv->new_memmap = sp.value;
|
|
|
+ dev_priv->new_memmap = sp->value;
|
|
|
break;
|
|
|
case RADEON_SETPARAM_PCIGART_TABLE_SIZE:
|
|
|
- dev_priv->gart_info.table_size = sp.value;
|
|
|
+ dev_priv->gart_info.table_size = sp->value;
|
|
|
if (dev_priv->gart_info.table_size < RADEON_PCIGART_TABLE_SIZE)
|
|
|
dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE;
|
|
|
break;
|
|
|
case RADEON_SETPARAM_VBLANK_CRTC:
|
|
|
- return radeon_vblank_crtc_set(dev, sp.value);
|
|
|
+ return radeon_vblank_crtc_set(dev, sp->value);
|
|
|
break;
|
|
|
default:
|
|
|
- DRM_DEBUG("Invalid parameter %d\n", sp.param);
|
|
|
- return DRM_ERR(EINVAL);
|
|
|
+ DRM_DEBUG("Invalid parameter %d\n", sp->param);
|
|
|
+ return -EINVAL;
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -3162,14 +3103,14 @@ static int radeon_cp_setparam(DRM_IOCTL_ARGS)
|
|
|
*
|
|
|
* DRM infrastructure takes care of reclaiming dma buffers.
|
|
|
*/
|
|
|
-void radeon_driver_preclose(struct drm_device *dev, DRMFILE filp)
|
|
|
+void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
|
|
|
{
|
|
|
if (dev->dev_private) {
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
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);
|
|
|
+ radeon_mem_release(file_priv, dev_priv->gart_heap);
|
|
|
+ radeon_mem_release(file_priv, dev_priv->fb_heap);
|
|
|
+ radeon_surfaces_release(file_priv, dev_priv);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3186,7 +3127,7 @@ void radeon_driver_lastclose(struct drm_device *dev)
|
|
|
radeon_do_release(dev);
|
|
|
}
|
|
|
|
|
|
-int radeon_driver_open(struct drm_device *dev, struct drm_file *filp_priv)
|
|
|
+int radeon_driver_open(struct drm_device *dev, struct drm_file *file_priv)
|
|
|
{
|
|
|
drm_radeon_private_t *dev_priv = dev->dev_private;
|
|
|
struct drm_radeon_driver_file_fields *radeon_priv;
|
|
@@ -3199,7 +3140,7 @@ int radeon_driver_open(struct drm_device *dev, struct drm_file *filp_priv)
|
|
|
if (!radeon_priv)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- filp_priv->driver_priv = radeon_priv;
|
|
|
+ file_priv->driver_priv = radeon_priv;
|
|
|
|
|
|
if (dev_priv)
|
|
|
radeon_priv->radeon_fb_delta = dev_priv->fb_location;
|
|
@@ -3208,42 +3149,42 @@ int radeon_driver_open(struct drm_device *dev, struct drm_file *filp_priv)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-void radeon_driver_postclose(struct drm_device *dev, struct drm_file *filp_priv)
|
|
|
+void radeon_driver_postclose(struct drm_device *dev, struct drm_file *file_priv)
|
|
|
{
|
|
|
struct drm_radeon_driver_file_fields *radeon_priv =
|
|
|
- filp_priv->driver_priv;
|
|
|
+ file_priv->driver_priv;
|
|
|
|
|
|
drm_free(radeon_priv, sizeof(*radeon_priv), DRM_MEM_FILES);
|
|
|
}
|
|
|
|
|
|
-drm_ioctl_desc_t radeon_ioctls[] = {
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_INIT)] = {radeon_cp_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_START)] = {radeon_cp_start, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_STOP)] = {radeon_cp_stop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_RESET)] = {radeon_cp_reset, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_IDLE)] = {radeon_cp_idle, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CP_RESUME)] = {radeon_cp_resume, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_RESET)] = {radeon_engine_reset, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_FULLSCREEN)] = {radeon_fullscreen, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_SWAP)] = {radeon_cp_swap, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CLEAR)] = {radeon_cp_clear, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_VERTEX)] = {radeon_cp_vertex, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_INDICES)] = {radeon_cp_indices, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_TEXTURE)] = {radeon_cp_texture, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_STIPPLE)] = {radeon_cp_stipple, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_INDIRECT)] = {radeon_cp_indirect, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_VERTEX2)] = {radeon_cp_vertex2, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_CMDBUF)] = {radeon_cp_cmdbuf, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_GETPARAM)] = {radeon_cp_getparam, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_FLIP)] = {radeon_cp_flip, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_ALLOC)] = {radeon_mem_alloc, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_FREE)] = {radeon_mem_free, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_INIT_HEAP)] = {radeon_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_IRQ_EMIT)] = {radeon_irq_emit, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_IRQ_WAIT)] = {radeon_irq_wait, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_SETPARAM)] = {radeon_cp_setparam, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_SURF_ALLOC)] = {radeon_surface_alloc, DRM_AUTH},
|
|
|
- [DRM_IOCTL_NR(DRM_RADEON_SURF_FREE)] = {radeon_surface_free, DRM_AUTH}
|
|
|
+struct drm_ioctl_desc radeon_ioctls[] = {
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_INIT, radeon_cp_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_START, radeon_cp_start, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_STOP, radeon_cp_stop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_RESET, radeon_cp_reset, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_IDLE, radeon_cp_idle, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CP_RESUME, radeon_cp_resume, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_RESET, radeon_engine_reset, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_FULLSCREEN, radeon_fullscreen, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_SWAP, radeon_cp_swap, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CLEAR, radeon_cp_clear, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_VERTEX, radeon_cp_vertex, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_INDICES, radeon_cp_indices, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_TEXTURE, radeon_cp_texture, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_STIPPLE, radeon_cp_stipple, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_INDIRECT, radeon_cp_indirect, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_VERTEX2, radeon_cp_vertex2, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_CMDBUF, radeon_cp_cmdbuf, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_GETPARAM, radeon_cp_getparam, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_FLIP, radeon_cp_flip, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_ALLOC, radeon_mem_alloc, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_FREE, radeon_mem_free, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_INIT_HEAP, radeon_mem_init_heap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_IRQ_EMIT, radeon_irq_emit, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_IRQ_WAIT, radeon_irq_wait, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_SETPARAM, radeon_cp_setparam, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_SURF_ALLOC, radeon_surface_alloc, DRM_AUTH),
|
|
|
+ DRM_IOCTL_DEF(DRM_RADEON_SURF_FREE, radeon_surface_free, DRM_AUTH)
|
|
|
};
|
|
|
|
|
|
int radeon_max_ioctl = DRM_ARRAY_SIZE(radeon_ioctls);
|