forked from luck/tmp_suning_uos_patched
drm: update PCIGART support from CVS
In order to work on FreeBSD the gart needed to use a local mapping This patch moves the mainline to the new code and aligns some comment changes From: Eric Anholt <anholt@freebsd.org> Signed-off-by: Dave Airlie <airlied@linux.ie>
This commit is contained in:
parent
0a406877e6
commit
f26c473cdf
@ -52,7 +52,7 @@
|
|||||||
# define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */
|
# define ATI_MAX_PCIGART_PAGES 8192 /**< 32 MB aperture, 4K pages */
|
||||||
# define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */
|
# define ATI_PCIGART_PAGE_SIZE 4096 /**< PCI GART page size */
|
||||||
|
|
||||||
static unsigned long drm_ati_alloc_pcigart_table(void)
|
static void *drm_ati_alloc_pcigart_table(void)
|
||||||
{
|
{
|
||||||
unsigned long address;
|
unsigned long address;
|
||||||
struct page *page;
|
struct page *page;
|
||||||
@ -72,27 +72,26 @@ static unsigned long drm_ati_alloc_pcigart_table(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
|
DRM_DEBUG("%s: returning 0x%08lx\n", __FUNCTION__, address);
|
||||||
return address;
|
return (void *)address;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drm_ati_free_pcigart_table(unsigned long address)
|
static void drm_ati_free_pcigart_table(void *address)
|
||||||
{
|
{
|
||||||
struct page *page;
|
struct page *page;
|
||||||
int i;
|
int i;
|
||||||
DRM_DEBUG("%s\n", __FUNCTION__);
|
DRM_DEBUG("%s\n", __FUNCTION__);
|
||||||
|
|
||||||
page = virt_to_page(address);
|
page = virt_to_page((unsigned long)address);
|
||||||
|
|
||||||
for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
|
for (i = 0; i < ATI_PCIGART_TABLE_PAGES; i++, page++) {
|
||||||
__put_page(page);
|
__put_page(page);
|
||||||
ClearPageReserved(page);
|
ClearPageReserved(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
free_pages(address, ATI_PCIGART_TABLE_ORDER);
|
free_pages((unsigned long)address, ATI_PCIGART_TABLE_ORDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
int drm_ati_pcigart_cleanup(drm_device_t * dev,
|
int drm_ati_pcigart_cleanup(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
|
||||||
drm_ati_pcigart_info * gart_info)
|
|
||||||
{
|
{
|
||||||
drm_sg_mem_t *entry = dev->sg;
|
drm_sg_mem_t *entry = dev->sg;
|
||||||
unsigned long pages;
|
unsigned long pages;
|
||||||
@ -136,10 +135,10 @@ int drm_ati_pcigart_cleanup(drm_device_t * dev,
|
|||||||
|
|
||||||
EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
|
EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
|
||||||
|
|
||||||
int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
|
int drm_ati_pcigart_init(drm_device_t *dev, drm_ati_pcigart_info *gart_info)
|
||||||
{
|
{
|
||||||
drm_sg_mem_t *entry = dev->sg;
|
drm_sg_mem_t *entry = dev->sg;
|
||||||
unsigned long address = 0;
|
void *address = NULL;
|
||||||
unsigned long pages;
|
unsigned long pages;
|
||||||
u32 *pci_gart, page_base, bus_address = 0;
|
u32 *pci_gart, page_base, bus_address = 0;
|
||||||
int i, j, ret = 0;
|
int i, j, ret = 0;
|
||||||
@ -163,7 +162,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
bus_address = pci_map_single(dev->pdev, (void *)address,
|
bus_address = pci_map_single(dev->pdev, address,
|
||||||
ATI_PCIGART_TABLE_PAGES *
|
ATI_PCIGART_TABLE_PAGES *
|
||||||
PAGE_SIZE, PCI_DMA_TODEVICE);
|
PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||||
if (bus_address == 0) {
|
if (bus_address == 0) {
|
||||||
@ -176,7 +175,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
|
|||||||
address = gart_info->addr;
|
address = gart_info->addr;
|
||||||
bus_address = gart_info->bus_addr;
|
bus_address = gart_info->bus_addr;
|
||||||
DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n",
|
DRM_DEBUG("PCI: Gart Table: VRAM %08X mapped at %08lX\n",
|
||||||
bus_address, address);
|
bus_address, (unsigned long)address);
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_gart = (u32 *) address;
|
pci_gart = (u32 *) address;
|
||||||
@ -195,7 +194,7 @@ int drm_ati_pcigart_init(drm_device_t * dev, drm_ati_pcigart_info * gart_info)
|
|||||||
if (entry->busaddr[i] == 0) {
|
if (entry->busaddr[i] == 0) {
|
||||||
DRM_ERROR("unable to map PCIGART pages!\n");
|
DRM_ERROR("unable to map PCIGART pages!\n");
|
||||||
drm_ati_pcigart_cleanup(dev, gart_info);
|
drm_ati_pcigart_cleanup(dev, gart_info);
|
||||||
address = 0;
|
address = NULL;
|
||||||
bus_address = 0;
|
bus_address = 0;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -522,8 +522,9 @@ typedef struct drm_vbl_sig {
|
|||||||
typedef struct ati_pcigart_info {
|
typedef struct ati_pcigart_info {
|
||||||
int gart_table_location;
|
int gart_table_location;
|
||||||
int is_pcie;
|
int is_pcie;
|
||||||
unsigned long addr;
|
void *addr;
|
||||||
dma_addr_t bus_addr;
|
dma_addr_t bus_addr;
|
||||||
|
drm_local_map_t mapping;
|
||||||
} drm_ati_pcigart_info;
|
} drm_ati_pcigart_info;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*-
|
/* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*-
|
||||||
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
|
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
|
||||||
*
|
*/
|
||||||
|
/*
|
||||||
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
@ -559,7 +560,8 @@ static int r128_do_init_cce(drm_device_t * dev, drm_r128_init_t * init)
|
|||||||
if (dev_priv->is_pci) {
|
if (dev_priv->is_pci) {
|
||||||
#endif
|
#endif
|
||||||
dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
|
dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
|
||||||
dev_priv->gart_info.addr = dev_priv->gart_info.bus_addr = 0;
|
dev_priv->gart_info.addr = NULL;
|
||||||
|
dev_priv->gart_info.bus_addr = 0;
|
||||||
dev_priv->gart_info.is_pcie = 0;
|
dev_priv->gart_info.is_pcie = 0;
|
||||||
if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
|
if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
|
||||||
DRM_ERROR("failed to init PCI GART!\n");
|
DRM_ERROR("failed to init PCI GART!\n");
|
||||||
@ -601,15 +603,16 @@ int r128_do_cleanup_cce(drm_device_t * dev)
|
|||||||
drm_core_ioremapfree(dev_priv->cce_ring, dev);
|
drm_core_ioremapfree(dev_priv->cce_ring, dev);
|
||||||
if (dev_priv->ring_rptr != NULL)
|
if (dev_priv->ring_rptr != NULL)
|
||||||
drm_core_ioremapfree(dev_priv->ring_rptr, dev);
|
drm_core_ioremapfree(dev_priv->ring_rptr, dev);
|
||||||
if (dev->agp_buffer_map != NULL)
|
if (dev->agp_buffer_map != NULL) {
|
||||||
drm_core_ioremapfree(dev->agp_buffer_map, dev);
|
drm_core_ioremapfree(dev->agp_buffer_map, dev);
|
||||||
|
dev->agp_buffer_map = NULL;
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (dev_priv->gart_info.bus_addr)
|
if (dev_priv->gart_info.bus_addr)
|
||||||
if (!drm_ati_pcigart_cleanup(dev,
|
if (!drm_ati_pcigart_cleanup(dev,
|
||||||
&dev_priv->
|
&dev_priv->gart_info))
|
||||||
gart_info))
|
|
||||||
DRM_ERROR
|
DRM_ERROR
|
||||||
("failed to cleanup PCI GART!\n");
|
("failed to cleanup PCI GART!\n");
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*-
|
/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*-
|
||||||
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
|
* Created: Wed Apr 5 19:24:19 2000 by kevin@precisioninsight.com
|
||||||
*
|
*/
|
||||||
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
/* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* r128_drv.h -- Private header for r128 driver -*- linux-c -*-
|
/* r128_drv.h -- Private header for r128 driver -*- linux-c -*-
|
||||||
* Created: Mon Dec 13 09:51:11 1999 by faith@precisioninsight.com
|
* Created: Mon Dec 13 09:51:11 1999 by faith@precisioninsight.com
|
||||||
*
|
*/
|
||||||
* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
/* Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* r128_irq.c -- IRQ handling for radeon -*- linux-c -*-
|
/* r128_irq.c -- IRQ handling for radeon -*- linux-c -*- */
|
||||||
*
|
/*
|
||||||
* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
|
* Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
|
||||||
*
|
*
|
||||||
* The Weather Channel (TM) funded Tungsten Graphics to develop the
|
* The Weather Channel (TM) funded Tungsten Graphics to develop the
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* r128_state.c -- State support for r128 -*- linux-c -*-
|
/* r128_state.c -- State support for r128 -*- linux-c -*-
|
||||||
* Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com
|
* Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com
|
||||||
*
|
*/
|
||||||
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
/* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* radeon_cp.c -- CP support for Radeon -*- linux-c -*-
|
/* radeon_cp.c -- CP support for Radeon -*- linux-c -*- */
|
||||||
*
|
/*
|
||||||
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
* Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
|
||||||
* Copyright 2000 VA Linux Systems, Inc., Fremont, California.
|
* Copyright 2000 VA Linux Systems, Inc., Fremont, California.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
@ -1561,25 +1561,28 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)
|
|||||||
if (dev_priv->pcigart_offset) {
|
if (dev_priv->pcigart_offset) {
|
||||||
dev_priv->gart_info.bus_addr =
|
dev_priv->gart_info.bus_addr =
|
||||||
dev_priv->pcigart_offset + dev_priv->fb_location;
|
dev_priv->pcigart_offset + dev_priv->fb_location;
|
||||||
|
dev_priv->gart_info.mapping.offset =
|
||||||
|
dev_priv->gart_info.bus_addr;
|
||||||
|
dev_priv->gart_info.mapping.size =
|
||||||
|
RADEON_PCIGART_TABLE_SIZE;
|
||||||
|
|
||||||
|
drm_core_ioremap(&dev_priv->gart_info.mapping, dev);
|
||||||
dev_priv->gart_info.addr =
|
dev_priv->gart_info.addr =
|
||||||
(unsigned long)drm_ioremap(dev_priv->gart_info.
|
dev_priv->gart_info.mapping.handle;
|
||||||
bus_addr,
|
|
||||||
RADEON_PCIGART_TABLE_SIZE,
|
|
||||||
dev);
|
|
||||||
|
|
||||||
dev_priv->gart_info.is_pcie =
|
dev_priv->gart_info.is_pcie =
|
||||||
!!(dev_priv->flags & CHIP_IS_PCIE);
|
!!(dev_priv->flags & CHIP_IS_PCIE);
|
||||||
dev_priv->gart_info.gart_table_location =
|
dev_priv->gart_info.gart_table_location =
|
||||||
DRM_ATI_GART_FB;
|
DRM_ATI_GART_FB;
|
||||||
|
|
||||||
DRM_DEBUG("Setting phys_pci_gart to %08lX %08lX\n",
|
DRM_DEBUG("Setting phys_pci_gart to %p %08lX\n",
|
||||||
dev_priv->gart_info.addr,
|
dev_priv->gart_info.addr,
|
||||||
dev_priv->pcigart_offset);
|
dev_priv->pcigart_offset);
|
||||||
} else {
|
} else {
|
||||||
dev_priv->gart_info.gart_table_location =
|
dev_priv->gart_info.gart_table_location =
|
||||||
DRM_ATI_GART_MAIN;
|
DRM_ATI_GART_MAIN;
|
||||||
dev_priv->gart_info.addr =
|
dev_priv->gart_info.addr = NULL;
|
||||||
dev_priv->gart_info.bus_addr = 0;
|
dev_priv->gart_info.bus_addr = 0;
|
||||||
if (dev_priv->flags & CHIP_IS_PCIE) {
|
if (dev_priv->flags & CHIP_IS_PCIE) {
|
||||||
DRM_ERROR
|
DRM_ERROR
|
||||||
("Cannot use PCI Express without GART in FB memory\n");
|
("Cannot use PCI Express without GART in FB memory\n");
|
||||||
@ -1641,8 +1644,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev)
|
|||||||
DRM_ERROR("failed to cleanup PCI GART!\n");
|
DRM_ERROR("failed to cleanup PCI GART!\n");
|
||||||
|
|
||||||
if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) {
|
if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB) {
|
||||||
drm_ioremapfree((void *)dev_priv->gart_info.addr,
|
drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
|
||||||
RADEON_PCIGART_TABLE_SIZE, dev);
|
|
||||||
dev_priv->gart_info.addr = 0;
|
dev_priv->gart_info.addr = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user