xref: /titanic_50/usr/src/uts/common/sys/agp/agpgart_impl.h (revision ba7866cd2cbdf574f47d4e38a1301b90744dd677)
1 /*
2  * Copyright (c) 2009, Intel Corporation.
3  * All Rights Reserved.
4  */
5 
6 /*
7  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
8  * Use is subject to license terms.
9  */
10 
11 #ifndef	_SYS_AGPGART_IMPL_H
12 #define	_SYS_AGPGART_IMPL_H
13 
14 #ifdef __cplusplus
15 extern "C" {
16 #endif
17 
18 
19 #ifdef _KERNEL
20 
21 #define	AGPGART_MAX_INSTANCES	1
22 #define	AGP_MAXKEYS		256
23 #define	AGPGART_DEVNODE		"agpgart"
24 
25 /*
26  * The values of type agp_arc_type_t are used as indexes into arc_name
27  * in agp_kstat.c.
28  * So if agp_arc_type_t's values are changed in the future, the content
29  * of arc_name must be changed accordingly.
30  */
31 enum agp_arc_type {
32 	ARC_IGD810 = 0,
33 	ARC_IGD830 = 1,
34 	ARC_INTELAGP = 2,
35 	ARC_AMD64AGP = 3,
36 	ARC_UNKNOWN = 5
37 };
38 typedef enum agp_arc_type agp_arc_type_t;
39 
40 /* linked list structure of multiple agp gart devices access handles */
41 typedef struct	amd64_gart_dev_list {
42 	ldi_handle_t			gart_devhdl;
43 	struct	amd64_gart_dev_list	*next;
44 } amd64_gart_dev_list_t;
45 
46 typedef struct amd64_garts_dev {
47 	int			gart_device_num;
48 	amd64_gart_dev_list_t	*gart_dev_list_head;
49 } amd64_garts_dev_t;
50 
51 /*
52  * AGP target and master device register their config space access
53  * interface here.
54  * In AMD64, gart_device_num is the number of hostbridge (device(1100, 1022))
55  * refer to <<Bios and Kernel Developer's Guide for AMD athlon64 and operton>>
56  */
57 typedef struct agp_registered_dev {
58 	amd64_garts_dev_t	agprd_cpugarts;
59 	ldi_handle_t		agprd_targethdl;
60 	ldi_handle_t		agprd_masterhdl;
61 	agp_arc_type_t		agprd_arctype; /* system types */
62 } agp_registered_dev_t;
63 
64 /*
65  * If the OS have direct mapping support for mapping physical page frames
66  * directly to user address, we use this struct for memory
67  * allocation.
68  */
69 typedef struct agp_pmem_handle {
70 	devmap_pmem_cookie_t pmem_cookie;
71 } agp_pmem_handle_t;
72 
73 /*
74  * This struct is used for DDI-compliant memory allocations.
75  */
76 typedef struct agp_kmem_handle {
77 	ddi_dma_handle_t	kmem_handle;
78 	ddi_dma_cookie_t	kmem_dcookie;
79 	uint32_t		kmem_cookies_num;
80 	caddr_t			kmem_kvaddr;
81 	size_t			kmem_reallen;
82 	ddi_acc_handle_t	kmem_acchdl;
83 } agp_kmem_handle_t;
84 
85 typedef struct keytable_ent {
86 	int		kte_type; 	/* agp memory type */
87 	int		kte_key;	/* memory key */
88 	uint32_t	kte_pgoff;	/* aperture offset bound in pages */
89 	pgcnt_t		kte_pages;	/* user-requested size in pages */
90 	int		kte_bound;	/* bound to gart table */
91 	void		*kte_memhdl;	/* agp_kmem or agp_pmem handle */
92 	pfn_t		*kte_pfnarray;	/* page frame numbers allocated */
93 	int	kte_refcnt;	/* reference count */
94 } keytable_ent_t;
95 
96 typedef struct key_list {
97 	int	key_idx;
98 	struct	key_list *next;
99 } key_list_t;
100 
101 /*
102  * for kstat
103  */
104 typedef struct agp_kern_info {
105 	uint32_t	agpki_mdevid;
106 	agp_version_t	agpki_mver;
107 	uint32_t	agpki_mstatus;
108 	size_t		agpki_presize;	/* valid only for IGD, in KB */
109 	uint32_t	agpki_tdevid;
110 	agp_version_t	agpki_tver;
111 	uint32_t	agpki_tstatus;
112 	uint64_t	agpki_aperbase;
113 	uint32_t	agpki_apersize;	/* in MB */
114 } agp_kern_info_t;
115 
116 #ifdef	_MULTI_DATAMODEL
117 typedef struct _agp_info32 {
118 	agp_version_t	agpi32_version;
119 	uint32_t	agpi32_devid; /* device VID + DID */
120 	uint32_t	agpi32_mode; /* mode of bridge */
121 	uint32_t	agpi32_aperbase; /* base of aperture */
122 	uint32_t	agpi32_apersize; /* in MB */
123 	uint32_t	agpi32_pgtotal;	/* max number of pages */
124 	uint32_t	agpi32_pgsystem; /* same as pg_total */
125 	uint32_t	agpi32_pgused; /* pages consumed */
126 } agp_info32_t;
127 #endif /* _MULTI_DATAMODEL */
128 
129 struct list_head {
130 	struct list_head *next, *prev;
131 	struct igd_gtt_seg  *gttseg;
132 };
133 
134 
135 typedef struct	agpgart_softstate {
136 	dev_info_t	*asoft_dip;
137 	kmutex_t	asoft_instmutex;
138 	agp_kern_info_t	asoft_info;
139 	int		asoft_opened;	/* 0 not opened, non-0 opened */
140 	int		asoft_acquired;	/* 0 released, 1 acquired */
141 	int		asoft_agpen;	/* 0 disbaled, 1 enabled */
142 	pid_t		asoft_curpid;	/* the process accquiring gart */
143 	uint32_t	asoft_mode;	/* agp mode be set */
144 	uint32_t	asoft_pgtotal;	/* total available pages */
145 	uint32_t	asoft_pgused;	/* pages already used */
146 	/* resource handles */
147 	ldi_ident_t	asoft_li;	/* for ldi ops */
148 	keytable_ent_t	*asoft_table;	/* key table for all allocated table */
149 	ddi_dma_handle_t	gart_dma_handle; 	/* for GATT table */
150 	ddi_acc_handle_t	gart_dma_acc_handle;	/* for GATT table */
151 
152 	/* gart table info */
153 	uint64_t	gart_pbase; /* gart table physical address */
154 	caddr_t		gart_vbase; /* kernel-vir addr for GATT table */
155 	size_t		gart_size;  /* the size of aperture in megabytes */
156 	/* all registered agp device in here */
157 	agp_registered_dev_t	asoft_devreg;
158 	kstat_t			*asoft_ksp;
159 	struct		list_head	mapped_list;
160 } agpgart_softstate_t;
161 
162 typedef struct agpgart_ctx {
163 	offset_t	actx_off;
164 	agpgart_softstate_t *actx_sc;
165 } agpgart_ctx_t;
166 
167 #define	KMEMP(p)		((agp_kmem_handle_t *)p)
168 #define	PMEMP(p)		((agp_pmem_handle_t *)p)
169 
170 int agp_init_kstats(agpgart_softstate_t *);
171 void agp_fini_kstats(agpgart_softstate_t *);
172 
173 #endif /* _KERNEL */
174 
175 #ifdef __cplusplus
176 }
177 #endif
178 
179 #endif /* _SYS_AGPGART_IMPL_H */
180