2 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
6 #ifndef _SYS_AGPGART_IMPL_H
7 #define _SYS_AGPGART_IMPL_H
9 #pragma ident "%Z%%M% %I% %E% SMI"
18 #define AGPGART_MAX_INSTANCES 1
19 #define AGP_MAXKEYS 256
20 #define AGPGART_DEVNODE "agpgart"
23 * The values of type agp_arc_type_t are used as indexes into arc_name
25 * So if agp_arc_type_t's values are changed in the future, the content
26 * of arc_name must be changed accordingly.
35 typedef enum agp_arc_type agp_arc_type_t
;
37 /* linked list structure of multiple agp gart devices access handles */
38 typedef struct amd64_gart_dev_list
{
39 ldi_handle_t gart_devhdl
;
40 struct amd64_gart_dev_list
*next
;
41 } amd64_gart_dev_list_t
;
43 typedef struct amd64_garts_dev
{
45 amd64_gart_dev_list_t
*gart_dev_list_head
;
49 * AGP target and master device register their config space access
51 * In AMD64, gart_device_num is the number of hostbridge (device(1100, 1022))
52 * refer to <<Bios and Kernel Developer's Guide for AMD athlon64 and operton>>
54 typedef struct agp_registered_dev
{
55 amd64_garts_dev_t agprd_cpugarts
;
56 ldi_handle_t agprd_targethdl
;
57 ldi_handle_t agprd_masterhdl
;
58 agp_arc_type_t agprd_arctype
; /* system types */
59 } agp_registered_dev_t
;
62 * If the OS have direct mapping support for mapping physical page frames
63 * directly to user address, we use this struct for memory
66 typedef struct agp_pmem_handle
{
67 devmap_pmem_cookie_t pmem_cookie
;
71 * This struct is used for DDI-compliant memory allocations.
73 typedef struct agp_kmem_handle
{
74 ddi_dma_handle_t kmem_handle
;
75 ddi_dma_cookie_t kmem_dcookie
;
76 uint32_t kmem_cookies_num
;
79 ddi_acc_handle_t kmem_acchdl
;
82 typedef struct keytable_ent
{
83 int kte_type
; /* agp memory type */
84 int kte_key
; /* memory key */
85 uint32_t kte_pgoff
; /* aperture offset bound in pages */
86 pgcnt_t kte_pages
; /* user-requested size in pages */
87 int kte_bound
; /* bound to gart table */
88 void *kte_memhdl
; /* agp_kmem or agp_pmem handle */
89 pfn_t
*kte_pfnarray
; /* page frame numbers allocated */
90 int kte_refcnt
; /* reference count */
93 typedef struct key_list
{
95 struct key_list
*next
;
101 typedef struct agp_kern_info
{
102 uint32_t agpki_mdevid
;
103 agp_version_t agpki_mver
;
104 uint32_t agpki_mstatus
;
105 size_t agpki_presize
; /* valid only for IGD, in KB */
106 uint32_t agpki_tdevid
;
107 agp_version_t agpki_tver
;
108 uint32_t agpki_tstatus
;
109 uint64_t agpki_aperbase
;
110 uint32_t agpki_apersize
; /* in MB */
113 #ifdef _MULTI_DATAMODEL
114 typedef struct _agp_info32
{
115 agp_version_t agpi32_version
;
116 uint32_t agpi32_devid
; /* device VID + DID */
117 uint32_t agpi32_mode
; /* mode of bridge */
118 uint32_t agpi32_aperbase
; /* base of aperture */
119 uint32_t agpi32_apersize
; /* in MB */
120 uint32_t agpi32_pgtotal
; /* max number of pages */
121 uint32_t agpi32_pgsystem
; /* same as pg_total */
122 uint32_t agpi32_pgused
; /* pages consumed */
124 #endif /* _MULTI_DATAMODEL */
126 typedef struct agpgart_softstate
{
127 dev_info_t
*asoft_dip
;
128 kmutex_t asoft_instmutex
;
129 agp_kern_info_t asoft_info
;
130 int asoft_opened
; /* 0 not opened, non-0 opened */
131 int asoft_acquired
; /* 0 released, 1 acquired */
132 int asoft_agpen
; /* 0 disbaled, 1 enabled */
133 pid_t asoft_curpid
; /* the process accquiring gart */
134 uint32_t asoft_mode
; /* agp mode be set */
135 uint32_t asoft_pgtotal
; /* total available pages */
136 uint32_t asoft_pgused
; /* pages already used */
137 /* resource handles */
138 ldi_ident_t asoft_li
; /* for ldi ops */
139 keytable_ent_t
*asoft_table
; /* key table for all allocated table */
140 ddi_dma_handle_t gart_dma_handle
; /* for GATT table */
141 ddi_acc_handle_t gart_dma_acc_handle
; /* for GATT table */
143 /* gart table info */
144 uint64_t gart_pbase
; /* gart table physical address */
145 caddr_t gart_vbase
; /* kernel-vir addr for GATT table */
146 size_t gart_size
; /* the size of aperture in megabytes */
147 /* all registered agp device in here */
148 agp_registered_dev_t asoft_devreg
;
150 } agpgart_softstate_t
;
152 typedef struct agpgart_ctx
{
154 agpgart_softstate_t
*actx_sc
;
157 #define KMEMP(p) ((agp_kmem_handle_t *)p)
158 #define PMEMP(p) ((agp_pmem_handle_t *)p)
160 int agp_init_kstats(agpgart_softstate_t
*);
161 void agp_fini_kstats(agpgart_softstate_t
*);
169 #endif /* _SYS_AGPGART_IMPL_H */