1 /* 2 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 #ifndef _SYS_AGPGART_IMPL_H 7 #define _SYS_AGPGART_IMPL_H 8 9 #pragma ident "%Z%%M% %I% %E% SMI" 10 11 #ifdef __cplusplus 12 extern "C" { 13 #endif 14 15 16 #ifdef _KERNEL 17 18 #define AGPGART_MAX_INSTANCES 1 19 #define AGP_MAXKEYS 256 20 #define AGPGART_DEVNODE "agpgart" 21 22 /* 23 * The values of type agp_arc_type_t are used as indexes into arc_name 24 * in agp_kstat.c. 25 * So if agp_arc_type_t's values are changed in the future, the content 26 * of arc_name must be changed accordingly. 27 */ 28 enum agp_arc_type { 29 ARC_IGD810 = 0, 30 ARC_IGD830 = 1, 31 ARC_INTELAGP = 2, 32 ARC_AMD64AGP = 3, 33 ARC_UNKNOWN = 5 34 }; 35 typedef enum agp_arc_type agp_arc_type_t; 36 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; 42 43 typedef struct amd64_garts_dev { 44 int gart_device_num; 45 amd64_gart_dev_list_t *gart_dev_list_head; 46 } amd64_garts_dev_t; 47 48 /* 49 * AGP target and master device register their config space access 50 * interface here. 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>> 53 */ 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; 60 61 /* 62 * If the OS have direct mapping support for mapping physical page frames 63 * directly to user address, we use this struct for memory 64 * allocation. 65 */ 66 typedef struct agp_pmem_handle { 67 devmap_pmem_cookie_t pmem_cookie; 68 } agp_pmem_handle_t; 69 70 /* 71 * This struct is used for DDI-compliant memory allocations. 72 */ 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; 77 caddr_t kmem_kvaddr; 78 size_t kmem_reallen; 79 ddi_acc_handle_t kmem_acchdl; 80 } agp_kmem_handle_t; 81 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 uint32_t kte_refcnt; /* reference count */ 91 } keytable_ent_t; 92 93 typedef struct key_list { 94 int key_idx; 95 struct key_list *next; 96 } key_list_t; 97 98 /* 99 * for kstat 100 */ 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 */ 111 } agp_kern_info_t; 112 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 */ 123 } agp_info32_t; 124 #endif /* _MULTI_DATAMODEL */ 125 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 */ 142 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; 149 kstat_t *asoft_ksp; 150 } agpgart_softstate_t; 151 152 typedef struct agpgart_ctx { 153 offset_t actx_off; 154 agpgart_softstate_t *actx_sc; 155 } agpgart_ctx_t; 156 157 #define KMEMP(p) ((agp_kmem_handle_t *)p) 158 #define PMEMP(p) ((agp_pmem_handle_t *)p) 159 160 int agp_init_kstats(agpgart_softstate_t *); 161 void agp_fini_kstats(agpgart_softstate_t *); 162 163 #endif /* _KERNEL */ 164 165 #ifdef __cplusplus 166 } 167 #endif 168 169 #endif /* _SYS_AGPGART_IMPL_H */ 170