summaryrefslogtreecommitdiff
path: root/linux-core/xgi_drv.h
blob: 1610295041f28044049402009219e347615f341d (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

/****************************************************************************
 * Copyright (C) 2003-2006 by XGI Technology, Taiwan.			
 *																			*
 * All Rights Reserved.														*
 *																			*
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the	
 * "Software"), to deal in the Software without restriction, including	
 * without limitation on the rights to use, copy, modify, merge,	
 * publish, distribute, sublicense, and/or sell copies of the Software,	
 * and to permit persons to whom the Software is furnished to do so,	
 * subject to the following conditions:					
 *																			*
 * The above copyright notice and this permission notice (including the	
 * next paragraph) shall be included in all copies or substantial	
 * portions of the Software.						
 *																			*
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,	
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF	
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND		
 * NON-INFRINGEMENT.  IN NO EVENT SHALL XGI AND/OR			
 * ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,		
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,		
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER			
 * DEALINGS IN THE SOFTWARE.												
 ***************************************************************************/

#ifndef _XGI_DRV_H_
#define _XGI_DRV_H_

#include "drmP.h"
#include "drm.h"

#define DRIVER_AUTHOR		"Andrea Zhang <andrea_zhang@macrosynergy.com>"

#define DRIVER_NAME		"xgi"
#define DRIVER_DESC		"XGI XP5 / XP10 / XG47"
#define DRIVER_DATE		"20070721"

#define DRIVER_MAJOR		0
#define DRIVER_MINOR		9
#define DRIVER_PATCHLEVEL	0

#include "xgi_cmdlist.h"
#include "xgi_drm.h"

struct xgi_aperture {
	dma_addr_t base;
	unsigned int size;
};

struct xgi_mem_block {
	struct list_head list;
	unsigned long offset;
	unsigned long size;
	DRMFILE filp;

	unsigned int owner;
};

struct xgi_mem_heap {
	struct list_head free_list;
	struct list_head used_list;
	struct list_head sort_list;
	unsigned long max_freesize;

	bool initialized;
};

struct xgi_info {
	struct drm_device *dev;

	bool bootstrap_done;

	/* physical characteristics */
	struct xgi_aperture mmio;
	struct xgi_aperture fb;
	struct xgi_aperture pcie;

	struct drm_map *mmio_map;
	struct drm_map *pcie_map;
	struct drm_map *fb_map;

	/* look up table parameters */
	struct drm_dma_handle *lut_handle;
	unsigned int lutPageSize;

	struct xgi_mem_heap fb_heap;
	struct xgi_mem_heap pcie_heap;

	struct semaphore fb_sem;
	struct semaphore pcie_sem;

	struct xgi_cmdring_info cmdring;
};

enum PcieOwner {
	PCIE_2D = 0,
	/*
	   PCIE_3D should not begin with 1,
	   2D alloc pcie memory will use owner 1.
	 */
	PCIE_3D = 11,		/*vetex buf */
	PCIE_3D_CMDLIST = 12,
	PCIE_3D_SCRATCHPAD = 13,
	PCIE_3D_TEXTURE = 14,
	PCIE_INVALID = 0x7fffffff
};


extern struct kmem_cache *xgi_mem_block_cache;
extern struct xgi_mem_block *xgi_mem_alloc(struct xgi_mem_heap * heap,
	unsigned long size, enum PcieOwner owner);
extern int xgi_mem_free(struct xgi_mem_heap * heap, unsigned long offset,
	DRMFILE filp);
extern int xgi_mem_heap_init(struct xgi_mem_heap * heap, unsigned int start,
	unsigned int end);
extern void xgi_mem_heap_cleanup(struct xgi_mem_heap * heap);

extern int xgi_fb_heap_init(struct xgi_info * info);

extern int xgi_fb_alloc(struct xgi_info * info, struct xgi_mem_alloc * alloc,
	DRMFILE filp);

extern int xgi_fb_free(struct xgi_info * info, unsigned long offset,
	DRMFILE filp);

extern int xgi_pcie_heap_init(struct xgi_info * info);
extern void xgi_pcie_lut_cleanup(struct xgi_info * info);

extern int xgi_pcie_alloc(struct xgi_info * info,
			  struct xgi_mem_alloc * alloc, DRMFILE filp);

extern int xgi_pcie_free(struct xgi_info * info, unsigned long offset,
	DRMFILE filp);

extern void *xgi_find_pcie_virt(struct xgi_info * info, u32 address);

extern void xgi_pcie_free_all(struct xgi_info *, DRMFILE);
extern void xgi_fb_free_all(struct xgi_info *, DRMFILE);

extern int xgi_fb_alloc_ioctl(DRM_IOCTL_ARGS);
extern int xgi_fb_free_ioctl(DRM_IOCTL_ARGS);
extern int xgi_pcie_alloc_ioctl(DRM_IOCTL_ARGS);
extern int xgi_pcie_free_ioctl(DRM_IOCTL_ARGS);
extern int xgi_ge_reset_ioctl(DRM_IOCTL_ARGS);
extern int xgi_dump_register_ioctl(DRM_IOCTL_ARGS);
extern int xgi_restore_registers_ioctl(DRM_IOCTL_ARGS);
extern int xgi_submit_cmdlist_ioctl(DRM_IOCTL_ARGS);
extern int xgi_test_rwinkernel_ioctl(DRM_IOCTL_ARGS);
extern int xgi_state_change_ioctl(DRM_IOCTL_ARGS);

#endif