1 /* ati_pcigart.h -- ATI PCI GART support -*- linux-c -*-
2 * Created: Wed Dec 13 21:52:19 2000 by gareth@valinux.com
4 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
22 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
27 * Gareth Hughes <gareth@valinux.com>
29 * $FreeBSD: src/sys/dev/drm/ati_pcigart.h,v 1.1.2.1 2003/04/26 07:05:27 anholt Exp $
30 * $DragonFly: src/sys/dev/drm/ati_pcigart.h,v 1.3 2004/02/13 01:23:57 joerg Exp $
33 #include "dev/drm/drmP.h"
36 # define ATI_PCIGART_TABLE_ORDER 2
37 # define ATI_PCIGART_TABLE_PAGES (1 << 2)
38 #elif PAGE_SIZE == 4096
39 # define ATI_PCIGART_TABLE_ORDER 3
40 # define ATI_PCIGART_TABLE_PAGES (1 << 3)
42 # error - PAGE_SIZE not 8K or 4K
45 # define ATI_MAX_PCIGART_PAGES 8192 /* 32 MB aperture, 4K pages */
46 # define ATI_PCIGART_PAGE_SIZE 4096 /* PCI GART page size */
48 int DRM(ati_pcigart_init
)( drm_device_t
*dev
,
52 drm_sg_mem_t
*entry
= dev
->sg
;
53 unsigned long address
= 0;
55 u32
*pci_gart
=0, page_base
, bus_address
= 0;
59 DRM_ERROR( "no scatter/gather memory!\n" );
63 address
= (long)contigmalloc((1 << ATI_PCIGART_TABLE_ORDER
) * PAGE_SIZE
,
64 DRM(M_DRM
), M_WAITOK
, 0ul, 0xfffffffful
, PAGE_SIZE
, 0);
66 DRM_ERROR( "cannot allocate PCI GART page!\n" );
70 /* XXX: we need to busdma this */
71 bus_address
= vtophys( address
);
73 pci_gart
= (u32
*)address
;
75 pages
= ( entry
->pages
<= ATI_MAX_PCIGART_PAGES
)
76 ? entry
->pages
: ATI_MAX_PCIGART_PAGES
;
78 bzero( pci_gart
, ATI_MAX_PCIGART_PAGES
* sizeof(u32
) );
80 for ( i
= 0 ; i
< pages
; i
++ ) {
81 entry
->busaddr
[i
] = vtophys( entry
->handle
+ (i
*PAGE_SIZE
) );
82 page_base
= (u32
) entry
->busaddr
[i
];
84 for (j
= 0; j
< (PAGE_SIZE
/ ATI_PCIGART_PAGE_SIZE
); j
++) {
85 *pci_gart
++ = cpu_to_le32( page_base
);
86 page_base
+= ATI_PCIGART_PAGE_SIZE
;
94 *bus_addr
= bus_address
;
98 int DRM(ati_pcigart_cleanup
)( drm_device_t
*dev
,
102 drm_sg_mem_t
*entry
= dev
->sg
;
104 /* we need to support large memory configurations */
106 DRM_ERROR( "no scatter/gather memory!\n" );
110 #if defined(__FreeBSD__) && __FreeBSD_version > 500000
111 contigfree( (void *)addr
, (1 << ATI_PCIGART_TABLE_ORDER
) * PAGE_SIZE
, DRM(M_DRM
)); /* Not available on 4.x */