1239375Skib/*-
2239375Skib * Copyright (C) Paul Mackerras 2005
3239375Skib * Copyright (C) Alan Hourihane 2005
4239375Skib * All Rights Reserved.
5239375Skib *
6239375Skib * Permission is hereby granted, free of charge, to any person obtaining a
7239375Skib * copy of this software and associated documentation files (the "Software"),
8239375Skib * to deal in the Software without restriction, including without limitation
9239375Skib * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10239375Skib * and/or sell copies of the Software, and to permit persons to whom the
11239375Skib * Software is furnished to do so, subject to the following conditions:
12239375Skib *
13239375Skib * The above copyright notice and this permission notice (including the next
14239375Skib * paragraph) shall be included in all copies or substantial portions of the
15239375Skib * Software.
16239375Skib *
17239375Skib * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18239375Skib * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19239375Skib * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20239375Skib * THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21239375Skib * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22239375Skib * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23239375Skib * IN THE SOFTWARE.
24239375Skib *
25239375Skib * Authors:
26239375Skib *    Paul Mackerras <paulus@samba.org>
27239375Skib *    Alan Hourihane <alanh@fairlite.demon.co.uk>
28239375Skib */
29239375Skib
30239375Skib#include <sys/cdefs.h>
31239375Skib__FBSDID("$FreeBSD$");
32239375Skib
33239375Skib#include "opt_compat.h"
34239375Skib
35239375Skib#ifdef COMPAT_FREEBSD32
36239375Skib
37239375Skib/** @file i915_ioc32.c
38239375Skib * 32-bit ioctl compatibility routines for the i915 DRM.
39239375Skib */
40239375Skib
41239375Skib#include <dev/drm2/drmP.h>
42239375Skib#include <dev/drm2/drm.h>
43239375Skib#include <dev/drm2/i915/i915_drm.h>
44239375Skib#include <dev/drm2/i915/i915_drv.h>
45239375Skib#include <dev/drm2/i915/intel_drv.h>
46239375Skib
47239375Skibtypedef struct _drm_i915_batchbuffer32 {
48239375Skib	int start;		/* agp offset */
49239375Skib	int used;		/* nr bytes in use */
50239375Skib	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */
51239375Skib	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */
52239375Skib	int num_cliprects;	/* mulitpass with multiple cliprects? */
53239375Skib	u32 cliprects;		/* pointer to userspace cliprects */
54239375Skib} drm_i915_batchbuffer32_t;
55239375Skib
56239375Skibstatic int compat_i915_batchbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv)
57239375Skib{
58239375Skib	drm_i915_batchbuffer32_t *batchbuffer32 = data;
59239375Skib	drm_i915_batchbuffer_t batchbuffer;
60239375Skib
61239375Skib	batchbuffer.start = batchbuffer32->start;
62239375Skib	batchbuffer.used = batchbuffer32->used;
63239375Skib	batchbuffer.DR1 = batchbuffer32->DR1;
64239375Skib	batchbuffer.DR4 = batchbuffer32->DR4;
65239375Skib	batchbuffer.num_cliprects = batchbuffer32->num_cliprects;
66239375Skib	batchbuffer.cliprects = (void *)(unsigned long)batchbuffer32->cliprects;
67239375Skib
68239375Skib	return i915_batchbuffer(dev, (void *)&batchbuffer, file_priv);
69239375Skib}
70239375Skib
71239375Skibtypedef struct _drm_i915_cmdbuffer32 {
72239375Skib	u32 buf;		/* pointer to userspace command buffer */
73239375Skib	int sz;			/* nr bytes in buf */
74239375Skib	int DR1;		/* hw flags for GFX_OP_DRAWRECT_INFO */
75239375Skib	int DR4;		/* window origin for GFX_OP_DRAWRECT_INFO */
76239375Skib	int num_cliprects;	/* mulitpass with multiple cliprects? */
77239375Skib	u32 cliprects;		/* pointer to userspace cliprects */
78239375Skib} drm_i915_cmdbuffer32_t;
79239375Skib
80239375Skibstatic int compat_i915_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv)
81239375Skib{
82239375Skib	drm_i915_cmdbuffer32_t *cmdbuffer32 = data;
83239375Skib	drm_i915_cmdbuffer_t cmdbuffer;
84239375Skib
85239375Skib	cmdbuffer.sz = cmdbuffer32->sz;
86239375Skib	cmdbuffer.DR1 = cmdbuffer32->DR1;
87239375Skib	cmdbuffer.DR4 = cmdbuffer32->DR4;
88239375Skib	cmdbuffer.num_cliprects = cmdbuffer32->num_cliprects;
89239375Skib	cmdbuffer.cliprects = (void *)(unsigned long)cmdbuffer32->cliprects;
90239375Skib
91239375Skib	return i915_cmdbuffer(dev, (void *)&cmdbuffer, file_priv);
92239375Skib}
93239375Skib
94239375Skibtypedef struct drm_i915_irq_emit32 {
95239375Skib	u32 irq_seq;
96239375Skib} drm_i915_irq_emit32_t;
97239375Skib
98239375Skibstatic int compat_i915_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_priv)
99239375Skib{
100239375Skib	drm_i915_irq_emit32_t *req32 = data;
101239375Skib	drm_i915_irq_emit_t request;
102239375Skib
103239375Skib	request.irq_seq = (int *)(unsigned long)req32->irq_seq;
104239375Skib
105239375Skib	return i915_irq_emit(dev, (void *)&request, file_priv);
106239375Skib}
107239375Skibtypedef struct drm_i915_getparam32 {
108239375Skib	int param;
109239375Skib	u32 value;
110239375Skib} drm_i915_getparam32_t;
111239375Skib
112239375Skibstatic int compat_i915_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
113239375Skib{
114239375Skib	drm_i915_getparam32_t *req32 = data;
115239375Skib	drm_i915_getparam_t request;
116239375Skib
117239375Skib	request.param = req32->param;
118239375Skib	request.value = (void *)(unsigned long)req32->value;
119239375Skib
120239375Skib	return i915_getparam(dev, (void *)&request, file_priv);
121239375Skib}
122239375Skib
123239375Skibtypedef struct drm_i915_mem_alloc32 {
124239375Skib	int region;
125239375Skib	int alignment;
126239375Skib	int size;
127239375Skib	u32 region_offset;	/* offset from start of fb or agp */
128239375Skib} drm_i915_mem_alloc32_t;
129239375Skib
130280183Sdumbbellstruct drm_ioctl_desc i915_compat_ioctls[] = {
131239375Skib	DRM_IOCTL_DEF(DRM_I915_BATCHBUFFER, compat_i915_batchbuffer, DRM_AUTH),
132239375Skib	DRM_IOCTL_DEF(DRM_I915_CMDBUFFER, compat_i915_cmdbuffer, DRM_AUTH),
133239375Skib	DRM_IOCTL_DEF(DRM_I915_GETPARAM, compat_i915_getparam, DRM_AUTH),
134239375Skib	DRM_IOCTL_DEF(DRM_I915_IRQ_EMIT, compat_i915_irq_emit, DRM_AUTH)
135239375Skib};
136280183Sdumbbellint i915_compat_ioctls_nr = ARRAY_SIZE(i915_compat_ioctls);
137239375Skib
138239375Skib#endif
139