open-src/lib/hwc/sun-src/hwc.c
author Alan Coopersmith <Alan.Coopersmith@Sun.COM>
Tue, 02 Mar 2010 13:31:46 -0800
changeset 919 425233ae7236
parent 907 3c35d611cdaa
child 943 294f64612d23
permissions -rw-r--r--
6931307 Standardize Sun copyright & license notices in X gate on current format
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
919
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     1
/*
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     2
 * Copyright 2002 Sun Microsystems, Inc.  All rights reserved.
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     3
 * Use is subject to license terms.
498
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
     4
 *
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
     5
 * Permission is hereby granted, free of charge, to any person obtaining a
919
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     6
 * copy of this software and associated documentation files (the "Software"),
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     7
 * to deal in the Software without restriction, including without limitation
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
     9
 * and/or sell copies of the Software, and to permit persons to whom the
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    10
 * Software is furnished to do so, subject to the following conditions:
498
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    11
 *
919
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    12
 * The above copyright notice and this permission notice (including the next
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    13
 * paragraph) shall be included in all copies or substantial portions of the
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    14
 * Software.
498
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    15
 *
919
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
425233ae7236 6931307 Standardize Sun copyright & license notices in X gate on current format
Alan Coopersmith <Alan.Coopersmith@Sun.COM>
parents: 907
diff changeset
    22
 * DEALINGS IN THE SOFTWARE.
498
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    23
 *
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    24
 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    25
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    26
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    27
#include <sys/types.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    28
#include <sys/param.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    29
#include <sys/signal.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    30
#include <sys/stream.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    31
#include <sys/stropts.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    32
#include <sys/kmem.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    33
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    34
#include <sys/vuid_event.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    35
#else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    36
#include "vuid_event.h"
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    37
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    38
#include <sys/modctl.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    39
#include <sys/cmn_err.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    40
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    41
#include <sys/fbio.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    42
#else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    43
#include "fbio.h"
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    44
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    45
#include <sys/ddi.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    46
#include <sys/file.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    47
#include <sys/sunddi.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    48
#include <sys/systm.h>
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    49
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    50
#include "hwcio.h"
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    51
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    52
/* NOTE: datamodel size-invariant ILP32/LP64 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    53
struct msctrl {		/* same as R5 PtrCtrl struct */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    54
	int num;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    55
	int den;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    56
	int threshold;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    57
	unsigned char id;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    58
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    59
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    60
/* NOTE: datamodel size-invariant ILP32/LP64 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    61
struct hwcrec {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    62
	struct fbcurpos		cursor_position;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    63
	struct hwc_limits	limits;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    64
	struct msctrl		ctrl;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    65
	dev_t			screen_dev_t;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    66
	int			hwc_enabled;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    67
	int			at_border;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    68
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    69
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    70
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    71
static int hwcopen(queue_t *q, dev_t *dev, int oflag, int sflag, cred_t *credp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    72
static int hwcclose(queue_t *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    73
static int hwcwput(queue_t *, mblk_t *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    74
static int hwcrput(queue_t *, mblk_t *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    75
static void hwcioctl(queue_t *, mblk_t *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    76
static void hwciocdata(queue_t *, mblk_t *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    77
static void hwc_spos(queue_t *q, mblk_t *mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    78
static void hwc_scursor(queue_t *q, mblk_t *mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    79
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    80
static void hwc_set_cursor_pos(dev_t, struct fbcurpos *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    81
static void hwc_set_cursor(dev_t, struct fbcursor *);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    82
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    83
static void hwc_state_free(struct copyresp *s);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    84
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    85
static struct module_info hwcmiinfo = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    86
	0,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    87
	"hwc",
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    88
	0,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    89
	INFPSZ,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    90
	2048,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    91
	128
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    92
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    93
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    94
static struct qinit hwcrinit = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    95
	hwcrput,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    96
	(int (*)())NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    97
	hwcopen,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    98
	hwcclose,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
    99
	(int (*)())NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   100
	&hwcmiinfo,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   101
	NULL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   102
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   103
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   104
static struct module_info hwcmoinfo = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   105
	0,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   106
	"hwc",
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   107
	0,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   108
	INFPSZ,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   109
	2048,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   110
	128
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   111
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   112
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   113
static struct qinit hwcwinit = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   114
	hwcwput,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   115
	(int (*)())NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   116
	hwcopen,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   117
	hwcclose,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   118
	(int (*)())NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   119
	&hwcmoinfo,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   120
	NULL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   121
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   122
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   123
static struct streamtab hwc_info = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   124
	&hwcrinit,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   125
	&hwcwinit,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   126
	NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   127
	NULL,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   128
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   129
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   130
static struct fmodsw fsw = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   131
	"hwc",
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   132
	&hwc_info,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   133
	(D_NEW|D_MP|D_MTPERMOD)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   134
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   135
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   136
/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   137
 * Module linkage information for the kernel.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   138
 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   139
extern struct mod_ops mod_strmodops;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   140
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   141
static struct modlstrmod modlstrmod = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   142
	&mod_strmodops, "streams module for hardware cursor support", &fsw
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   143
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   144
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   145
static struct modlinkage modlinkage = {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   146
	MODREV_1, &modlstrmod, NULL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   147
};
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   148
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   149
int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   150
_init(void)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   151
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   152
	return (mod_install(&modlinkage));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   153
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   154
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   155
int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   156
_info(struct modinfo *modinfop)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   157
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   158
	return (mod_info(&modlinkage, modinfop));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   159
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   160
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   161
int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   162
_fini(void)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   163
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   164
	return (mod_remove(&modlinkage));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   165
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   166
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   167
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   168
#define	ABS(x)	((x) < 0 ? -(x) : (x))
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   169
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   170
#define	ACKNAK(q, mp, iocp, type) {		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   171
	mp->b_datap->db_type = type;		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   172
	iocp->ioc_count = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   173
	qreply(q, mp);				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   174
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   175
#define	IOCACK(q, mp, iocp)	ACKNAK(q, mp, iocp, M_IOCACK)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   176
#define	IOCNAK(q, mp, iocp)	ACKNAK(q, mp, iocp, M_IOCNAK)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   177
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   178
#define	CKTRANSPARENT(q, mp)			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   179
	if (iocp->ioc_count != TRANSPARENT) {	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   180
		if (mp->b_cont) {		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   181
			freemsg(mp->b_cont);	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   182
			mp->b_cont = NULL;	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   183
		}				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   184
		mp->b_datap->db_type = M_IOCNAK; \
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   185
		qreply(q, mp);			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   186
		return;				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   187
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   188
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   189
#define	COPYIN(q, mp, cqp, cpsize) {		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   190
	cqp = (struct copyreq *)mp->b_rptr;	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   191
	cqp->cq_addr = (caddr_t)*(long *)mp->b_cont->b_rptr; \
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   192
	if (mp->b_cont)				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   193
		freemsg(mp->b_cont);		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   194
	mp->b_cont = NULL;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   195
	cqp->cq_size = cpsize;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   196
	cqp->cq_flag = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   197
	mp->b_datap->db_type = M_COPYIN;	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   198
	mp->b_wptr = mp->b_rptr + sizeof (struct copyreq); \
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   199
	qreply(q, mp);				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   200
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   201
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   202
#define	COPYACK(q, mp, iocp) {			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   203
	iocp->ioc_error = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   204
	iocp->ioc_rval = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   205
	if (mp->b_cont)				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   206
		freemsg(mp->b_cont);		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   207
	mp->b_cont = NULL;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   208
	IOCACK(q, mp, iocp);			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   209
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   210
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   211
#define	COPYNACK(q, mp, iocp) {			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   212
	iocp->ioc_error = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   213
	iocp->ioc_rval = 0;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   214
	if (mp->b_cont)				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   215
		freemsg(mp->b_cont);		\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   216
	mp->b_cont = NULL;			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   217
	IOCNAK(q, mp, iocp);			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   218
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   219
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   220
/*bugid: 4338558 hwc mem. leaks */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   221
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   222
#define	CK_RVAL(csp,mp)	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   223
	if (csp->cp_rval) {			\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   224
		hwc_state_free(csp); \
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   225
		freemsg(mp);	\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   226
		return;				\
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   227
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   228
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   229
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   230
/*ARGSUSED*/
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   231
static int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   232
hwcopen(queue_t *q, dev_t *dev, int oflag, int sflag, cred_t *credp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   233
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   234
	struct hwcrec *hwcptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   235
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   236
	if (q->q_ptr != NULL)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   237
		return (0);		/* already attached */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   238
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   239
	if (!groupmember(0, ddi_get_cred()))
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   240
		return (EPERM);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   241
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   242
	if ((hwcptr = kmem_alloc(sizeof (struct hwcrec), KM_SLEEP)) == NULL)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   243
		return (ENOMEM);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   244
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   245
	hwcptr->hwc_enabled = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   246
	hwcptr->at_border = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   247
	hwcptr->ctrl.num = 2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   248
	hwcptr->ctrl.den = 1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   249
	hwcptr->ctrl.threshold = 4;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   250
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   251
	/* save the instance pointer in private data  */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   252
	q->q_ptr = (void *)hwcptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   253
	WR(q)->q_ptr = (void *)hwcptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   254
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   255
	qprocson(q);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   256
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   257
	return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   258
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   259
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   260
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   261
static int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   262
hwcclose(queue_t *q)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   263
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   264
	struct hwcrec *hwcptr = (struct hwcrec *)q->q_ptr; /* instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   265
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   266
	qprocsoff(q);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   267
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   268
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   269
	if (hwcptr->hwc_enabled) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   270
		struct fbcursor fbcursor;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   271
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   272
		fbcursor.set = FB_CUR_SETCUR;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   273
		fbcursor.enable = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   274
		hwc_set_cursor(hwcptr->screen_dev_t, &fbcursor);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   275
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   276
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   277
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   278
	/* free the per-instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   279
	kmem_free(hwcptr, sizeof (*hwcptr));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   280
	q->q_ptr = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   281
	WR(q)->q_ptr = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   282
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   283
	return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   284
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   285
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   286
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   287
/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   288
 * read queue put procedure.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   289
 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   290
static int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   291
hwcrput(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   292
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   293
	static Firm_event *ev;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   294
	struct hwcrec *hwcptr = (struct hwcrec *)q->q_ptr; /* instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   295
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   296
	switch (mp->b_datap->db_type) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   297
	case M_FLUSH:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   298
		if (*mp->b_rptr & FLUSHW)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   299
			flushq(WR(q), FLUSHDATA);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   300
		if (*mp->b_rptr & FLUSHR)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   301
			flushq(q, FLUSHDATA);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   302
		putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   303
		return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   304
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   305
	case M_DATA:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   306
		ev = (Firm_event *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   307
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   308
		if (ev->id == LOC_X_DELTA) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   309
			int tmpx;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   310
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   311
			/* check for acceleration threshold */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   312
			if (ABS(ev->value) > hwcptr->ctrl.threshold)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   313
				tmpx = hwcptr->cursor_position.x +
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   314
				    ((ev->value * hwcptr->ctrl.num) /
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   315
				    hwcptr->ctrl.den);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   316
			else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   317
				tmpx = hwcptr->cursor_position.x + ev->value;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   318
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   319
			/* bound cursor to screen */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   320
			if (tmpx >= hwcptr->limits.x2) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   321
				if (hwcptr->limits.confined) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   322
					tmpx = hwcptr->limits.x2 - 1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   323
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   324
					/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   325
					 * if the cursor was already at
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   326
					 * the limit just toss event.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   327
					 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   328
					if (hwcptr->cursor_position.x == tmpx) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   329
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   330
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   331
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   332
					hwcptr->cursor_position.x = (short)tmpx;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   333
				} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   334
					/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   335
					 * If we're already on an X
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   336
					 * boundary of the screen, only
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   337
					 * send change border events
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   338
					 * until server has acknowledged
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   339
					 * crossing.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   340
					 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   341
					if (hwcptr->at_border&0x1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   342
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   343
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   344
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   345
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   346
					hwcptr->cursor_position.x =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   347
					    hwcptr->limits.x2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   348
					hwcptr->at_border |= 0x1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   349
				}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   350
			} else if (tmpx < hwcptr->limits.x1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   351
				if (hwcptr->limits.confined) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   352
					if (hwcptr->cursor_position.x ==
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   353
					    hwcptr->limits.x1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   354
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   355
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   356
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   357
					hwcptr->cursor_position.x =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   358
					    hwcptr->limits.x1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   359
				} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   360
					if (hwcptr->at_border&0x1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   361
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   362
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   363
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   364
					hwcptr->cursor_position.x = -1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   365
					hwcptr->at_border |= 0x1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   366
				}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   367
			} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   368
				hwcptr->cursor_position.x = (short)tmpx;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   369
				hwcptr->at_border &= ~0x1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   370
			}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   371
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   372
			if (ev->value) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   373
				ev->id = LOC_X_ABSOLUTE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   374
				ev->value = hwcptr->cursor_position.x;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   375
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   376
				if (hwcptr->hwc_enabled)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   377
					hwc_set_cursor_pos(hwcptr->screen_dev_t,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   378
					    &hwcptr->cursor_position);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   379
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   380
			}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   381
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   382
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   383
		if (ev->id == LOC_Y_DELTA) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   384
			int tmpy;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   385
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   386
			/* need to invert y-axis */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   387
			if (ABS(ev->value) > hwcptr->ctrl.threshold)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   388
				tmpy = hwcptr->cursor_position.y -
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   389
				    ((ev->value * hwcptr->ctrl.num) /
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   390
				    hwcptr->ctrl.den);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   391
			else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   392
				tmpy = hwcptr->cursor_position.y - ev->value;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   393
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   394
			if (tmpy >= hwcptr->limits.y2) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   395
				if (hwcptr->limits.confined) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   396
					tmpy = hwcptr->limits.y2 - 1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   397
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   398
					/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   399
					 * if the cursor was already at
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   400
					 * the limit just toss event.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   401
					 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   402
					if (hwcptr->cursor_position.y == tmpy) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   403
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   404
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   405
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   406
					hwcptr->cursor_position.y = (short)tmpy;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   407
				} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   408
					if (hwcptr->at_border&0x2) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   409
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   410
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   411
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   412
					hwcptr->cursor_position.y =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   413
					    hwcptr->limits.y2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   414
					hwcptr->at_border |= 0x2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   415
				}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   416
			} else if (tmpy < hwcptr->limits.y1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   417
				if (hwcptr->limits.confined) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   418
					if (hwcptr->cursor_position.y ==
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   419
					    hwcptr->limits.y1) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   420
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   421
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   422
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   423
					hwcptr->cursor_position.y =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   424
					    hwcptr->limits.y1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   425
				} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   426
					if (hwcptr->at_border&0x2) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   427
						freemsg(mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   428
						return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   429
					}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   430
					hwcptr->cursor_position.y = -1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   431
					hwcptr->at_border |= 0x2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   432
				}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   433
			} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   434
				hwcptr->cursor_position.y = (short)tmpy;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   435
				hwcptr->at_border &= ~0x2;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   436
			}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   437
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   438
			if (ev->value) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   439
				ev->id = LOC_Y_ABSOLUTE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   440
				ev->value = hwcptr->cursor_position.y;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   441
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   442
				if (hwcptr->hwc_enabled)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   443
					hwc_set_cursor_pos(hwcptr->screen_dev_t,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   444
					    &hwcptr->cursor_position);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   445
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   446
			}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   447
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   448
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   449
		(void) putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   450
		return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   451
	default:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   452
		(void) putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   453
		return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   454
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   455
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   456
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   457
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   458
/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   459
 * Line discipline output queue put procedure: handles M_IOCTL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   460
 * messages.
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   461
 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   462
static int
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   463
hwcwput(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   464
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   465
	switch (mp->b_datap->db_type) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   466
	case M_FLUSH:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   467
		if (*mp->b_rptr & FLUSHW)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   468
			flushq(q, FLUSHDATA);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   469
		if (*mp->b_rptr & FLUSHR)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   470
			flushq(RD(q), FLUSHDATA);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   471
		putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   472
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   473
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   474
	case M_IOCTL:		/* process user ioctl() */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   475
		hwcioctl(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   476
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   477
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   478
	case M_IOCDATA:		/* retrieve ioctl() data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   479
		hwciocdata(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   480
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   481
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   482
	default:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   483
		(void) putnext(q, mp);	/* pass it down the line */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   484
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   485
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   486
	return (0);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   487
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   488
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   489
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   490
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   491
hwcioctl(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   492
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   493
	struct iocblk *iocp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   494
	struct copyreq *cqp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   495
	mblk_t	*tmp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   496
	struct hwc_state *stp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   497
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   498
	iocp = (struct iocblk *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   499
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   500
	switch (iocp->ioc_cmd) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   501
	case HWCGVERSION: {	/* Get the HWC module version */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   502
		int transparent = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   503
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   504
		if (iocp->ioc_count == TRANSPARENT) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   505
			transparent = 1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   506
			cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   507
			cqp->cq_size = sizeof (int);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   508
			cqp->cq_addr = (caddr_t)*(long *)mp->b_cont->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   509
			cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   510
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   511
		if (mp->b_cont)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   512
			freemsg(mp->b_cont); /* over written below */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   513
		if ((mp->b_cont = allocb(sizeof (int), BPRI_MED)) == NULL) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   514
			mp->b_datap->db_type = M_IOCNAK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   515
			iocp->ioc_error = EAGAIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   516
			qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   517
			break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   518
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   519
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   520
		*(int *)mp->b_cont->b_wptr = HWCVERSION;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   521
		mp->b_cont->b_wptr += sizeof (int);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   522
		if (transparent) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   523
			mp->b_cont->b_datap->db_type = M_DATA;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   524
			mp->b_datap->db_type = M_COPYOUT;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   525
			mp->b_wptr = mp->b_rptr + sizeof (struct copyreq);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   526
		} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   527
			mp->b_datap->db_type = M_IOCACK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   528
			iocp->ioc_count = sizeof (int);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   529
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   530
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   531
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   532
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   533
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   534
	case HWCSPOS:		/* Set Cursor Position */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   535
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   536
		COPYIN(q, mp, cqp, sizeof (struct fbcurpos));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   537
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   538
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   539
	case HWCSCURSOR:	/* Set Cursor Image */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   540
	case FBIOSCURSOR:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   541
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   542
		tmp = allocb(sizeof (struct hwc_state), BPRI_MED);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   543
		if (tmp == NULL) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   544
			mp->b_datap->db_type = M_IOCNAK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   545
			iocp->ioc_error = EAGAIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   546
			qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   547
			break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   548
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   549
		tmp->b_wptr += sizeof (struct hwc_state);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   550
		stp = (struct hwc_state *)tmp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   551
		stp->st_state = GETFBCURSOR;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   552
/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   553
	bugid:  4500611 (P1/S1) USB mouse crashed
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   554
*/
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   555
		stp->image = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   556
                stp->mask = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   557
                stp->cmap_red = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   558
                stp->cmap_green = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   559
                stp->cmap_blue = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   560
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   561
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   562
		cqp->cq_private = tmp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   563
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   564
		cqp->cq_addr = (caddr_t)*(uintptr_t *)mp->b_cont->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   565
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   566
#ifdef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   567
		if ((iocp->ioc_flag & DATAMODEL_MASK) != DATAMODEL_NATIVE)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   568
			cqp->cq_size = sizeof (struct fbcursor32);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   569
		else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   570
#endif
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   571
		cqp->cq_size = sizeof (struct fbcursor);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   572
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   573
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   574
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   575
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   576
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   577
		mp->b_wptr = mp->b_rptr + sizeof (struct copyreq);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   578
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   579
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   580
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   581
	case HWCSSPEED:		/* Set Cursor Acceleration */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   582
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   583
		COPYIN(q, mp, cqp, sizeof (struct msctrl));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   584
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   585
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   586
	case HWCSSCREEN:	/* Set Framebuffer */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   587
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   588
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   589
#ifdef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   590
		if ((iocp->ioc_flag & DATAMODEL_MASK) != DATAMODEL_NATIVE) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   591
			COPYIN(q, mp, cqp, sizeof (dev32_t));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   592
		} else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   593
#endif
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   594
		{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   595
			COPYIN(q, mp, cqp, sizeof (dev_t));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   596
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   597
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   598
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   599
	case HWCENABLE:		/* Enable cursor */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   600
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   601
		COPYIN(q, mp, cqp, sizeof (int));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   602
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   603
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   604
	case HWCSBOUND:		/* Set Cursor Boundary */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   605
		CKTRANSPARENT(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   606
		COPYIN(q, mp, cqp, sizeof (struct hwc_limits));
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   607
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   608
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   609
	default:		/* pass it down the line */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   610
		(void) putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   611
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   612
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   613
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   614
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   615
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   616
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   617
hwciocdata(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   618
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   619
	struct iocblk *iocp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   620
	struct hwcrec *hwcptr = (struct hwcrec *)q->q_ptr; /* instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   621
	caddr_t data;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   622
	struct copyresp *csp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   623
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   624
	csp = (struct copyresp *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   625
	iocp = (struct iocblk *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   626
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   627
	if (mp->b_cont != NULL)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   628
		data = (caddr_t)mp->b_cont->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   629
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   630
	switch (csp->cp_cmd) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   631
	case HWCGVERSION:	/* Get hwc version number */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   632
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   633
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   634
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   635
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   636
	case HWCSPOS:		/* Set Cursor Position */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   637
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   638
		hwc_spos(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   639
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   640
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   641
	case HWCSCURSOR:	/* Set Cursor Image */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   642
	case FBIOSCURSOR:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   643
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   644
		hwc_scursor(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   645
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   646
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   647
	case HWCSSPEED:		/* Set Cursor Acceleration */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   648
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   649
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   650
		hwcptr->ctrl = *(struct msctrl *)data;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   651
		if (!hwcptr->ctrl.den)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   652
			hwcptr->ctrl.den = 1;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   653
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   654
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   655
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   656
	case HWCSSCREEN:	/* Set Framebuffer */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   657
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   658
#ifdef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   659
		if ((iocp->ioc_flag & DATAMODEL_MASK) != DATAMODEL_NATIVE)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   660
			hwcptr->screen_dev_t = expldev(*(dev32_t *)data);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   661
		else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   662
#endif
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   663
			hwcptr->screen_dev_t = *(dev_t *)data;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   664
		hwcptr->at_border = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   665
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   666
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   667
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   668
	case HWCENABLE:		/* Enable cursor */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   669
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   670
		hwcptr->hwc_enabled = *(int *)data;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   671
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   672
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   673
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   674
	case HWCSBOUND:		/* Set Cursor Boundary */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   675
		CK_RVAL(csp,mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   676
		hwcptr->limits = *(struct hwc_limits *)data;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   677
		hwcptr->at_border = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   678
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   679
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   680
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   681
	default:		/* pass it down the line */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   682
		(void) putnext(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   683
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   684
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   685
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   686
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   687
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   688
hwc_spos(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   689
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   690
	struct iocblk *iocp = (struct iocblk *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   691
	struct hwcrec *hwcptr = (struct hwcrec *)q->q_ptr; /* instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   692
	mblk_t *xmp, *ymp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   693
	Firm_event *ev;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   694
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   695
	hwcptr->cursor_position = *(struct fbcurpos *)mp->b_cont->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   696
	hwcptr->at_border = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   697
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   698
	if (hwcptr->hwc_enabled) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   699
		hwc_set_cursor_pos(hwcptr->screen_dev_t,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   700
		    &hwcptr->cursor_position);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   701
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   702
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   703
	iocp->ioc_error = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   704
	iocp->ioc_rval = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   705
	mp->b_datap->db_type = M_IOCACK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   706
	iocp->ioc_count = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   707
	if (mp->b_cont)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   708
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   709
	mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   710
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   711
	xmp = allocb(sizeof (Firm_event), BPRI_MED);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   712
	if (xmp == NULL) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   713
		mp->b_datap->db_type = M_IOCNAK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   714
		iocp->ioc_error = EAGAIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   715
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   716
		return;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   717
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   718
	xmp->b_datap->db_type = M_DATA;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   719
	ev = (Firm_event *)xmp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   720
	ev->id = LOC_X_ABSOLUTE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   721
	ev->value = hwcptr->cursor_position.x;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   722
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   723
	uniqtime32(&ev->time);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   724
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   725
	xmp->b_wptr = xmp->b_rptr + sizeof (Firm_event);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   726
	ymp = allocb(sizeof (Firm_event), BPRI_MED);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   727
	if (ymp == NULL) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   728
		mp->b_datap->db_type = M_IOCNAK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   729
		iocp->ioc_error = EAGAIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   730
		freeb(xmp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   731
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   732
		return;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   733
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   734
	ymp->b_datap->db_type = M_DATA;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   735
	ev = (Firm_event *)ymp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   736
	ev->id = LOC_Y_ABSOLUTE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   737
	ev->value = hwcptr->cursor_position.y;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   738
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   739
	uniqtime32(&ev->time);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   740
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   741
	ymp->b_wptr = ymp->b_rptr + sizeof (Firm_event);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   742
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   743
	qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   744
	qreply(q, xmp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   745
	qreply(q, ymp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   746
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   747
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   748
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   749
hwc_state_free(struct copyresp *s)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   750
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   751
#ifdef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   752
        STRUCT_HANDLE(fbcursor, fbc);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   753
#endif
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   754
        if (s->cp_cmd == HWCSCURSOR || s->cp_cmd == FBIOSCURSOR) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   755
        struct hwc_state *stp = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   756
        if (s->cp_private != NULL)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   757
        	stp = (struct hwc_state *) s->cp_private->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   758
	if (stp != NULL)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   759
	{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   760
	if (stp->image)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   761
	  kmem_free(stp->image, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   762
	if (stp->mask)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   763
	  kmem_free(stp->mask, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   764
	if (stp->cmap_red)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   765
	  kmem_free(stp->cmap_red, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   766
	if (stp->cmap_green)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   767
	  kmem_free(stp->cmap_green, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   768
	if (stp->cmap_blue)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   769
	  kmem_free(stp->cmap_blue, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   770
/* bugid: 4500611 remove kmem_free for stp */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   771
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   772
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   773
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   774
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   775
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   776
hwc_scursor(queue_t *q, mblk_t *mp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   777
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   778
	struct iocblk *iocp = (struct iocblk *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   779
	struct copyresp *csp = (struct copyresp *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   780
	struct hwcrec *hwcptr = (struct hwcrec *)q->q_ptr; /* instance data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   781
	struct copyreq *cqp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   782
	struct hwc_state *stp;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   783
#ifdef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   784
	STRUCT_HANDLE(fbcursor, fbc);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   785
#endif
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   786
	int wbytes;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   787
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   788
	stp = (struct hwc_state *)csp->cp_private->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   789
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   790
	switch (stp->st_state) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   791
	case GETFBCURSOR:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   792
#ifndef _SYSCALL32_IMPL
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   793
		stp->fbcursor = *(struct fbcursor *)mp->b_cont->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   794
#else
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   795
		STRUCT_SET_HANDLE(fbc, iocp->ioc_flag,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   796
		    (void *)mp->b_cont->b_rptr);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   797
		stp->fbcursor.set = STRUCT_FGET(fbc, set);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   798
		stp->fbcursor.enable = STRUCT_FGET(fbc, enable);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   799
		stp->fbcursor.pos = STRUCT_FGET(fbc, pos);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   800
		stp->fbcursor.hot = STRUCT_FGET(fbc, hot);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   801
		stp->fbcursor.cmap.index = STRUCT_FGET(fbc, cmap.index);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   802
		stp->fbcursor.cmap.count = STRUCT_FGET(fbc, cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   803
		stp->fbcursor.cmap.red = STRUCT_FGETP(fbc, cmap.red);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   804
		stp->fbcursor.cmap.green = STRUCT_FGETP(fbc, cmap.green);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   805
		stp->fbcursor.cmap.blue = STRUCT_FGETP(fbc, cmap.blue);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   806
		stp->fbcursor.size = STRUCT_FGET(fbc, size);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   807
		stp->fbcursor.image = STRUCT_FGETP(fbc, image);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   808
		stp->fbcursor.mask = STRUCT_FGETP(fbc, mask);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   809
#endif /* _SYSCALL32_IMPL */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   810
		if (stp->fbcursor.set & FB_CUR_SETSHAPE) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   811
			/* compute cursor bitmap bytes */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   812
			wbytes = ((stp->fbcursor.size.x + 31) >> 5) *
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   813
			    (int)sizeof (uint32_t);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   814
			stp->count = stp->fbcursor.size.y * wbytes;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   815
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   816
			/* allocate necessary bytes for image and mask */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   817
			stp->image = kmem_alloc(stp->count, KM_SLEEP);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   818
			stp->mask = kmem_alloc(stp->count, KM_SLEEP);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   819
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   820
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   821
		if (stp->fbcursor.set & FB_CUR_SETCMAP) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   822
			/* allocate necessary bytes for cmap structs */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   823
			stp->cmap_red =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   824
			    kmem_alloc(stp->fbcursor.cmap.count, KM_SLEEP);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   825
			stp->cmap_green =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   826
			    kmem_alloc(stp->fbcursor.cmap.count, KM_SLEEP);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   827
			stp->cmap_blue =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   828
			    kmem_alloc(stp->fbcursor.cmap.count, KM_SLEEP);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   829
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   830
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   831
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   832
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   833
		/* Reuse M_IOCDATA to copyin data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   834
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   835
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   836
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   837
		if (stp->fbcursor.set & FB_CUR_SETSHAPE) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   838
			cqp->cq_size = stp->count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   839
			cqp->cq_addr = stp->fbcursor.image;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   840
			stp->st_state = GETIMAGE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   841
		} else if (stp->fbcursor.set & FB_CUR_SETCMAP) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   842
			cqp->cq_size = stp->fbcursor.cmap.count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   843
			cqp->cq_addr = (char *)stp->fbcursor.cmap.red;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   844
			stp->st_state = GETCMAPRED;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   845
		} else {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   846
			goto done;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   847
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   848
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   849
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   850
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   851
	case GETIMAGE: /* compute cursor bitmap bytes */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   852
		wbytes = ((stp->fbcursor.size.x + 31) >> 5) *
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   853
		    (int)sizeof (uint_t);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   854
		stp->count = stp->fbcursor.size.y * wbytes;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   855
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   856
		/* copy the image to state structure */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   857
		bcopy(mp->b_cont->b_rptr, stp->image, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   858
		stp->fbcursor.image = stp->image;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   859
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   860
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   861
		/* Reuse M_IOCDATA to copyin data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   862
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   863
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   864
		cqp->cq_size = stp->count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   865
		cqp->cq_addr = stp->fbcursor.mask;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   866
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   867
		stp->st_state = GETMASK;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   868
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   869
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   870
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   871
	case GETMASK:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   872
		/* copy the mask to state structure */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   873
		bcopy(mp->b_cont->b_rptr, stp->mask, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   874
		stp->fbcursor.mask = stp->mask;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   875
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   876
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   877
		/* Reuse M_IOCDATA to copyin data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   878
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   879
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   880
		if (!(stp->fbcursor.set & FB_CUR_SETCMAP))
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   881
			goto done;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   882
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   883
		cqp->cq_size = stp->fbcursor.cmap.count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   884
		cqp->cq_addr = (caddr_t)stp->fbcursor.cmap.red;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   885
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   886
		stp->st_state = GETCMAPRED;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   887
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   888
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   889
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   890
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   891
	case GETCMAPRED:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   892
		/* copy the red cmap to state structure */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   893
		bcopy(mp->b_cont->b_rptr, stp->cmap_red,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   894
		    stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   895
		stp->fbcursor.cmap.red = (unsigned char *)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   896
		    stp->cmap_red;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   897
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   898
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   899
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   900
		/* Reuse M_IOCDATA to copyin data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   901
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   902
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   903
		cqp->cq_size = stp->fbcursor.cmap.count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   904
		cqp->cq_addr = (caddr_t)stp->fbcursor.cmap.green;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   905
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   906
		stp->st_state = GETCMAPGREEN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   907
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   908
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   909
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   910
	case GETCMAPGREEN:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   911
		/* copy the green cmap to state structure */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   912
		bcopy(mp->b_cont->b_rptr, stp->cmap_green,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   913
		    stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   914
		stp->fbcursor.cmap.green = (unsigned char *)stp->cmap_green;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   915
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   916
		freemsg(mp->b_cont);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   917
		mp->b_cont = NULL;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   918
		/* Reuse M_IOCDATA to copyin data */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   919
		mp->b_datap->db_type = M_COPYIN;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   920
		cqp = (struct copyreq *)mp->b_rptr;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   921
		cqp->cq_size = stp->fbcursor.cmap.count;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   922
		cqp->cq_addr = (caddr_t)stp->fbcursor.cmap.blue;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   923
		cqp->cq_flag = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   924
		stp->st_state = GETCMAPBLUE;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   925
		qreply(q, mp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   926
		break;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   927
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   928
	case GETCMAPBLUE:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   929
		/* copy the blue cmap to state structure */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   930
		bcopy(mp->b_cont->b_rptr, stp->cmap_blue,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   931
		    stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   932
		stp->fbcursor.cmap.blue = stp->cmap_blue;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   933
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   934
	done:
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   935
		/*
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   936
		 * TODO: For some reason the FB_CUR_SETPOS bit is
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   937
		 * set but there is junk in fbcursor.pos.x and
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   938
		 * fbcursor.pos.y
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   939
		 */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   940
		if (stp->fbcursor.set & FB_CUR_SETPOS) {
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   941
			hwcptr->cursor_position.x =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   942
			    stp->fbcursor.pos.x;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   943
			hwcptr->cursor_position.y =
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   944
			    stp->fbcursor.pos.y;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   945
		}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   946
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   947
		hwcptr->at_border = 0;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   948
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   949
		if (hwcptr->hwc_enabled)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   950
			hwc_set_cursor(hwcptr->screen_dev_t,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   951
			    &stp->fbcursor);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   952
#endif /* _DDICT */
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   953
		                
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   954
		if (stp->image)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   955
                        kmem_free(stp->image, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   956
                if (stp->mask)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   957
                        kmem_free(stp->mask, stp->count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   958
                if (stp->cmap_red)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   959
                        kmem_free(stp->cmap_red, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   960
                if (stp->cmap_green)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   961
                        kmem_free(stp->cmap_green, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   962
                if (stp->cmap_blue)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   963
                        kmem_free(stp->cmap_blue, stp->fbcursor.cmap.count);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   964
                freemsg(csp->cp_private);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   965
		COPYACK(q, mp, iocp);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   966
	}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   967
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   968
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   969
#ifndef _DDICT
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   970
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   971
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   972
hwc_set_cursor_pos(dev_t dev, struct fbcurpos *cp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   973
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   974
	int rval;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   975
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   976
	(void) cdev_ioctl(dev, FBIOSCURPOS, (uintptr_t)cp,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   977
	    (FREAD | FWRITE | FKIOCTL | FNATIVE), ddi_get_cred(), &rval);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   978
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   979
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   980
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   981
static void
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   982
hwc_set_cursor(dev_t dev, struct fbcursor *cp)
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   983
{
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   984
	int rval;
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   985
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   986
	(void) cdev_ioctl(dev, FBIOSCURSOR, (uintptr_t)cp,
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   987
	    (FREAD | FWRITE | FKIOCTL | FNATIVE), ddi_get_cred(), &rval);
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   988
}
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   989
0cce41833817 6736350 move hwc from xc to open-src
Niveditha Rau <Niveditha.Rau@Sun.COM>
parents:
diff changeset
   990
#endif /* _DDICT */