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
15extern "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 */
31enum agp_arc_type {
32	ARC_IGD810 = 0,
33	ARC_IGD830 = 1,
34	ARC_INTELAGP = 2,
35	ARC_AMD64AGP = 3,
36	ARC_UNKNOWN = 5
37};
38typedef enum agp_arc_type agp_arc_type_t;
39
40/* linked list structure of multiple agp gart devices access handles */
41typedef 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
46typedef 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 */
57typedef 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 */
69typedef 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 */
76typedef 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
85typedef 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
96typedef struct key_list {
97	int	key_idx;
98	struct	key_list *next;
99} key_list_t;
100
101/*
102 * for kstat
103 */
104typedef 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
117typedef 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
129struct list_head {
130	struct list_head *next, *prev;
131	struct igd_gtt_seg  *gttseg;
132};
133
134
135typedef 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
162typedef 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
170int agp_init_kstats(agpgart_softstate_t *);
171void 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