diff options
Diffstat (limited to 'usr/src/uts/common/sys/agp/agpgart_impl.h')
| -rw-r--r-- | usr/src/uts/common/sys/agp/agpgart_impl.h | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/usr/src/uts/common/sys/agp/agpgart_impl.h b/usr/src/uts/common/sys/agp/agpgart_impl.h new file mode 100644 index 0000000000..f0ca7ad4df --- /dev/null +++ b/usr/src/uts/common/sys/agp/agpgart_impl.h @@ -0,0 +1,170 @@ +/* + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ + +#ifndef _SYS_AGPGART_IMPL_H +#define _SYS_AGPGART_IMPL_H + +#pragma ident "%Z%%M% %I% %E% SMI" + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef _KERNEL + +#define AGPGART_MAX_INSTANCES 1 +#define AGP_MAXKEYS 256 +#define AGPGART_DEVNODE "agpgart" + +/* + * The values of type agp_arc_type_t are used as indexes into arc_name + * in agp_kstat.c. + * So if agp_arc_type_t's values are changed in the future, the content + * of arc_name must be changed accordingly. + */ +enum agp_arc_type { + ARC_IGD810 = 0, + ARC_IGD830 = 1, + ARC_INTELAGP = 2, + ARC_AMD64AGP = 3, + ARC_AMD64NOAGP = 4, /* AMD64 cpu without agp bridge */ + ARC_UNKNOWN = 5 +}; +typedef enum agp_arc_type agp_arc_type_t; + +/* linked list structure of multiple agp gart devices access handles */ +typedef struct amd64_gart_dev_list { + ldi_handle_t gart_devhdl; + struct amd64_gart_dev_list *next; +} amd64_gart_dev_list_t; + +typedef struct amd64_garts_dev { + int gart_device_num; + amd64_gart_dev_list_t *gart_dev_list_head; +} amd64_garts_dev_t; + +/* + * AGP target and master device register their config space access + * interface here. + * In AMD64, gart_device_num is the number of hostbridge (device(1100, 1022)) + * refer to <<Bios and Kernel Developer's Guide for AMD athlon64 and operton>> + */ +typedef struct agp_registered_dev { + amd64_garts_dev_t agprd_cpugarts; + ldi_handle_t agprd_targethdl; + ldi_handle_t agprd_masterhdl; + agp_arc_type_t agprd_arctype; /* system types */ +} agp_registered_dev_t; + +/* + * If the OS have direct mapping support for mapping physical page frames + * directly to user address, we use this struct for memory + * allocation. + */ +typedef struct agp_pmem_handle { + devmap_pmem_cookie_t pmem_cookie; +} agp_pmem_handle_t; + +/* + * This struct is used for DDI-compliant memory allocations. + */ +typedef struct agp_kmem_handle { + ddi_dma_handle_t kmem_handle; + ddi_dma_cookie_t kmem_dcookie; + uint32_t kmem_cookies_num; + caddr_t kmem_kvaddr; + size_t kmem_reallen; + ddi_acc_handle_t kmem_acchdl; +} agp_kmem_handle_t; + +typedef struct keytable_ent { + int kte_type; /* agp memory type */ + int kte_key; /* memory key */ + uint32_t kte_pgoff; /* aperture offset bound in pages */ + pgcnt_t kte_pages; /* user-requested size in pages */ + int kte_bound; /* bound to gart table */ + void *kte_memhdl; /* agp_kmem or agp_pmem handle */ + pfn_t *kte_pfnarray; /* page frame numbers allocated */ + uint32_t kte_refcnt; /* reference count */ +} keytable_ent_t; + +typedef struct key_list { + int key_idx; + struct key_list *next; +} key_list_t; + +/* + * for kstat + */ +typedef struct agp_kern_info { + uint32_t agpki_mdevid; + agp_version_t agpki_mver; + uint32_t agpki_mstatus; + size_t agpki_presize; /* valid only for IGD, in KB */ + uint32_t agpki_tdevid; + agp_version_t agpki_tver; + uint32_t agpki_tstatus; + uint64_t agpki_aperbase; + uint32_t agpki_apersize; /* in MB */ +} agp_kern_info_t; + +#ifdef _MULTI_DATAMODEL +typedef struct _agp_info32 { + agp_version_t agpi32_version; + uint32_t agpi32_devid; /* device VID + DID */ + uint32_t agpi32_mode; /* mode of bridge */ + uint32_t agpi32_aperbase; /* base of aperture */ + uint32_t agpi32_apersize; /* in MB */ + uint32_t agpi32_pgtotal; /* max number of pages */ + uint32_t agpi32_pgsystem; /* same as pg_total */ + uint32_t agpi32_pgused; /* pages consumed */ +} agp_info32_t; +#endif /* _MULTI_DATAMODEL */ + +typedef struct agpgart_softstate { + dev_info_t *asoft_dip; + kmutex_t asoft_instmutex; + agp_kern_info_t asoft_info; + int asoft_opened; /* 0 not opened, non-0 opened */ + int asoft_acquired; /* 0 released, 1 acquired */ + int asoft_agpen; /* 0 disbaled, 1 enabled */ + pid_t asoft_curpid; /* the process accquiring gart */ + uint32_t asoft_mode; /* agp mode be set */ + uint32_t asoft_pgtotal; /* total available pages */ + uint32_t asoft_pgused; /* pages already used */ + /* resource handles */ + ldi_ident_t asoft_li; /* for ldi ops */ + keytable_ent_t *asoft_table; /* key table for all allocated table */ + ddi_dma_handle_t gart_dma_handle; /* for GATT table */ + ddi_acc_handle_t gart_dma_acc_handle; /* for GATT table */ + + /* gart table info */ + uint64_t gart_pbase; /* gart table physical address */ + caddr_t gart_vbase; /* kernel-vir addr for GATT table */ + size_t gart_size; /* the size of aperture in megabytes */ + /* all registered agp device in here */ + agp_registered_dev_t asoft_devreg; + kstat_t *asoft_ksp; +} agpgart_softstate_t; + +typedef struct agpgart_ctx { + offset_t actx_off; + agpgart_softstate_t *actx_sc; +} agpgart_ctx_t; + +#define KMEMP(p) ((agp_kmem_handle_t *)p) +#define PMEMP(p) ((agp_pmem_handle_t *)p) + +int agp_init_kstats(agpgart_softstate_t *); +void agp_fini_kstats(agpgart_softstate_t *); + +#endif /* _KERNEL */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYS_AGPGART_IMPL_H */ |
