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
170
171
172
173
174
175
176
177
178
|
/*
* Copyright (c) 2009, Intel Corporation.
* All Rights Reserved.
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_AGPGART_IMPL_H
#define _SYS_AGPGART_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#define AGPGART_MAX_INSTANCES 1
#define AGP_MAXKEYS 256
#define AGPGART_DEVNODE "agpgart"
/*
* The values of type agp_arc_type_t are used as indexes into arc_name
* in agp_kstat.c.
* So if agp_arc_type_t's values are changed in the future, the content
* of arc_name must be changed accordingly.
*/
enum agp_arc_type {
ARC_IGD810 = 0,
ARC_IGD830 = 1,
ARC_INTELAGP = 2,
ARC_AMD64AGP = 3,
ARC_UNKNOWN = 5
};
typedef enum agp_arc_type agp_arc_type_t;
/* linked list structure of multiple agp gart devices access handles */
typedef struct amd64_gart_dev_list {
ldi_handle_t gart_devhdl;
struct amd64_gart_dev_list *next;
} amd64_gart_dev_list_t;
typedef struct amd64_garts_dev {
int gart_device_num;
amd64_gart_dev_list_t *gart_dev_list_head;
} amd64_garts_dev_t;
/*
* AGP target and master device register their config space access
* interface here.
* In AMD64, gart_device_num is the number of hostbridge (device(1100, 1022))
* refer to <<Bios and Kernel Developer's Guide for AMD athlon64 and operton>>
*/
typedef struct agp_registered_dev {
amd64_garts_dev_t agprd_cpugarts;
ldi_handle_t agprd_targethdl;
ldi_handle_t agprd_masterhdl;
agp_arc_type_t agprd_arctype; /* system types */
} agp_registered_dev_t;
/*
* If the OS have direct mapping support for mapping physical page frames
* directly to user address, we use this struct for memory
* allocation.
*/
typedef struct agp_pmem_handle {
devmap_pmem_cookie_t pmem_cookie;
} agp_pmem_handle_t;
/*
* This struct is used for DDI-compliant memory allocations.
*/
typedef struct agp_kmem_handle {
ddi_dma_handle_t kmem_handle;
ddi_dma_cookie_t kmem_dcookie;
uint32_t kmem_cookies_num;
caddr_t kmem_kvaddr;
size_t kmem_reallen;
ddi_acc_handle_t kmem_acchdl;
} agp_kmem_handle_t;
typedef struct keytable_ent {
int kte_type; /* agp memory type */
int kte_key; /* memory key */
uint32_t kte_pgoff; /* aperture offset bound in pages */
pgcnt_t kte_pages; /* user-requested size in pages */
int kte_bound; /* bound to gart table */
void *kte_memhdl; /* agp_kmem or agp_pmem handle */
pfn_t *kte_pfnarray; /* page frame numbers allocated */
int kte_refcnt; /* reference count */
} keytable_ent_t;
typedef struct key_list {
int key_idx;
struct key_list *next;
} key_list_t;
/*
* for kstat
*/
typedef struct agp_kern_info {
uint32_t agpki_mdevid;
agp_version_t agpki_mver;
uint32_t agpki_mstatus;
size_t agpki_presize; /* valid only for IGD, in KB */
uint32_t agpki_tdevid;
agp_version_t agpki_tver;
uint32_t agpki_tstatus;
uint64_t agpki_aperbase;
uint32_t agpki_apersize; /* in MB */
} agp_kern_info_t;
#ifdef _MULTI_DATAMODEL
typedef struct _agp_info32 {
agp_version_t agpi32_version;
uint32_t agpi32_devid; /* device VID + DID */
uint32_t agpi32_mode; /* mode of bridge */
uint32_t agpi32_aperbase; /* base of aperture */
uint32_t agpi32_apersize; /* in MB */
uint32_t agpi32_pgtotal; /* max number of pages */
uint32_t agpi32_pgsystem; /* same as pg_total */
uint32_t agpi32_pgused; /* pages consumed */
} agp_info32_t;
#endif /* _MULTI_DATAMODEL */
struct list_head {
struct list_head *next, *prev;
struct igd_gtt_seg *gttseg;
};
typedef struct agpgart_softstate {
dev_info_t *asoft_dip;
kmutex_t asoft_instmutex;
agp_kern_info_t asoft_info;
int asoft_opened; /* 0 not opened, non-0 opened */
int asoft_acquired; /* 0 released, 1 acquired */
int asoft_agpen; /* 0 disbaled, 1 enabled */
pid_t asoft_curpid; /* the process accquiring gart */
uint32_t asoft_mode; /* agp mode be set */
uint32_t asoft_pgtotal; /* total available pages */
uint32_t asoft_pgused; /* pages already used */
/* resource handles */
ldi_ident_t asoft_li; /* for ldi ops */
keytable_ent_t *asoft_table; /* key table for all allocated table */
ddi_dma_handle_t gart_dma_handle; /* for GATT table */
ddi_acc_handle_t gart_dma_acc_handle; /* for GATT table */
/* gart table info */
uint64_t gart_pbase; /* gart table physical address */
caddr_t gart_vbase; /* kernel-vir addr for GATT table */
size_t gart_size; /* the size of aperture in megabytes */
/* all registered agp device in here */
agp_registered_dev_t asoft_devreg;
kstat_t *asoft_ksp;
} agpgart_softstate_t;
typedef struct agpgart_ctx {
offset_t actx_off;
agpgart_softstate_t *actx_sc;
} agpgart_ctx_t;
#define KMEMP(p) ((agp_kmem_handle_t *)p)
#define PMEMP(p) ((agp_pmem_handle_t *)p)
int agp_init_kstats(agpgart_softstate_t *);
void agp_fini_kstats(agpgart_softstate_t *);
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_AGPGART_IMPL_H */
|