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