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