aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/emgd/emgd/include/utils.h
blob: bb1fd1a48e983a174887db7dc84d5a8823000f55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/* -*- pse-c -*-
 *-----------------------------------------------------------------------------
 * Filename: utils.h
 * $Revision: 1.6 $
 *-----------------------------------------------------------------------------
 * Copyright © 2002-2010, Intel Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
 *
 *-----------------------------------------------------------------------------
 * Description:
 *  
 *-----------------------------------------------------------------------------
 */

#ifndef _UTILS_H_
#define _UTILS_H_

#include <config.h>
#include <igd_mode.h>
#include <general.h>
#include <mode.h>

/* Get the MMIO pointer for a display context */
#define MMIO(dsp) \
 EMGD_MMIO((((igd_display_context_t *)dsp)->context->device_context.virt_mmadr))

/* Get the 2nd MMIO pointer for a display context */
#define MMIO_SDVO(dsp) \
 EMGD_MMIO(((igd_display_context_t *)dsp)->context->device_context.virt_mmadr_sdvo)

/* Definition: value = READ_MMIO_REG(igd_display_context_t *, reg) */
#define READ_MMIO_REG(dsp, reg) \
	EMGD_READ32( MMIO(dsp) +(reg) )

/* Definition: WRITE_MMIO_REG(igd_display_context_t *, reg, value) */
#define WRITE_MMIO_REG(dsp, reg, value) \
	EMGD_WRITE32(value, ( MMIO(dsp) + (reg) ) )

/* Definition:WRITE_MMIO_REG_BITS(igd_display_context_t *, reg, value, mask) */
#define WRITE_MMIO_REG_BITS(dsp, reg, data, mask) \
{                                                 \
	unsigned long tmp;                            \
	tmp = READ_MMIO_REG((dsp), (reg));            \
	tmp &= (~(mask));                             \
	tmp |= ((data) & (mask));                     \
	WRITE_MMIO_REG((dsp), (reg), (tmp));          \
}

#define PORT_TYPE(d) (PORT(d, (d->port_number))->port_type)
#define PORT_TYPE_DH(dh) \
	(PORT(dh, (((igd_display_context_t *)dh)->port_number))->port_type)

#ifdef CONFIG_TNC
/* Based on display port determine which mmio base to use:
 *       port_type == SDVO ==> use 0:3:0 device mmio
 *       port_type == LVDS ==> use 0:2:0 device mmio
 *       port_type == LPC  ==> use 0:31:0 device mmio
 */
#define MMIO_TNC(port_type) EMGD_MMIO(get_mmio_tnc(port_type))

#define READ_MMIO_REG_TNC(pt, reg) read_mmio_reg_tnc(pt, reg)
#define WRITE_MMIO_REG_TNC(pt, reg, value) write_mmio_reg_tnc(pt, reg, value)

/* Defined in micro_mode_tnc.c */
extern unsigned char *get_mmio_tnc(unsigned long port_type);
extern unsigned long read_mmio_reg_tnc(unsigned long port_type,
	unsigned long reg);
extern void write_mmio_reg_tnc(unsigned long port_type, unsigned long reg,
	unsigned long value);
#endif


/*
 * These are temporary macros used only within this header.
 * Individual config options use these macros to generate macros that look
 * like this:
 *
 * If CONFIG_FOO is defined
 *  OPT_FOO_SYMBOL(a)
 *  OPT_FOO_VALUE(a, b)
 *  OPT_FOO_VOID_CALL(fn)
 *  OPT_FOO_CALL(fn)
 */
#define OPTIONAL_VOID_CALL(fn) fn
#define OPTIONAL_CALL(fn)			\
	{								\
		int __ret;					\
		__ret = fn;					\
		if(__ret) {					\
			EMGD_ERROR_EXIT("EXIT");	\
			return __ret;			\
		}							\
	}

#define OPTIONAL_CALL_RET(ret, fn)      (ret) = (fn)

/*
 * Debug call macro should be used to call debug printing functions
 * that will only exist in debug builds.
 */
#ifdef DEBUG_BUILD_TYPE
#define OPT_DEBUG_SYMBOL(sym)      sym
#define OPT_DEBUG_VALUE(val, alt)  val
#define OPT_DEBUG_VOID_CALL(fn)    OPTIONAL_VOID_CALL(fn)
#define OPT_DEBUG_CALL(fn)         OPTIONAL_CALL(fn)
#define OPT_DEBUG_INLINE
#else
#define OPT_DEBUG_SYMBOL(sym)
#define OPT_DEBUG_VALUE(val, alt)  alt
#define OPT_DEBUG_VOID_CALL(fn)
#define OPT_DEBUG_CALL(fn)
#define OPT_DEBUG_INLINE           static __inline
#endif

/*
 * Micro Symbols are only used when CONFIG_MICRO is not defined.
 */
#ifndef CONFIG_MICRO
#define OPT_MICRO_SYMBOL(sym)         sym
#define OPT_MICRO_VALUE(val, alt)     val
#define OPT_MICRO_VOID_CALL(fn)       OPTIONAL_VOID_CALL(fn)
#define OPT_MICRO_CALL(fn)            OPTIONAL_CALL(fn)
#define OPT_MICRO_CALL_RET(ret, fn)   OPTIONAL_CALL_RET(ret, fn)
#else
#define OPT_MICRO_SYMBOL(sym)
#define OPT_MICRO_VALUE(val, alt)  alt
#define OPT_MICRO_VOID_CALL(fn)
#define OPT_MICRO_CALL(fn)
#define OPT_MICRO_CALL_RET(ret, fn)
#endif


#ifdef CONFIG_PLB
#define DISPATCH_PLB(p) {PCI_DEVICE_ID_VGA_PLB, p},
#else
#define DISPATCH_PLB(p)
#endif
#ifdef CONFIG_TNC
#define DISPATCH_TNC(p) {PCI_DEVICE_ID_VGA_TNC, p},
#define DISPATCH_TNC_A0(p) {PCI_DEVICE_ID_VGA_TNC_A0, p},
#define DISPATCH_LNC(p) {PCI_DEVICE_ID_VGA_LNC, p},
#else
#define DISPATCH_TNC(p)
#define DISPATCH_TNC_A0(p)
#define DISPATCH_LNC(p)
#endif
#define DISPATCH_END {0, NULL}


#endif // _UTILS_H_

/*----------------------------------------------------------------------------
 * File Revision History
 * $Id: utils.h,v 1.6 2010/08/06 17:50:21 rclovrie Exp $
 * $Source: /nfs/fm/proj/eia/cvsroot/koheo/linux/egd_drm/emgd/include/utils.h,v $
 *----------------------------------------------------------------------------
 */