Merge branch 'drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (53 commits) drm: detect hdmi monitor by hdmi identifier (v3) drm: drm_fops.c unlock missing on error path drm: reorder struct drm_ioctl_desc to save space on 64 bit builds radeon: add some new pci ids drm: read EDID extensions from monitor drm: Use a little stash on the stack to avoid kmalloc in most DRM ioctls. drm/radeon: add regs required for occlusion queries support drm/i915: check the return value from the copy from user drm/radeon: fix logic in r600_page_table_init() to match ati_gart drm/radeon: r600 ptes are 64-bit, cleanup cleanup function. drm/radeon: don't call irq changes on r600 suspend/resume drm/radeon: fix r600 writeback across suspend/resume drm/radeon: fix r600 writeback setup. drm: fix warnings about new mappings in info code. drm/radeon: NULL noise: drivers/gpu/drm/radeon/radeon_*.c drm/radeon: fix r600 pci mapping calls. drm/radeon: r6xx/r7xx: fix possible oops in r600_page_table_cleanup() radeon: call the correct idle function, logic got inverted. drm/radeon: RS600: fix interrupt handling drm/r600: fix rptr address along lines of previous fixes to radeon. ...
This commit is contained in:
commit
dfbbe89e19
|
@ -77,7 +77,7 @@ int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info
|
|||
if (!entry->busaddr[i])
|
||||
break;
|
||||
pci_unmap_page(dev->pdev, entry->busaddr[i],
|
||||
PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
|
||||
if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
|
||||
|
@ -95,13 +95,14 @@ EXPORT_SYMBOL(drm_ati_pcigart_cleanup);
|
|||
|
||||
int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info)
|
||||
{
|
||||
struct drm_local_map *map = &gart_info->mapping;
|
||||
struct drm_sg_mem *entry = dev->sg;
|
||||
void *address = NULL;
|
||||
unsigned long pages;
|
||||
u32 *pci_gart, page_base;
|
||||
u32 *pci_gart = NULL, page_base, gart_idx;
|
||||
dma_addr_t bus_address = 0;
|
||||
int i, j, ret = 0;
|
||||
int max_pages;
|
||||
int max_ati_pages, max_real_pages;
|
||||
|
||||
if (!entry) {
|
||||
DRM_ERROR("no scatter/gather memory!\n");
|
||||
|
@ -117,6 +118,7 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
|
|||
goto done;
|
||||
}
|
||||
|
||||
pci_gart = gart_info->table_handle->vaddr;
|
||||
address = gart_info->table_handle->vaddr;
|
||||
bus_address = gart_info->table_handle->busaddr;
|
||||
} else {
|
||||
|
@ -127,18 +129,23 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
|
|||
(unsigned long)address);
|
||||
}
|
||||
|
||||
pci_gart = (u32 *) address;
|
||||
|
||||
max_pages = (gart_info->table_size / sizeof(u32));
|
||||
pages = (entry->pages <= max_pages)
|
||||
? entry->pages : max_pages;
|
||||
max_ati_pages = (gart_info->table_size / sizeof(u32));
|
||||
max_real_pages = max_ati_pages / (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE);
|
||||
pages = (entry->pages <= max_real_pages)
|
||||
? entry->pages : max_real_pages;
|
||||
|
||||
memset(pci_gart, 0, max_pages * sizeof(u32));
|
||||
if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
|
||||
memset(pci_gart, 0, max_ati_pages * sizeof(u32));
|
||||
} else {
|
||||
memset_io((void __iomem *)map->handle, 0, max_ati_pages * sizeof(u32));
|
||||
}
|
||||
|
||||
gart_idx = 0;
|
||||
for (i = 0; i < pages; i++) {
|
||||
/* we need to support large memory configurations */
|
||||
entry->busaddr[i] = pci_map_page(dev->pdev, entry->pagelist[i],
|
||||
0, PAGE_SIZE, PCI_DMA_TODEVICE);
|
||||
0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
if (entry->busaddr[i] == 0) {
|
||||
DRM_ERROR("unable to map PCIGART pages!\n");
|
||||
drm_ati_pcigart_cleanup(dev, gart_info);
|
||||
|
@ -149,19 +156,26 @@ int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *ga
|
|||
page_base = (u32) entry->busaddr[i];
|
||||
|
||||
for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
|
||||
u32 val;
|
||||
|
||||
switch(gart_info->gart_reg_if) {
|
||||
case DRM_ATI_GART_IGP:
|
||||
*pci_gart = cpu_to_le32((page_base) | 0xc);
|
||||
val = page_base | 0xc;
|
||||
break;
|
||||
case DRM_ATI_GART_PCIE:
|
||||
*pci_gart = cpu_to_le32((page_base >> 8) | 0xc);
|
||||
val = (page_base >> 8) | 0xc;
|
||||
break;
|
||||
default:
|
||||
case DRM_ATI_GART_PCI:
|
||||
*pci_gart = cpu_to_le32(page_base);
|
||||
val = page_base;
|
||||
break;
|
||||
}
|
||||
pci_gart++;
|
||||
if (gart_info->gart_table_location ==
|
||||
DRM_ATI_GART_MAIN)
|
||||
pci_gart[gart_idx] = cpu_to_le32(val);
|
||||
else
|
||||
DRM_WRITE32(map, gart_idx * sizeof(u32), val);
|
||||
gart_idx++;
|
||||
page_base += ATI_PCIGART_PAGE_SIZE;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,15 +34,17 @@
|
|||
*/
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/log2.h>
|
||||
#include <asm/shmparam.h>
|
||||
#include "drmP.h"
|
||||
|
||||
unsigned long drm_get_resource_start(struct drm_device *dev, unsigned int resource)
|
||||
resource_size_t drm_get_resource_start(struct drm_device *dev, unsigned int resource)
|
||||
{
|
||||
return pci_resource_start(dev->pdev, resource);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_resource_start);
|
||||
|
||||
unsigned long drm_get_resource_len(struct drm_device *dev, unsigned int resource)
|
||||
resource_size_t drm_get_resource_len(struct drm_device *dev, unsigned int resource)
|
||||
{
|
||||
return pci_resource_len(dev->pdev, resource);
|
||||
}
|
||||
|
@ -50,24 +52,44 @@ unsigned long drm_get_resource_len(struct drm_device *dev, unsigned int resource
|
|||
EXPORT_SYMBOL(drm_get_resource_len);
|
||||
|
||||
static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
||||
drm_local_map_t *map)
|
||||
struct drm_local_map *map)
|
||||
{
|
||||
struct drm_map_list *entry;
|
||||
list_for_each_entry(entry, &dev->maplist, head) {
|
||||
if (entry->map && (entry->master == dev->primary->master) && (map->type == entry->map->type) &&
|
||||
((entry->map->offset == map->offset) ||
|
||||
((map->type == _DRM_SHM) && (map->flags&_DRM_CONTAINS_LOCK)))) {
|
||||
/*
|
||||
* Because the kernel-userspace ABI is fixed at a 32-bit offset
|
||||
* while PCI resources may live above that, we ignore the map
|
||||
* offset for maps of type _DRM_FRAMEBUFFER or _DRM_REGISTERS.
|
||||
* It is assumed that each driver will have only one resource of
|
||||
* each type.
|
||||
*/
|
||||
if (!entry->map ||
|
||||
map->type != entry->map->type ||
|
||||
entry->master != dev->primary->master)
|
||||
continue;
|
||||
switch (map->type) {
|
||||
case _DRM_SHM:
|
||||
if (map->flags != _DRM_CONTAINS_LOCK)
|
||||
break;
|
||||
case _DRM_REGISTERS:
|
||||
case _DRM_FRAME_BUFFER:
|
||||
return entry;
|
||||
default: /* Make gcc happy */
|
||||
;
|
||||
}
|
||||
if (entry->map->offset == map->offset)
|
||||
return entry;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int drm_map_handle(struct drm_device *dev, struct drm_hash_item *hash,
|
||||
unsigned long user_token, int hashed_handle)
|
||||
unsigned long user_token, int hashed_handle, int shm)
|
||||
{
|
||||
int use_hashed_handle;
|
||||
int use_hashed_handle, shift;
|
||||
unsigned long add;
|
||||
|
||||
#if (BITS_PER_LONG == 64)
|
||||
use_hashed_handle = ((user_token & 0xFFFFFFFF00000000UL) || hashed_handle);
|
||||
#elif (BITS_PER_LONG == 32)
|
||||
|
@ -83,30 +105,47 @@ static int drm_map_handle(struct drm_device *dev, struct drm_hash_item *hash,
|
|||
if (ret != -EINVAL)
|
||||
return ret;
|
||||
}
|
||||
|
||||
shift = 0;
|
||||
add = DRM_MAP_HASH_OFFSET >> PAGE_SHIFT;
|
||||
if (shm && (SHMLBA > PAGE_SIZE)) {
|
||||
int bits = ilog2(SHMLBA >> PAGE_SHIFT) + 1;
|
||||
|
||||
/* For shared memory, we have to preserve the SHMLBA
|
||||
* bits of the eventual vma->vm_pgoff value during
|
||||
* mmap(). Otherwise we run into cache aliasing problems
|
||||
* on some platforms. On these platforms, the pgoff of
|
||||
* a mmap() request is used to pick a suitable virtual
|
||||
* address for the mmap() region such that it will not
|
||||
* cause cache aliasing problems.
|
||||
*
|
||||
* Therefore, make sure the SHMLBA relevant bits of the
|
||||
* hash value we use are equal to those in the original
|
||||
* kernel virtual address.
|
||||
*/
|
||||
shift = bits;
|
||||
add |= ((user_token >> PAGE_SHIFT) & ((1UL << bits) - 1UL));
|
||||
}
|
||||
|
||||
return drm_ht_just_insert_please(&dev->map_hash, hash,
|
||||
user_token, 32 - PAGE_SHIFT - 3,
|
||||
0, DRM_MAP_HASH_OFFSET >> PAGE_SHIFT);
|
||||
shift, add);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ioctl to specify a range of memory that is available for mapping by a non-root process.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
* Core function to create a range of memory available for mapping by a
|
||||
* non-root process.
|
||||
*
|
||||
* Adjusts the memory offset to its absolute value according to the mapping
|
||||
* type. Adds the map to the map list drm_device::maplist. Adds MTRR's where
|
||||
* applicable and if supported by the kernel.
|
||||
*/
|
||||
static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
||||
static int drm_addmap_core(struct drm_device * dev, resource_size_t offset,
|
||||
unsigned int size, enum drm_map_type type,
|
||||
enum drm_map_flags flags,
|
||||
struct drm_map_list ** maplist)
|
||||
{
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
struct drm_map_list *list;
|
||||
drm_dma_handle_t *dmah;
|
||||
unsigned long user_token;
|
||||
|
@ -129,9 +168,9 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
|||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
return -EINVAL;
|
||||
}
|
||||
DRM_DEBUG("offset = 0x%08lx, size = 0x%08lx, type = %d\n",
|
||||
map->offset, map->size, map->type);
|
||||
if ((map->offset & (~PAGE_MASK)) || (map->size & (~PAGE_MASK))) {
|
||||
DRM_DEBUG("offset = 0x%08llx, size = 0x%08lx, type = %d\n",
|
||||
(unsigned long long)map->offset, map->size, map->type);
|
||||
if ((map->offset & (~(resource_size_t)PAGE_MASK)) || (map->size & (~PAGE_MASK))) {
|
||||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -259,7 +298,8 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
|||
drm_free(map, sizeof(*map), DRM_MEM_MAPS);
|
||||
return -EPERM;
|
||||
}
|
||||
DRM_DEBUG("AGP offset = 0x%08lx, size = 0x%08lx\n", map->offset, map->size);
|
||||
DRM_DEBUG("AGP offset = 0x%08llx, size = 0x%08lx\n",
|
||||
(unsigned long long)map->offset, map->size);
|
||||
|
||||
break;
|
||||
case _DRM_GEM:
|
||||
|
@ -309,7 +349,8 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
|||
/* We do it here so that dev->struct_mutex protects the increment */
|
||||
user_token = (map->type == _DRM_SHM) ? (unsigned long)map->handle :
|
||||
map->offset;
|
||||
ret = drm_map_handle(dev, &list->hash, user_token, 0);
|
||||
ret = drm_map_handle(dev, &list->hash, user_token, 0,
|
||||
(map->type == _DRM_SHM));
|
||||
if (ret) {
|
||||
if (map->type == _DRM_REGISTERS)
|
||||
iounmap(map->handle);
|
||||
|
@ -327,9 +368,9 @@ static int drm_addmap_core(struct drm_device * dev, unsigned int offset,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int drm_addmap(struct drm_device * dev, unsigned int offset,
|
||||
int drm_addmap(struct drm_device * dev, resource_size_t offset,
|
||||
unsigned int size, enum drm_map_type type,
|
||||
enum drm_map_flags flags, drm_local_map_t ** map_ptr)
|
||||
enum drm_map_flags flags, struct drm_local_map ** map_ptr)
|
||||
{
|
||||
struct drm_map_list *list;
|
||||
int rc;
|
||||
|
@ -342,6 +383,17 @@ int drm_addmap(struct drm_device * dev, unsigned int offset,
|
|||
|
||||
EXPORT_SYMBOL(drm_addmap);
|
||||
|
||||
/**
|
||||
* Ioctl to specify a range of memory that is available for mapping by a
|
||||
* non-root process.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*
|
||||
*/
|
||||
int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
|
@ -367,19 +419,13 @@ int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
|||
* Remove a map private from list and deallocate resources if the mapping
|
||||
* isn't in use.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a struct drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*
|
||||
* Searches the map on drm_device::maplist, removes it from the list, see if
|
||||
* its being used, and free any associate resource (such as MTRR's) if it's not
|
||||
* being on use.
|
||||
*
|
||||
* \sa drm_addmap
|
||||
*/
|
||||
int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
|
||||
int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map)
|
||||
{
|
||||
struct drm_map_list *r_list = NULL, *list_t;
|
||||
drm_dma_handle_t dmah;
|
||||
|
@ -442,7 +488,7 @@ int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_rmmap_locked);
|
||||
|
||||
int drm_rmmap(struct drm_device *dev, drm_local_map_t *map)
|
||||
int drm_rmmap(struct drm_device *dev, struct drm_local_map *map)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
@ -462,12 +508,18 @@ EXPORT_SYMBOL(drm_rmmap);
|
|||
* One use case might be after addmap is allowed for normal users for SHM and
|
||||
* gets used by drivers that the server doesn't need to care about. This seems
|
||||
* unlikely.
|
||||
*
|
||||
* \param inode device inode.
|
||||
* \param file_priv DRM file private.
|
||||
* \param cmd command.
|
||||
* \param arg pointer to a struct drm_map structure.
|
||||
* \return zero on success or a negative value on error.
|
||||
*/
|
||||
int drm_rmmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_map *request = data;
|
||||
drm_local_map_t *map = NULL;
|
||||
struct drm_local_map *map = NULL;
|
||||
struct drm_map_list *r_list;
|
||||
int ret;
|
||||
|
||||
|
@ -1534,7 +1586,7 @@ int drm_mapbufs(struct drm_device *dev, void *data,
|
|||
&& (dma->flags & _DRM_DMA_USE_SG))
|
||||
|| (drm_core_check_feature(dev, DRIVER_FB_DMA)
|
||||
&& (dma->flags & _DRM_DMA_USE_FB))) {
|
||||
struct drm_map *map = dev->agp_buffer_map;
|
||||
struct drm_local_map *map = dev->agp_buffer_map;
|
||||
unsigned long token = dev->agp_buffer_token;
|
||||
|
||||
if (!map) {
|
||||
|
|
|
@ -143,7 +143,7 @@ int drm_getsareactx(struct drm_device *dev, void *data,
|
|||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_ctx_priv_map *request = data;
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
struct drm_map_list *_entry;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
@ -186,7 +186,7 @@ int drm_setsareactx(struct drm_device *dev, void *data,
|
|||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_ctx_priv_map *request = data;
|
||||
struct drm_map *map = NULL;
|
||||
struct drm_local_map *map = NULL;
|
||||
struct drm_map_list *r_list = NULL;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
|
|
|
@ -254,15 +254,19 @@ int drm_lastclose(struct drm_device * dev)
|
|||
int drm_init(struct drm_driver *driver)
|
||||
{
|
||||
struct pci_dev *pdev = NULL;
|
||||
struct pci_device_id *pid;
|
||||
const struct pci_device_id *pid;
|
||||
int i;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
INIT_LIST_HEAD(&driver->device_list);
|
||||
|
||||
if (driver->driver_features & DRIVER_MODESET)
|
||||
return pci_register_driver(&driver->pci_driver);
|
||||
|
||||
/* If not using KMS, fall back to stealth mode manual scanning. */
|
||||
for (i = 0; driver->pci_driver.id_table[i].vendor != 0; i++) {
|
||||
pid = (struct pci_device_id *)&driver->pci_driver.id_table[i];
|
||||
pid = &driver->pci_driver.id_table[i];
|
||||
|
||||
/* Loop around setting up a DRM device for each PCI device
|
||||
* matching our ID and device class. If we had the internal
|
||||
|
@ -287,68 +291,17 @@ int drm_init(struct drm_driver *driver)
|
|||
|
||||
EXPORT_SYMBOL(drm_init);
|
||||
|
||||
/**
|
||||
* Called via cleanup_module() at module unload time.
|
||||
*
|
||||
* Cleans up all DRM device, calling drm_lastclose().
|
||||
*
|
||||
* \sa drm_init
|
||||
*/
|
||||
static void drm_cleanup(struct drm_device * dev)
|
||||
{
|
||||
struct drm_map_list *r_list, *list_temp;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
if (!dev) {
|
||||
DRM_ERROR("cleanup called no dev\n");
|
||||
return;
|
||||
}
|
||||
|
||||
drm_vblank_cleanup(dev);
|
||||
|
||||
drm_lastclose(dev);
|
||||
|
||||
if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
|
||||
dev->agp && dev->agp->agp_mtrr >= 0) {
|
||||
int retval;
|
||||
retval = mtrr_del(dev->agp->agp_mtrr,
|
||||
dev->agp->agp_info.aper_base,
|
||||
dev->agp->agp_info.aper_size * 1024 * 1024);
|
||||
DRM_DEBUG("mtrr_del=%d\n", retval);
|
||||
}
|
||||
|
||||
if (dev->driver->unload)
|
||||
dev->driver->unload(dev);
|
||||
|
||||
if (drm_core_has_AGP(dev) && dev->agp) {
|
||||
drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
|
||||
dev->agp = NULL;
|
||||
}
|
||||
|
||||
drm_ht_remove(&dev->map_hash);
|
||||
drm_ctxbitmap_cleanup(dev);
|
||||
|
||||
list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
|
||||
drm_rmmap(dev, r_list->map);
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
drm_put_minor(&dev->control);
|
||||
|
||||
if (dev->driver->driver_features & DRIVER_GEM)
|
||||
drm_gem_destroy(dev);
|
||||
|
||||
drm_put_minor(&dev->primary);
|
||||
if (drm_put_dev(dev))
|
||||
DRM_ERROR("Cannot unload module\n");
|
||||
}
|
||||
|
||||
void drm_exit(struct drm_driver *driver)
|
||||
{
|
||||
struct drm_device *dev, *tmp;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
|
||||
drm_cleanup(dev);
|
||||
if (driver->driver_features & DRIVER_MODESET) {
|
||||
pci_unregister_driver(&driver->pci_driver);
|
||||
} else {
|
||||
list_for_each_entry_safe(dev, tmp, &driver->device_list, driver_item)
|
||||
drm_put_dev(dev);
|
||||
}
|
||||
|
||||
DRM_INFO("Module unloaded\n");
|
||||
}
|
||||
|
@ -468,6 +421,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
|
|||
drm_ioctl_t *func;
|
||||
unsigned int nr = DRM_IOCTL_NR(cmd);
|
||||
int retcode = -EINVAL;
|
||||
char stack_kdata[128];
|
||||
char *kdata = NULL;
|
||||
|
||||
atomic_inc(&dev->ioctl_count);
|
||||
|
@ -506,10 +460,14 @@ int drm_ioctl(struct inode *inode, struct file *filp,
|
|||
retcode = -EACCES;
|
||||
} else {
|
||||
if (cmd & (IOC_IN | IOC_OUT)) {
|
||||
kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
|
||||
if (!kdata) {
|
||||
retcode = -ENOMEM;
|
||||
goto err_i1;
|
||||
if (_IOC_SIZE(cmd) <= sizeof(stack_kdata)) {
|
||||
kdata = stack_kdata;
|
||||
} else {
|
||||
kdata = kmalloc(_IOC_SIZE(cmd), GFP_KERNEL);
|
||||
if (!kdata) {
|
||||
retcode = -ENOMEM;
|
||||
goto err_i1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -530,7 +488,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
|
|||
}
|
||||
|
||||
err_i1:
|
||||
if (kdata)
|
||||
if (kdata != stack_kdata)
|
||||
kfree(kdata);
|
||||
atomic_dec(&dev->ioctl_count);
|
||||
if (retcode)
|
||||
|
@ -540,7 +498,7 @@ int drm_ioctl(struct inode *inode, struct file *filp,
|
|||
|
||||
EXPORT_SYMBOL(drm_ioctl);
|
||||
|
||||
drm_local_map_t *drm_getsarea(struct drm_device *dev)
|
||||
struct drm_local_map *drm_getsarea(struct drm_device *dev)
|
||||
{
|
||||
struct drm_map_list *entry;
|
||||
|
||||
|
|
|
@ -550,11 +550,20 @@ static int add_detailed_info(struct drm_connector *connector,
|
|||
}
|
||||
|
||||
#define DDC_ADDR 0x50
|
||||
|
||||
unsigned char *drm_do_probe_ddc_edid(struct i2c_adapter *adapter)
|
||||
/**
|
||||
* Get EDID information via I2C.
|
||||
*
|
||||
* \param adapter : i2c device adaptor
|
||||
* \param buf : EDID data buffer to be filled
|
||||
* \param len : EDID data buffer length
|
||||
* \return 0 on success or -1 on failure.
|
||||
*
|
||||
* Try to fetch EDID information by calling i2c driver function.
|
||||
*/
|
||||
int drm_do_probe_ddc_edid(struct i2c_adapter *adapter,
|
||||
unsigned char *buf, int len)
|
||||
{
|
||||
unsigned char start = 0x0;
|
||||
unsigned char *buf = kmalloc(EDID_LENGTH, GFP_KERNEL);
|
||||
struct i2c_msg msgs[] = {
|
||||
{
|
||||
.addr = DDC_ADDR,
|
||||
|
@ -564,31 +573,36 @@ unsigned char *drm_do_probe_ddc_edid(struct i2c_adapter *adapter)
|
|||
}, {
|
||||
.addr = DDC_ADDR,
|
||||
.flags = I2C_M_RD,
|
||||
.len = EDID_LENGTH,
|
||||
.len = len,
|
||||
.buf = buf,
|
||||
}
|
||||
};
|
||||
|
||||
if (!buf) {
|
||||
dev_warn(&adapter->dev, "unable to allocate memory for EDID "
|
||||
"block.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (i2c_transfer(adapter, msgs, 2) == 2)
|
||||
return buf;
|
||||
return 0;
|
||||
|
||||
dev_info(&adapter->dev, "unable to read EDID block.\n");
|
||||
kfree(buf);
|
||||
return NULL;
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_do_probe_ddc_edid);
|
||||
|
||||
static unsigned char *drm_ddc_read(struct i2c_adapter *adapter)
|
||||
/**
|
||||
* Get EDID information.
|
||||
*
|
||||
* \param adapter : i2c device adaptor.
|
||||
* \param buf : EDID data buffer to be filled
|
||||
* \param len : EDID data buffer length
|
||||
* \return 0 on success or -1 on failure.
|
||||
*
|
||||
* Initialize DDC, then fetch EDID information
|
||||
* by calling drm_do_probe_ddc_edid function.
|
||||
*/
|
||||
static int drm_ddc_read(struct i2c_adapter *adapter,
|
||||
unsigned char *buf, int len)
|
||||
{
|
||||
struct i2c_algo_bit_data *algo_data = adapter->algo_data;
|
||||
unsigned char *edid = NULL;
|
||||
int i, j;
|
||||
int ret = -1;
|
||||
|
||||
algo_data->setscl(algo_data->data, 1);
|
||||
|
||||
|
@ -616,7 +630,7 @@ static unsigned char *drm_ddc_read(struct i2c_adapter *adapter)
|
|||
msleep(15);
|
||||
|
||||
/* Do the real work */
|
||||
edid = drm_do_probe_ddc_edid(adapter);
|
||||
ret = drm_do_probe_ddc_edid(adapter, buf, len);
|
||||
algo_data->setsda(algo_data->data, 0);
|
||||
algo_data->setscl(algo_data->data, 0);
|
||||
msleep(15);
|
||||
|
@ -632,7 +646,7 @@ static unsigned char *drm_ddc_read(struct i2c_adapter *adapter)
|
|||
msleep(15);
|
||||
algo_data->setscl(algo_data->data, 0);
|
||||
algo_data->setsda(algo_data->data, 0);
|
||||
if (edid)
|
||||
if (ret == 0)
|
||||
break;
|
||||
}
|
||||
/* Release the DDC lines when done or the Apple Cinema HD display
|
||||
|
@ -641,9 +655,31 @@ static unsigned char *drm_ddc_read(struct i2c_adapter *adapter)
|
|||
algo_data->setsda(algo_data->data, 1);
|
||||
algo_data->setscl(algo_data->data, 1);
|
||||
|
||||
return edid;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int drm_ddc_read_edid(struct drm_connector *connector,
|
||||
struct i2c_adapter *adapter,
|
||||
char *buf, int len)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_ddc_read(adapter, buf, len);
|
||||
if (ret != 0) {
|
||||
dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n",
|
||||
drm_get_connector_name(connector));
|
||||
goto end;
|
||||
}
|
||||
if (!edid_is_valid((struct edid *)buf)) {
|
||||
dev_warn(&connector->dev->pdev->dev, "%s: EDID invalid.\n",
|
||||
drm_get_connector_name(connector));
|
||||
ret = -1;
|
||||
}
|
||||
end:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define MAX_EDID_EXT_NUM 4
|
||||
/**
|
||||
* drm_get_edid - get EDID data, if available
|
||||
* @connector: connector we're probing
|
||||
|
@ -656,27 +692,118 @@ static unsigned char *drm_ddc_read(struct i2c_adapter *adapter)
|
|||
struct edid *drm_get_edid(struct drm_connector *connector,
|
||||
struct i2c_adapter *adapter)
|
||||
{
|
||||
int ret;
|
||||
struct edid *edid;
|
||||
|
||||
edid = (struct edid *)drm_ddc_read(adapter);
|
||||
if (!edid) {
|
||||
dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n",
|
||||
drm_get_connector_name(connector));
|
||||
return NULL;
|
||||
edid = kmalloc(EDID_LENGTH * (MAX_EDID_EXT_NUM + 1),
|
||||
GFP_KERNEL);
|
||||
if (edid == NULL) {
|
||||
dev_warn(&connector->dev->pdev->dev,
|
||||
"Failed to allocate EDID\n");
|
||||
goto end;
|
||||
}
|
||||
if (!edid_is_valid(edid)) {
|
||||
dev_warn(&connector->dev->pdev->dev, "%s: EDID invalid.\n",
|
||||
drm_get_connector_name(connector));
|
||||
kfree(edid);
|
||||
return NULL;
|
||||
|
||||
/* Read first EDID block */
|
||||
ret = drm_ddc_read_edid(connector, adapter,
|
||||
(unsigned char *)edid, EDID_LENGTH);
|
||||
if (ret != 0)
|
||||
goto clean_up;
|
||||
|
||||
/* There are EDID extensions to be read */
|
||||
if (edid->extensions != 0) {
|
||||
int edid_ext_num = edid->extensions;
|
||||
|
||||
if (edid_ext_num > MAX_EDID_EXT_NUM) {
|
||||
dev_warn(&connector->dev->pdev->dev,
|
||||
"The number of extension(%d) is "
|
||||
"over max (%d), actually read number (%d)\n",
|
||||
edid_ext_num, MAX_EDID_EXT_NUM,
|
||||
MAX_EDID_EXT_NUM);
|
||||
/* Reset EDID extension number to be read */
|
||||
edid_ext_num = MAX_EDID_EXT_NUM;
|
||||
}
|
||||
/* Read EDID including extensions too */
|
||||
ret = drm_ddc_read_edid(connector, adapter, (char *)edid,
|
||||
EDID_LENGTH * (edid_ext_num + 1));
|
||||
if (ret != 0)
|
||||
goto clean_up;
|
||||
|
||||
}
|
||||
|
||||
connector->display_info.raw_edid = (char *)edid;
|
||||
goto end;
|
||||
|
||||
clean_up:
|
||||
kfree(edid);
|
||||
edid = NULL;
|
||||
end:
|
||||
return edid;
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_edid);
|
||||
|
||||
#define HDMI_IDENTIFIER 0x000C03
|
||||
#define VENDOR_BLOCK 0x03
|
||||
/**
|
||||
* drm_detect_hdmi_monitor - detect whether monitor is hdmi.
|
||||
* @edid: monitor EDID information
|
||||
*
|
||||
* Parse the CEA extension according to CEA-861-B.
|
||||
* Return true if HDMI, false if not or unknown.
|
||||
*/
|
||||
bool drm_detect_hdmi_monitor(struct edid *edid)
|
||||
{
|
||||
char *edid_ext = NULL;
|
||||
int i, hdmi_id, edid_ext_num;
|
||||
int start_offset, end_offset;
|
||||
bool is_hdmi = false;
|
||||
|
||||
/* No EDID or EDID extensions */
|
||||
if (edid == NULL || edid->extensions == 0)
|
||||
goto end;
|
||||
|
||||
/* Chose real EDID extension number */
|
||||
edid_ext_num = edid->extensions > MAX_EDID_EXT_NUM ?
|
||||
MAX_EDID_EXT_NUM : edid->extensions;
|
||||
|
||||
/* Find CEA extension */
|
||||
for (i = 0; i < edid_ext_num; i++) {
|
||||
edid_ext = (char *)edid + EDID_LENGTH * (i + 1);
|
||||
/* This block is CEA extension */
|
||||
if (edid_ext[0] == 0x02)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == edid_ext_num)
|
||||
goto end;
|
||||
|
||||
/* Data block offset in CEA extension block */
|
||||
start_offset = 4;
|
||||
end_offset = edid_ext[2];
|
||||
|
||||
/*
|
||||
* Because HDMI identifier is in Vendor Specific Block,
|
||||
* search it from all data blocks of CEA extension.
|
||||
*/
|
||||
for (i = start_offset; i < end_offset;
|
||||
/* Increased by data block len */
|
||||
i += ((edid_ext[i] & 0x1f) + 1)) {
|
||||
/* Find vendor specific block */
|
||||
if ((edid_ext[i] >> 5) == VENDOR_BLOCK) {
|
||||
hdmi_id = edid_ext[i + 1] | (edid_ext[i + 2] << 8) |
|
||||
edid_ext[i + 3] << 16;
|
||||
/* Find HDMI identifier */
|
||||
if (hdmi_id == HDMI_IDENTIFIER)
|
||||
is_hdmi = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
end:
|
||||
return is_hdmi;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_detect_hdmi_monitor);
|
||||
|
||||
/**
|
||||
* drm_add_edid_modes - add modes from EDID data, if available
|
||||
* @connector: connector we're probing
|
||||
|
|
|
@ -274,6 +274,7 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
|
|||
/* create a new master */
|
||||
priv->minor->master = drm_master_create(priv->minor);
|
||||
if (!priv->minor->master) {
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
ret = -ENOMEM;
|
||||
goto out_free;
|
||||
}
|
||||
|
|
|
@ -502,7 +502,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
|
|||
struct drm_file *priv = filp->private_data;
|
||||
struct drm_device *dev = priv->minor->dev;
|
||||
struct drm_gem_mm *mm = dev->mm_private;
|
||||
struct drm_map *map = NULL;
|
||||
struct drm_local_map *map = NULL;
|
||||
struct drm_gem_object *obj;
|
||||
struct drm_hash_item *hash;
|
||||
unsigned long prot;
|
||||
|
|
|
@ -72,7 +72,7 @@ int drm_vm_info(struct seq_file *m, void *data)
|
|||
{
|
||||
struct drm_info_node *node = (struct drm_info_node *) m->private;
|
||||
struct drm_device *dev = node->minor->dev;
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
struct drm_map_list *r_list;
|
||||
|
||||
/* Hardcoded from _DRM_FRAME_BUFFER,
|
||||
|
@ -94,9 +94,9 @@ int drm_vm_info(struct seq_file *m, void *data)
|
|||
else
|
||||
type = types[map->type];
|
||||
|
||||
seq_printf(m, "%4d 0x%08lx 0x%08lx %4.4s 0x%02x 0x%08lx ",
|
||||
seq_printf(m, "%4d 0x%016llx 0x%08lx %4.4s 0x%02x 0x%08lx ",
|
||||
i,
|
||||
map->offset,
|
||||
(unsigned long long)map->offset,
|
||||
map->size, type, map->flags,
|
||||
(unsigned long) r_list->user_token);
|
||||
if (map->mtrr < 0)
|
||||
|
|
|
@ -954,6 +954,7 @@ static int compat_drm_sg_free(struct file *file, unsigned int cmd,
|
|||
DRM_IOCTL_SG_FREE, (unsigned long)request);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
||||
typedef struct drm_update_draw32 {
|
||||
drm_drawable_t handle;
|
||||
unsigned int type;
|
||||
|
@ -984,6 +985,7 @@ static int compat_drm_update_draw(struct file *file, unsigned int cmd,
|
|||
DRM_IOCTL_UPDATE_DRAW, (unsigned long)request);
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct drm_wait_vblank_request32 {
|
||||
enum drm_vblank_seq_type type;
|
||||
|
@ -1066,7 +1068,9 @@ drm_ioctl_compat_t *drm_compat_ioctls[] = {
|
|||
#endif
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_SG_ALLOC32)] = compat_drm_sg_alloc,
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_SG_FREE32)] = compat_drm_sg_free,
|
||||
#if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw,
|
||||
#endif
|
||||
[DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank,
|
||||
};
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ static inline void *agp_remap(unsigned long offset, unsigned long size,
|
|||
|
||||
#endif /* debug_memory */
|
||||
|
||||
void drm_core_ioremap(struct drm_map *map, struct drm_device *dev)
|
||||
void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev)
|
||||
{
|
||||
if (drm_core_has_AGP(dev) &&
|
||||
dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP)
|
||||
|
@ -169,7 +169,7 @@ void drm_core_ioremap(struct drm_map *map, struct drm_device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_core_ioremap);
|
||||
|
||||
void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev)
|
||||
void drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev)
|
||||
{
|
||||
if (drm_core_has_AGP(dev) &&
|
||||
dev->agp && dev->agp->cant_use_aperture && map->type == _DRM_AGP)
|
||||
|
@ -179,7 +179,7 @@ void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_core_ioremap_wc);
|
||||
|
||||
void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev)
|
||||
void drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev)
|
||||
{
|
||||
if (!map->handle || !map->size)
|
||||
return;
|
||||
|
|
|
@ -40,7 +40,6 @@
|
|||
#include <linux/seq_file.h>
|
||||
#include "drmP.h"
|
||||
|
||||
|
||||
/***************************************************
|
||||
* Initialization, etc.
|
||||
**************************************************/
|
||||
|
|
|
@ -381,6 +381,7 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
|
|||
}
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET)) {
|
||||
pci_set_drvdata(pdev, dev);
|
||||
ret = drm_get_minor(dev, &dev->control, DRM_MINOR_CONTROL);
|
||||
if (ret)
|
||||
goto err_g2;
|
||||
|
@ -404,9 +405,9 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
|
|||
|
||||
list_add_tail(&dev->driver_item, &driver->device_list);
|
||||
|
||||
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
|
||||
DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n",
|
||||
driver->name, driver->major, driver->minor, driver->patchlevel,
|
||||
driver->date, dev->primary->index);
|
||||
driver->date, pci_name(pdev), dev->primary->index);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -418,29 +419,7 @@ err_g1:
|
|||
drm_free(dev, sizeof(*dev), DRM_MEM_STUB);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Put a device minor number.
|
||||
*
|
||||
* \param dev device data structure
|
||||
* \return always zero
|
||||
*
|
||||
* Cleans up the proc resources. If it is the last minor then release the foreign
|
||||
* "drm" data, otherwise unregisters the "drm" data, frees the dev list and
|
||||
* unregisters the character device.
|
||||
*/
|
||||
int drm_put_dev(struct drm_device * dev)
|
||||
{
|
||||
DRM_DEBUG("release primary %s\n", dev->driver->pci_driver.name);
|
||||
|
||||
if (dev->devname) {
|
||||
drm_free(dev->devname, strlen(dev->devname) + 1,
|
||||
DRM_MEM_DRIVER);
|
||||
dev->devname = NULL;
|
||||
}
|
||||
drm_free(dev, sizeof(*dev), DRM_MEM_STUB);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_get_dev);
|
||||
|
||||
/**
|
||||
* Put a secondary minor number.
|
||||
|
@ -472,3 +451,67 @@ int drm_put_minor(struct drm_minor **minor_p)
|
|||
*minor_p = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called via drm_exit() at module unload time or when pci device is
|
||||
* unplugged.
|
||||
*
|
||||
* Cleans up all DRM device, calling drm_lastclose().
|
||||
*
|
||||
* \sa drm_init
|
||||
*/
|
||||
void drm_put_dev(struct drm_device *dev)
|
||||
{
|
||||
struct drm_driver *driver = dev->driver;
|
||||
struct drm_map_list *r_list, *list_temp;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
if (!dev) {
|
||||
DRM_ERROR("cleanup called no dev\n");
|
||||
return;
|
||||
}
|
||||
|
||||
drm_vblank_cleanup(dev);
|
||||
|
||||
drm_lastclose(dev);
|
||||
|
||||
if (drm_core_has_MTRR(dev) && drm_core_has_AGP(dev) &&
|
||||
dev->agp && dev->agp->agp_mtrr >= 0) {
|
||||
int retval;
|
||||
retval = mtrr_del(dev->agp->agp_mtrr,
|
||||
dev->agp->agp_info.aper_base,
|
||||
dev->agp->agp_info.aper_size * 1024 * 1024);
|
||||
DRM_DEBUG("mtrr_del=%d\n", retval);
|
||||
}
|
||||
|
||||
if (dev->driver->unload)
|
||||
dev->driver->unload(dev);
|
||||
|
||||
if (drm_core_has_AGP(dev) && dev->agp) {
|
||||
drm_free(dev->agp, sizeof(*dev->agp), DRM_MEM_AGPLISTS);
|
||||
dev->agp = NULL;
|
||||
}
|
||||
|
||||
drm_ht_remove(&dev->map_hash);
|
||||
drm_ctxbitmap_cleanup(dev);
|
||||
|
||||
list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
|
||||
drm_rmmap(dev, r_list->map);
|
||||
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
drm_put_minor(&dev->control);
|
||||
|
||||
if (driver->driver_features & DRIVER_GEM)
|
||||
drm_gem_destroy(dev);
|
||||
|
||||
drm_put_minor(&dev->primary);
|
||||
|
||||
if (dev->devname) {
|
||||
drm_free(dev->devname, strlen(dev->devname) + 1,
|
||||
DRM_MEM_DRIVER);
|
||||
dev->devname = NULL;
|
||||
}
|
||||
drm_free(dev, sizeof(*dev), DRM_MEM_STUB);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_put_dev);
|
||||
|
|
|
@ -35,7 +35,9 @@ static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
|
|||
struct drm_minor *drm_minor = to_drm_minor(dev);
|
||||
struct drm_device *drm_dev = drm_minor->dev;
|
||||
|
||||
if (drm_minor->type == DRM_MINOR_LEGACY && drm_dev->driver->suspend)
|
||||
if (drm_minor->type == DRM_MINOR_LEGACY &&
|
||||
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
||||
drm_dev->driver->suspend)
|
||||
return drm_dev->driver->suspend(drm_dev, state);
|
||||
|
||||
return 0;
|
||||
|
@ -53,7 +55,9 @@ static int drm_sysfs_resume(struct device *dev)
|
|||
struct drm_minor *drm_minor = to_drm_minor(dev);
|
||||
struct drm_device *drm_dev = drm_minor->dev;
|
||||
|
||||
if (drm_minor->type == DRM_MINOR_LEGACY && drm_dev->driver->resume)
|
||||
if (drm_minor->type == DRM_MINOR_LEGACY &&
|
||||
!drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
|
||||
drm_dev->driver->resume)
|
||||
return drm_dev->driver->resume(drm_dev);
|
||||
|
||||
return 0;
|
||||
|
@ -118,20 +122,6 @@ void drm_sysfs_destroy(void)
|
|||
class_destroy(drm_class);
|
||||
}
|
||||
|
||||
static ssize_t show_dri(struct device *device, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct drm_minor *drm_minor = to_drm_minor(device);
|
||||
struct drm_device *drm_dev = drm_minor->dev;
|
||||
if (drm_dev->driver->dri_library_name)
|
||||
return drm_dev->driver->dri_library_name(drm_dev, buf);
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", drm_dev->driver->pci_driver.name);
|
||||
}
|
||||
|
||||
static struct device_attribute device_attrs[] = {
|
||||
__ATTR(dri_library_name, S_IRUGO, show_dri, NULL),
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_sysfs_device_release - do nothing
|
||||
* @dev: Linux device
|
||||
|
@ -474,7 +464,6 @@ void drm_sysfs_hotplug_event(struct drm_device *dev)
|
|||
int drm_sysfs_device_add(struct drm_minor *minor)
|
||||
{
|
||||
int err;
|
||||
int i, j;
|
||||
char *minor_str;
|
||||
|
||||
minor->kdev.parent = &minor->dev->pdev->dev;
|
||||
|
@ -496,18 +485,8 @@ int drm_sysfs_device_add(struct drm_minor *minor)
|
|||
goto err_out;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(device_attrs); i++) {
|
||||
err = device_create_file(&minor->kdev, &device_attrs[i]);
|
||||
if (err)
|
||||
goto err_out_files;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_files:
|
||||
if (i > 0)
|
||||
for (j = 0; j < i; j++)
|
||||
device_remove_file(&minor->kdev, &device_attrs[j]);
|
||||
device_unregister(&minor->kdev);
|
||||
err_out:
|
||||
|
||||
|
@ -523,9 +502,5 @@ err_out:
|
|||
*/
|
||||
void drm_sysfs_device_remove(struct drm_minor *minor)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(device_attrs); i++)
|
||||
device_remove_file(&minor->kdev, &device_attrs[i]);
|
||||
device_unregister(&minor->kdev);
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ static int drm_do_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
{
|
||||
struct drm_file *priv = vma->vm_file->private_data;
|
||||
struct drm_device *dev = priv->minor->dev;
|
||||
struct drm_map *map = NULL;
|
||||
struct drm_local_map *map = NULL;
|
||||
struct drm_map_list *r_list;
|
||||
struct drm_hash_item *hash;
|
||||
|
||||
|
@ -115,9 +115,9 @@ static int drm_do_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
* Using vm_pgoff as a selector forces us to use this unusual
|
||||
* addressing scheme.
|
||||
*/
|
||||
unsigned long offset = (unsigned long)vmf->virtual_address -
|
||||
vma->vm_start;
|
||||
unsigned long baddr = map->offset + offset;
|
||||
resource_size_t offset = (unsigned long)vmf->virtual_address -
|
||||
vma->vm_start;
|
||||
resource_size_t baddr = map->offset + offset;
|
||||
struct drm_agp_mem *agpmem;
|
||||
struct page *page;
|
||||
|
||||
|
@ -149,8 +149,10 @@ static int drm_do_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
vmf->page = page;
|
||||
|
||||
DRM_DEBUG
|
||||
("baddr = 0x%lx page = 0x%p, offset = 0x%lx, count=%d\n",
|
||||
baddr, __va(agpmem->memory->memory[offset]), offset,
|
||||
("baddr = 0x%llx page = 0x%p, offset = 0x%llx, count=%d\n",
|
||||
(unsigned long long)baddr,
|
||||
__va(agpmem->memory->memory[offset]),
|
||||
(unsigned long long)offset,
|
||||
page_count(page));
|
||||
return 0;
|
||||
}
|
||||
|
@ -176,7 +178,7 @@ static int drm_do_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
*/
|
||||
static int drm_do_vm_shm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
{
|
||||
struct drm_map *map = (struct drm_map *) vma->vm_private_data;
|
||||
struct drm_local_map *map = vma->vm_private_data;
|
||||
unsigned long offset;
|
||||
unsigned long i;
|
||||
struct page *page;
|
||||
|
@ -209,7 +211,7 @@ static void drm_vm_shm_close(struct vm_area_struct *vma)
|
|||
struct drm_file *priv = vma->vm_file->private_data;
|
||||
struct drm_device *dev = priv->minor->dev;
|
||||
struct drm_vma_entry *pt, *temp;
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
struct drm_map_list *r_list;
|
||||
int found_maps = 0;
|
||||
|
||||
|
@ -322,7 +324,7 @@ static int drm_do_vm_dma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
|||
*/
|
||||
static int drm_do_vm_sg_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
{
|
||||
struct drm_map *map = (struct drm_map *) vma->vm_private_data;
|
||||
struct drm_local_map *map = vma->vm_private_data;
|
||||
struct drm_file *priv = vma->vm_file->private_data;
|
||||
struct drm_device *dev = priv->minor->dev;
|
||||
struct drm_sg_mem *entry = dev->sg;
|
||||
|
@ -512,14 +514,14 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma)
|
|||
return 0;
|
||||
}
|
||||
|
||||
unsigned long drm_core_get_map_ofs(struct drm_map * map)
|
||||
resource_size_t drm_core_get_map_ofs(struct drm_local_map * map)
|
||||
{
|
||||
return map->offset;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_core_get_map_ofs);
|
||||
|
||||
unsigned long drm_core_get_reg_ofs(struct drm_device *dev)
|
||||
resource_size_t drm_core_get_reg_ofs(struct drm_device *dev)
|
||||
{
|
||||
#ifdef __alpha__
|
||||
return dev->hose->dense_mem_base - dev->hose->mem_space->start;
|
||||
|
@ -547,8 +549,8 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
|
|||
{
|
||||
struct drm_file *priv = filp->private_data;
|
||||
struct drm_device *dev = priv->minor->dev;
|
||||
struct drm_map *map = NULL;
|
||||
unsigned long offset = 0;
|
||||
struct drm_local_map *map = NULL;
|
||||
resource_size_t offset = 0;
|
||||
struct drm_hash_item *hash;
|
||||
|
||||
DRM_DEBUG("start = 0x%lx, end = 0x%lx, page offset = 0x%lx\n",
|
||||
|
@ -623,9 +625,9 @@ int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
|
|||
vma->vm_page_prot))
|
||||
return -EAGAIN;
|
||||
DRM_DEBUG(" Type = %d; start = 0x%lx, end = 0x%lx,"
|
||||
" offset = 0x%lx\n",
|
||||
" offset = 0x%llx\n",
|
||||
map->type,
|
||||
vma->vm_start, vma->vm_end, map->offset + offset);
|
||||
vma->vm_start, vma->vm_end, (unsigned long long)(map->offset + offset));
|
||||
vma->vm_ops = &drm_vm_ops;
|
||||
break;
|
||||
case _DRM_CONSISTENT:
|
||||
|
|
|
@ -77,8 +77,8 @@ typedef struct _drm_i810_ring_buffer {
|
|||
} drm_i810_ring_buffer_t;
|
||||
|
||||
typedef struct drm_i810_private {
|
||||
struct drm_map *sarea_map;
|
||||
struct drm_map *mmio_map;
|
||||
struct drm_local_map *sarea_map;
|
||||
struct drm_local_map *mmio_map;
|
||||
|
||||
drm_i810_sarea_t *sarea_priv;
|
||||
drm_i810_ring_buffer_t ring;
|
||||
|
|
|
@ -84,8 +84,8 @@ typedef struct _drm_i830_ring_buffer {
|
|||
} drm_i830_ring_buffer_t;
|
||||
|
||||
typedef struct drm_i830_private {
|
||||
struct drm_map *sarea_map;
|
||||
struct drm_map *mmio_map;
|
||||
struct drm_local_map *sarea_map;
|
||||
struct drm_local_map *mmio_map;
|
||||
|
||||
drm_i830_sarea_t *sarea_priv;
|
||||
drm_i830_ring_buffer_t ring;
|
||||
|
|
|
@ -1099,7 +1099,7 @@ void i915_master_destroy(struct drm_device *dev, struct drm_master *master)
|
|||
int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
unsigned long base, size;
|
||||
resource_size_t base, size;
|
||||
int ret = 0, mmio_bar = IS_I9XX(dev) ? 0 : 1;
|
||||
|
||||
/* i915 has 4 more counters */
|
||||
|
|
|
@ -42,6 +42,8 @@ module_param_named(modeset, i915_modeset, int, 0400);
|
|||
unsigned int i915_fbpercrtc = 0;
|
||||
module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
|
||||
|
||||
static struct drm_driver driver;
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
i915_PCI_IDS
|
||||
};
|
||||
|
@ -117,6 +119,36 @@ static int i915_resume(struct drm_device *dev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
return drm_get_dev(pdev, ent, &driver);
|
||||
}
|
||||
|
||||
static void
|
||||
i915_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
|
||||
drm_put_dev(dev);
|
||||
}
|
||||
|
||||
static int
|
||||
i915_pci_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
|
||||
return i915_suspend(dev, state);
|
||||
}
|
||||
|
||||
static int
|
||||
i915_pci_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct drm_device *dev = pci_get_drvdata(pdev);
|
||||
|
||||
return i915_resume(dev);
|
||||
}
|
||||
|
||||
static struct vm_operations_struct i915_gem_vm_ops = {
|
||||
.fault = i915_gem_fault,
|
||||
.open = drm_gem_vm_open,
|
||||
|
@ -174,6 +206,12 @@ static struct drm_driver driver = {
|
|||
.pci_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.id_table = pciidlist,
|
||||
.probe = i915_pci_probe,
|
||||
.remove = i915_pci_remove,
|
||||
#ifdef CONFIG_PM
|
||||
.resume = i915_pci_resume,
|
||||
.suspend = i915_pci_suspend,
|
||||
#endif
|
||||
},
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
|
|
|
@ -446,13 +446,16 @@ fast_shmem_write(struct page **pages,
|
|||
int length)
|
||||
{
|
||||
char __iomem *vaddr;
|
||||
unsigned long unwritten;
|
||||
|
||||
vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0);
|
||||
if (vaddr == NULL)
|
||||
return -ENOMEM;
|
||||
__copy_from_user_inatomic(vaddr + page_offset, data, length);
|
||||
unwritten = __copy_from_user_inatomic(vaddr + page_offset, data, length);
|
||||
kunmap_atomic(vaddr, KM_USER0);
|
||||
|
||||
if (unwritten)
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1093,7 +1096,7 @@ i915_gem_create_mmap_offset(struct drm_gem_object *obj)
|
|||
struct drm_gem_mm *mm = dev->mm_private;
|
||||
struct drm_i915_gem_object *obj_priv = obj->driver_private;
|
||||
struct drm_map_list *list;
|
||||
struct drm_map *map;
|
||||
struct drm_local_map *map;
|
||||
int ret = 0;
|
||||
|
||||
/* Set the object up for mmap'ing */
|
||||
|
|
|
@ -148,8 +148,8 @@ void mga_do_dma_flush(drm_mga_private_t * dev_priv)
|
|||
primary->space = head - tail;
|
||||
}
|
||||
|
||||
DRM_DEBUG(" head = 0x%06lx\n", head - dev_priv->primary->offset);
|
||||
DRM_DEBUG(" tail = 0x%06lx\n", tail - dev_priv->primary->offset);
|
||||
DRM_DEBUG(" head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset));
|
||||
DRM_DEBUG(" tail = 0x%06lx\n", (unsigned long)(tail - dev_priv->primary->offset));
|
||||
DRM_DEBUG(" space = 0x%06x\n", primary->space);
|
||||
|
||||
mga_flush_write_combine();
|
||||
|
@ -187,7 +187,7 @@ void mga_do_dma_wrap_start(drm_mga_private_t * dev_priv)
|
|||
primary->space = head - dev_priv->primary->offset;
|
||||
}
|
||||
|
||||
DRM_DEBUG(" head = 0x%06lx\n", head - dev_priv->primary->offset);
|
||||
DRM_DEBUG(" head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset));
|
||||
DRM_DEBUG(" tail = 0x%06x\n", primary->tail);
|
||||
DRM_DEBUG(" wrap = %d\n", primary->last_wrap);
|
||||
DRM_DEBUG(" space = 0x%06x\n", primary->space);
|
||||
|
@ -239,7 +239,7 @@ static void mga_freelist_print(struct drm_device * dev)
|
|||
for (entry = dev_priv->head->next; entry; entry = entry->next) {
|
||||
DRM_INFO(" %p idx=%2d age=0x%x 0x%06lx\n",
|
||||
entry, entry->buf->idx, entry->age.head,
|
||||
entry->age.head - dev_priv->primary->offset);
|
||||
(unsigned long)(entry->age.head - dev_priv->primary->offset));
|
||||
}
|
||||
DRM_INFO("\n");
|
||||
}
|
||||
|
@ -340,10 +340,10 @@ static struct drm_buf *mga_freelist_get(struct drm_device * dev)
|
|||
|
||||
DRM_DEBUG(" tail=0x%06lx %d\n",
|
||||
tail->age.head ?
|
||||
tail->age.head - dev_priv->primary->offset : 0,
|
||||
(unsigned long)(tail->age.head - dev_priv->primary->offset) : 0,
|
||||
tail->age.wrap);
|
||||
DRM_DEBUG(" head=0x%06lx %d\n",
|
||||
head - dev_priv->primary->offset, wrap);
|
||||
(unsigned long)(head - dev_priv->primary->offset), wrap);
|
||||
|
||||
if (TEST_AGE(&tail->age, head, wrap)) {
|
||||
prev = dev_priv->tail->prev;
|
||||
|
@ -366,8 +366,9 @@ int mga_freelist_put(struct drm_device * dev, struct drm_buf * buf)
|
|||
drm_mga_freelist_t *head, *entry, *prev;
|
||||
|
||||
DRM_DEBUG("age=0x%06lx wrap=%d\n",
|
||||
buf_priv->list_entry->age.head -
|
||||
dev_priv->primary->offset, buf_priv->list_entry->age.wrap);
|
||||
(unsigned long)(buf_priv->list_entry->age.head -
|
||||
dev_priv->primary->offset),
|
||||
buf_priv->list_entry->age.wrap);
|
||||
|
||||
entry = buf_priv->list_entry;
|
||||
head = dev_priv->head;
|
||||
|
|
|
@ -113,8 +113,8 @@ typedef struct drm_mga_private {
|
|||
* \sa drm_mga_private_t::mmio
|
||||
*/
|
||||
/*@{ */
|
||||
u32 mmio_base; /**< Bus address of base of MMIO. */
|
||||
u32 mmio_size; /**< Size of the MMIO region. */
|
||||
resource_size_t mmio_base; /**< Bus address of base of MMIO. */
|
||||
resource_size_t mmio_size; /**< Size of the MMIO region. */
|
||||
/*@} */
|
||||
|
||||
u32 clear_cmd;
|
||||
|
@ -317,8 +317,8 @@ do { \
|
|||
DRM_INFO( "\n" ); \
|
||||
DRM_INFO( " tail=0x%06x head=0x%06lx\n", \
|
||||
dev_priv->prim.tail, \
|
||||
MGA_READ( MGA_PRIMADDRESS ) - \
|
||||
dev_priv->primary->offset ); \
|
||||
(unsigned long)(MGA_READ(MGA_PRIMADDRESS) - \
|
||||
dev_priv->primary->offset)); \
|
||||
} \
|
||||
if ( !test_bit( 0, &dev_priv->prim.wrapped ) ) { \
|
||||
if ( dev_priv->prim.space < \
|
||||
|
|
|
@ -525,11 +525,12 @@ static int r128_do_init_cce(struct drm_device * dev, drm_r128_init_t * init)
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
dev_priv->cce_ring->handle = (void *)dev_priv->cce_ring->offset;
|
||||
dev_priv->cce_ring->handle =
|
||||
(void *)(unsigned long)dev_priv->cce_ring->offset;
|
||||
dev_priv->ring_rptr->handle =
|
||||
(void *)dev_priv->ring_rptr->offset;
|
||||
(void *)(unsigned long)dev_priv->ring_rptr->offset;
|
||||
dev->agp_buffer_map->handle =
|
||||
(void *)dev->agp_buffer_map->offset;
|
||||
(void *)(unsigned long)dev->agp_buffer_map->offset;
|
||||
}
|
||||
|
||||
#if __OS_HAS_AGP
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
|
||||
|
||||
ccflags-y := -Iinclude/drm
|
||||
radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o
|
||||
radeon-y := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o r600_cp.o
|
||||
|
||||
radeon-$(CONFIG_COMPAT) += radeon_ioc32.o
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#include "radeon_drv.h"
|
||||
#include "r300_reg.h"
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#define R300_SIMULTANEOUS_CLIPRECTS 4
|
||||
|
||||
/* Values for R300_RE_CLIPRECT_CNTL depending on the number of cliprects
|
||||
|
@ -205,6 +207,10 @@ void r300_init_reg_flags(struct drm_device *dev)
|
|||
ADD_RANGE(0x42C0, 2);
|
||||
ADD_RANGE(R300_RS_CNTL_0, 2);
|
||||
|
||||
ADD_RANGE(R300_SU_REG_DEST, 1);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530)
|
||||
ADD_RANGE(RV530_FG_ZBREG_DEST, 1);
|
||||
|
||||
ADD_RANGE(R300_SC_HYPERZ, 2);
|
||||
ADD_RANGE(0x43E8, 1);
|
||||
|
||||
|
@ -230,6 +236,7 @@ void r300_init_reg_flags(struct drm_device *dev)
|
|||
ADD_RANGE(R300_ZB_DEPTHPITCH, 1);
|
||||
ADD_RANGE(R300_ZB_DEPTHCLEARVALUE, 1);
|
||||
ADD_RANGE(R300_ZB_ZMASK_OFFSET, 13);
|
||||
ADD_RANGE(R300_ZB_ZPASS_DATA, 2); /* ZB_ZPASS_DATA, ZB_ZPASS_ADDR */
|
||||
|
||||
ADD_RANGE(R300_TX_FILTER_0, 16);
|
||||
ADD_RANGE(R300_TX_FILTER1_0, 16);
|
||||
|
@ -917,6 +924,7 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
|
|||
{
|
||||
u32 *ref_age_base;
|
||||
u32 i, buf_idx, h_pending;
|
||||
u64 ptr_addr;
|
||||
RING_LOCALS;
|
||||
|
||||
if (cmdbuf->bufsz <
|
||||
|
@ -930,7 +938,8 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
|
|||
|
||||
dev_priv->scratch_ages[header.scratch.reg]++;
|
||||
|
||||
ref_age_base = (u32 *)(unsigned long)*((uint64_t *)cmdbuf->buf);
|
||||
ptr_addr = get_unaligned((u64 *)cmdbuf->buf);
|
||||
ref_age_base = (u32 *)(unsigned long)ptr_addr;
|
||||
|
||||
cmdbuf->buf += sizeof(u64);
|
||||
cmdbuf->bufsz -= sizeof(u64);
|
||||
|
|
|
@ -1770,4 +1770,9 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#define R500_RB3D_COLOR_CLEAR_VALUE_AR 0x46c0
|
||||
#define R500_RB3D_CONSTANT_COLOR_AR 0x4ef8
|
||||
|
||||
#define R300_SU_REG_DEST 0x42c8
|
||||
#define RV530_FG_ZBREG_DEST 0x4be8
|
||||
#define R300_ZB_ZPASS_DATA 0x4f58
|
||||
#define R300_ZB_ZPASS_ADDR 0x4f5c
|
||||
|
||||
#endif /* _R300_REG_H */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -43,6 +43,78 @@
|
|||
static int radeon_do_cleanup_cp(struct drm_device * dev);
|
||||
static void radeon_do_cp_start(drm_radeon_private_t * dev_priv);
|
||||
|
||||
u32 radeon_read_ring_rptr(drm_radeon_private_t *dev_priv, u32 off)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (dev_priv->flags & RADEON_IS_AGP) {
|
||||
val = DRM_READ32(dev_priv->ring_rptr, off);
|
||||
} else {
|
||||
val = *(((volatile u32 *)
|
||||
dev_priv->ring_rptr->handle) +
|
||||
(off / sizeof(u32)));
|
||||
val = le32_to_cpu(val);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
u32 radeon_get_ring_head(drm_radeon_private_t *dev_priv)
|
||||
{
|
||||
if (dev_priv->writeback_works)
|
||||
return radeon_read_ring_rptr(dev_priv, 0);
|
||||
else {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return RADEON_READ(R600_CP_RB_RPTR);
|
||||
else
|
||||
return RADEON_READ(RADEON_CP_RB_RPTR);
|
||||
}
|
||||
}
|
||||
|
||||
void radeon_write_ring_rptr(drm_radeon_private_t *dev_priv, u32 off, u32 val)
|
||||
{
|
||||
if (dev_priv->flags & RADEON_IS_AGP)
|
||||
DRM_WRITE32(dev_priv->ring_rptr, off, val);
|
||||
else
|
||||
*(((volatile u32 *) dev_priv->ring_rptr->handle) +
|
||||
(off / sizeof(u32))) = cpu_to_le32(val);
|
||||
}
|
||||
|
||||
void radeon_set_ring_head(drm_radeon_private_t *dev_priv, u32 val)
|
||||
{
|
||||
radeon_write_ring_rptr(dev_priv, 0, val);
|
||||
}
|
||||
|
||||
u32 radeon_get_scratch(drm_radeon_private_t *dev_priv, int index)
|
||||
{
|
||||
if (dev_priv->writeback_works) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return radeon_read_ring_rptr(dev_priv,
|
||||
R600_SCRATCHOFF(index));
|
||||
else
|
||||
return radeon_read_ring_rptr(dev_priv,
|
||||
RADEON_SCRATCHOFF(index));
|
||||
} else {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return RADEON_READ(R600_SCRATCH_REG0 + 4*index);
|
||||
else
|
||||
return RADEON_READ(RADEON_SCRATCH_REG0 + 4*index);
|
||||
}
|
||||
}
|
||||
|
||||
u32 RADEON_READ_MM(drm_radeon_private_t *dev_priv, int addr)
|
||||
{
|
||||
u32 ret;
|
||||
|
||||
if (addr < 0x10000)
|
||||
ret = DRM_READ32(dev_priv->mmio, addr);
|
||||
else {
|
||||
DRM_WRITE32(dev_priv->mmio, RADEON_MM_INDEX, addr);
|
||||
ret = DRM_READ32(dev_priv->mmio, RADEON_MM_DATA);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 R500_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
|
||||
{
|
||||
u32 ret;
|
||||
|
@ -70,11 +142,22 @@ static u32 RS690_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static u32 RS600_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
|
||||
{
|
||||
u32 ret;
|
||||
RADEON_WRITE(RS600_MC_INDEX, ((addr & RS600_MC_ADDR_MASK) |
|
||||
RS600_MC_IND_CITF_ARB0));
|
||||
ret = RADEON_READ(RS600_MC_DATA);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static u32 IGP_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
|
||||
{
|
||||
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
|
||||
return RS690_READ_MCIND(dev_priv, addr);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
return RS600_READ_MCIND(dev_priv, addr);
|
||||
else
|
||||
return RS480_READ_MCIND(dev_priv, addr);
|
||||
}
|
||||
|
@ -82,11 +165,17 @@ static u32 IGP_READ_MCIND(drm_radeon_private_t *dev_priv, int addr)
|
|||
u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv)
|
||||
{
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
|
||||
return RADEON_READ(R700_MC_VM_FB_LOCATION);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return RADEON_READ(R600_MC_VM_FB_LOCATION);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
return R500_READ_MCIND(dev_priv, RV515_MC_FB_LOCATION);
|
||||
else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
|
||||
return RS690_READ_MCIND(dev_priv, RS690_MC_FB_LOCATION);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
return RS600_READ_MCIND(dev_priv, RS600_MC_FB_LOCATION);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
|
||||
return R500_READ_MCIND(dev_priv, R520_MC_FB_LOCATION);
|
||||
else
|
||||
|
@ -95,42 +184,66 @@ u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv)
|
|||
|
||||
static void radeon_write_fb_location(drm_radeon_private_t *dev_priv, u32 fb_loc)
|
||||
{
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
|
||||
RADEON_WRITE(R700_MC_VM_FB_LOCATION, fb_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
RADEON_WRITE(R600_MC_VM_FB_LOCATION, fb_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
R500_WRITE_MCIND(RV515_MC_FB_LOCATION, fb_loc);
|
||||
else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
|
||||
RS690_WRITE_MCIND(RS690_MC_FB_LOCATION, fb_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
RS600_WRITE_MCIND(RS600_MC_FB_LOCATION, fb_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
|
||||
R500_WRITE_MCIND(R520_MC_FB_LOCATION, fb_loc);
|
||||
else
|
||||
RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc);
|
||||
}
|
||||
|
||||
static void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc)
|
||||
void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc)
|
||||
{
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
/*R6xx/R7xx: AGP_TOP and BOT are actually 18 bits each */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770) {
|
||||
RADEON_WRITE(R700_MC_VM_AGP_BOT, agp_loc & 0xffff); /* FIX ME */
|
||||
RADEON_WRITE(R700_MC_VM_AGP_TOP, (agp_loc >> 16) & 0xffff);
|
||||
} else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
|
||||
RADEON_WRITE(R600_MC_VM_AGP_BOT, agp_loc & 0xffff); /* FIX ME */
|
||||
RADEON_WRITE(R600_MC_VM_AGP_TOP, (agp_loc >> 16) & 0xffff);
|
||||
} else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515)
|
||||
R500_WRITE_MCIND(RV515_MC_AGP_LOCATION, agp_loc);
|
||||
else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740))
|
||||
RS690_WRITE_MCIND(RS690_MC_AGP_LOCATION, agp_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
RS600_WRITE_MCIND(RS600_MC_AGP_LOCATION, agp_loc);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515)
|
||||
R500_WRITE_MCIND(R520_MC_AGP_LOCATION, agp_loc);
|
||||
else
|
||||
RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc);
|
||||
}
|
||||
|
||||
static void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
|
||||
void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
|
||||
{
|
||||
u32 agp_base_hi = upper_32_bits(agp_base);
|
||||
u32 agp_base_lo = agp_base & 0xffffffff;
|
||||
u32 r6xx_agp_base = (agp_base >> 22) & 0x3ffff;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) {
|
||||
/* R6xx/R7xx must be aligned to a 4MB boundry */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV770)
|
||||
RADEON_WRITE(R700_MC_VM_AGP_BASE, r6xx_agp_base);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
RADEON_WRITE(R600_MC_VM_AGP_BASE, r6xx_agp_base);
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) {
|
||||
R500_WRITE_MCIND(RV515_MC_AGP_BASE, agp_base_lo);
|
||||
R500_WRITE_MCIND(RV515_MC_AGP_BASE_2, agp_base_hi);
|
||||
} else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
|
||||
RS690_WRITE_MCIND(RS690_MC_AGP_BASE, agp_base_lo);
|
||||
RS690_WRITE_MCIND(RS690_MC_AGP_BASE_2, agp_base_hi);
|
||||
} else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
|
||||
RS600_WRITE_MCIND(RS600_AGP_BASE, agp_base_lo);
|
||||
RS600_WRITE_MCIND(RS600_AGP_BASE_2, agp_base_hi);
|
||||
} else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) {
|
||||
R500_WRITE_MCIND(R520_MC_AGP_BASE, agp_base_lo);
|
||||
R500_WRITE_MCIND(R520_MC_AGP_BASE_2, agp_base_hi);
|
||||
|
@ -145,6 +258,25 @@ static void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base)
|
|||
}
|
||||
}
|
||||
|
||||
void radeon_enable_bm(struct drm_radeon_private *dev_priv)
|
||||
{
|
||||
u32 tmp;
|
||||
/* Turn on bus mastering */
|
||||
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
|
||||
/* rs600/rs690/rs740 */
|
||||
tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
|
||||
RADEON_WRITE(RADEON_BUS_CNTL, tmp);
|
||||
} else if (((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV350) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
|
||||
/* r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */
|
||||
tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
|
||||
RADEON_WRITE(RADEON_BUS_CNTL, tmp);
|
||||
} /* PCIE cards appears to not need this */
|
||||
}
|
||||
|
||||
static int RADEON_READ_PLL(struct drm_device * dev, int addr)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
|
@ -302,7 +434,7 @@ static void radeon_init_pipes(drm_radeon_private_t *dev_priv)
|
|||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) {
|
||||
RADEON_WRITE_PLL(R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4));
|
||||
RADEON_WRITE(R500_SU_REG_DEST, ((1 << dev_priv->num_gb_pipes) - 1));
|
||||
RADEON_WRITE(R300_SU_REG_DEST, ((1 << dev_priv->num_gb_pipes) - 1));
|
||||
}
|
||||
RADEON_WRITE(R300_GB_TILE_CONFIG, gb_tile_config);
|
||||
radeon_do_wait_for_idle(dev_priv);
|
||||
|
@ -382,6 +514,14 @@ static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv)
|
|||
RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
|
||||
RS690_cp_microcode[i][0]);
|
||||
}
|
||||
} else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
|
||||
DRM_INFO("Loading RS600 Microcode\n");
|
||||
for (i = 0; i < 256; i++) {
|
||||
RADEON_WRITE(RADEON_CP_ME_RAM_DATAH,
|
||||
RS600_cp_microcode[i][1]);
|
||||
RADEON_WRITE(RADEON_CP_ME_RAM_DATAL,
|
||||
RS600_cp_microcode[i][0]);
|
||||
}
|
||||
} else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R520) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV530) ||
|
||||
|
@ -562,7 +702,6 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
|
|||
{
|
||||
struct drm_radeon_master_private *master_priv;
|
||||
u32 ring_start, cur_read_ptr;
|
||||
u32 tmp;
|
||||
|
||||
/* Initialize the memory controller. With new memory map, the fb location
|
||||
* is not changed, it should have been properly initialized already. Part
|
||||
|
@ -611,17 +750,10 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
struct drm_sg_mem *entry = dev->sg;
|
||||
unsigned long tmp_ofs, page_ofs;
|
||||
|
||||
tmp_ofs = dev_priv->ring_rptr->offset -
|
||||
(unsigned long)dev->sg->virtual;
|
||||
page_ofs = tmp_ofs >> PAGE_SHIFT;
|
||||
|
||||
RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR, entry->busaddr[page_ofs]);
|
||||
DRM_DEBUG("ring rptr: offset=0x%08lx handle=0x%08lx\n",
|
||||
(unsigned long)entry->busaddr[page_ofs],
|
||||
entry->handle + tmp_ofs);
|
||||
RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,
|
||||
dev_priv->ring_rptr->offset
|
||||
- ((unsigned long) dev->sg->virtual)
|
||||
+ dev_priv->gart_vm_start);
|
||||
}
|
||||
|
||||
/* Set ring buffer size */
|
||||
|
@ -649,34 +781,17 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev,
|
|||
RADEON_WRITE(RADEON_SCRATCH_ADDR, RADEON_READ(RADEON_CP_RB_RPTR_ADDR)
|
||||
+ RADEON_SCRATCH_REG_OFFSET);
|
||||
|
||||
dev_priv->scratch = ((__volatile__ u32 *)
|
||||
dev_priv->ring_rptr->handle +
|
||||
(RADEON_SCRATCH_REG_OFFSET / sizeof(u32)));
|
||||
|
||||
RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7);
|
||||
|
||||
/* Turn on bus mastering */
|
||||
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) {
|
||||
/* rs600/rs690/rs740 */
|
||||
tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
|
||||
RADEON_WRITE(RADEON_BUS_CNTL, tmp);
|
||||
} else if (((dev_priv->flags & RADEON_FAMILY_MASK) <= CHIP_RV350) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) ||
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS480)) {
|
||||
/* r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */
|
||||
tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
|
||||
RADEON_WRITE(RADEON_BUS_CNTL, tmp);
|
||||
} /* PCIE cards appears to not need this */
|
||||
radeon_enable_bm(dev_priv);
|
||||
|
||||
dev_priv->scratch[0] = 0;
|
||||
radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(0), 0);
|
||||
RADEON_WRITE(RADEON_LAST_FRAME_REG, 0);
|
||||
|
||||
dev_priv->scratch[1] = 0;
|
||||
radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1), 0);
|
||||
RADEON_WRITE(RADEON_LAST_DISPATCH_REG, 0);
|
||||
|
||||
dev_priv->scratch[2] = 0;
|
||||
radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(2), 0);
|
||||
RADEON_WRITE(RADEON_LAST_CLEAR_REG, 0);
|
||||
|
||||
/* reset sarea copies of these */
|
||||
|
@ -708,12 +823,15 @@ static void radeon_test_writeback(drm_radeon_private_t * dev_priv)
|
|||
/* Writeback doesn't seem to work everywhere, test it here and possibly
|
||||
* enable it if it appears to work
|
||||
*/
|
||||
DRM_WRITE32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1), 0);
|
||||
radeon_write_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1), 0);
|
||||
|
||||
RADEON_WRITE(RADEON_SCRATCH_REG1, 0xdeadbeef);
|
||||
|
||||
for (tmp = 0; tmp < dev_priv->usec_timeout; tmp++) {
|
||||
if (DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1)) ==
|
||||
0xdeadbeef)
|
||||
u32 val;
|
||||
|
||||
val = radeon_read_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1));
|
||||
if (val == 0xdeadbeef)
|
||||
break;
|
||||
DRM_UDELAY(1);
|
||||
}
|
||||
|
@ -809,6 +927,82 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on)
|
|||
}
|
||||
}
|
||||
|
||||
/* Enable or disable IGP GART on the chip */
|
||||
static void rs600_set_igpgart(drm_radeon_private_t *dev_priv, int on)
|
||||
{
|
||||
u32 temp;
|
||||
int i;
|
||||
|
||||
if (on) {
|
||||
DRM_DEBUG("programming igp gart %08X %08lX %08X\n",
|
||||
dev_priv->gart_vm_start,
|
||||
(long)dev_priv->gart_info.bus_addr,
|
||||
dev_priv->gart_size);
|
||||
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (RS600_EFFECTIVE_L2_CACHE_SIZE(6) |
|
||||
RS600_EFFECTIVE_L2_QUEUE_SIZE(6)));
|
||||
|
||||
for (i = 0; i < 19; i++)
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CLIENT0_CNTL + i,
|
||||
(RS600_ENABLE_TRANSLATION_MODE_OVERRIDE |
|
||||
RS600_SYSTEM_ACCESS_MODE_IN_SYS |
|
||||
RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASSTHROUGH |
|
||||
RS600_EFFECTIVE_L1_CACHE_SIZE(3) |
|
||||
RS600_ENABLE_FRAGMENT_PROCESSING |
|
||||
RS600_EFFECTIVE_L1_QUEUE_SIZE(3)));
|
||||
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL, (RS600_ENABLE_PAGE_TABLE |
|
||||
RS600_PAGE_TABLE_TYPE_FLAT));
|
||||
|
||||
/* disable all other contexts */
|
||||
for (i = 1; i < 8; i++)
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL + i, 0);
|
||||
|
||||
/* setup the page table aperture */
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
|
||||
dev_priv->gart_info.bus_addr);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR,
|
||||
dev_priv->gart_vm_start);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR,
|
||||
(dev_priv->gart_vm_start + dev_priv->gart_size - 1));
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
|
||||
|
||||
/* setup the system aperture */
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR,
|
||||
dev_priv->gart_vm_start);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
(dev_priv->gart_vm_start + dev_priv->gart_size - 1));
|
||||
|
||||
/* enable page tables */
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (temp | RS600_ENABLE_PT));
|
||||
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_CNTL1);
|
||||
IGP_WRITE_MCIND(RS600_MC_CNTL1, (temp | RS600_ENABLE_PAGE_TABLES));
|
||||
|
||||
/* invalidate the cache */
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
|
||||
|
||||
temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
|
||||
|
||||
temp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE;
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
|
||||
|
||||
temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp);
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL);
|
||||
|
||||
} else {
|
||||
IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, 0);
|
||||
temp = IGP_READ_MCIND(dev_priv, RS600_MC_CNTL1);
|
||||
temp &= ~RS600_ENABLE_PAGE_TABLES;
|
||||
IGP_WRITE_MCIND(RS600_MC_CNTL1, temp);
|
||||
}
|
||||
}
|
||||
|
||||
static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on)
|
||||
{
|
||||
u32 tmp = RADEON_READ_PCIE(dev_priv, RADEON_PCIE_TX_GART_CNTL);
|
||||
|
@ -850,6 +1044,11 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
|
|||
return;
|
||||
}
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) {
|
||||
rs600_set_igpgart(dev_priv, on);
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev_priv->flags & RADEON_IS_PCIE) {
|
||||
radeon_set_pciegart(dev_priv, on);
|
||||
return;
|
||||
|
@ -881,6 +1080,46 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)
|
|||
}
|
||||
}
|
||||
|
||||
static int radeon_setup_pcigart_surface(drm_radeon_private_t *dev_priv)
|
||||
{
|
||||
struct drm_ati_pcigart_info *gart_info = &dev_priv->gart_info;
|
||||
struct radeon_virt_surface *vp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < RADEON_MAX_SURFACES * 2; i++) {
|
||||
if (!dev_priv->virt_surfaces[i].file_priv ||
|
||||
dev_priv->virt_surfaces[i].file_priv == PCIGART_FILE_PRIV)
|
||||
break;
|
||||
}
|
||||
if (i >= 2 * RADEON_MAX_SURFACES)
|
||||
return -ENOMEM;
|
||||
vp = &dev_priv->virt_surfaces[i];
|
||||
|
||||
for (i = 0; i < RADEON_MAX_SURFACES; i++) {
|
||||
struct radeon_surface *sp = &dev_priv->surfaces[i];
|
||||
if (sp->refcount)
|
||||
continue;
|
||||
|
||||
vp->surface_index = i;
|
||||
vp->lower = gart_info->bus_addr;
|
||||
vp->upper = vp->lower + gart_info->table_size;
|
||||
vp->flags = 0;
|
||||
vp->file_priv = PCIGART_FILE_PRIV;
|
||||
|
||||
sp->refcount = 1;
|
||||
sp->lower = vp->lower;
|
||||
sp->upper = vp->upper;
|
||||
sp->flags = 0;
|
||||
|
||||
RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, sp->flags);
|
||||
RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND + 16 * i, sp->lower);
|
||||
RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND + 16 * i, sp->upper);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int radeon_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
|
@ -1062,11 +1301,12 @@ static int radeon_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
dev_priv->cp_ring->handle = (void *)dev_priv->cp_ring->offset;
|
||||
dev_priv->cp_ring->handle =
|
||||
(void *)(unsigned long)dev_priv->cp_ring->offset;
|
||||
dev_priv->ring_rptr->handle =
|
||||
(void *)dev_priv->ring_rptr->offset;
|
||||
(void *)(unsigned long)dev_priv->ring_rptr->offset;
|
||||
dev->agp_buffer_map->handle =
|
||||
(void *)dev->agp_buffer_map->offset;
|
||||
(void *)(unsigned long)dev->agp_buffer_map->offset;
|
||||
|
||||
DRM_DEBUG("dev_priv->cp_ring->handle %p\n",
|
||||
dev_priv->cp_ring->handle);
|
||||
|
@ -1173,11 +1413,14 @@ static int radeon_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
|
|||
} else
|
||||
#endif
|
||||
{
|
||||
u32 sctrl;
|
||||
int ret;
|
||||
|
||||
dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
|
||||
/* if we have an offset set from userspace */
|
||||
if (dev_priv->pcigart_offset_set) {
|
||||
dev_priv->gart_info.bus_addr =
|
||||
dev_priv->pcigart_offset + dev_priv->fb_location;
|
||||
(resource_size_t)dev_priv->pcigart_offset + dev_priv->fb_location;
|
||||
dev_priv->gart_info.mapping.offset =
|
||||
dev_priv->pcigart_offset + dev_priv->fb_aper_offset;
|
||||
dev_priv->gart_info.mapping.size =
|
||||
|
@ -1214,12 +1457,31 @@ static int radeon_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
|
|||
}
|
||||
}
|
||||
|
||||
if (!drm_ati_pcigart_init(dev, &dev_priv->gart_info)) {
|
||||
sctrl = RADEON_READ(RADEON_SURFACE_CNTL);
|
||||
RADEON_WRITE(RADEON_SURFACE_CNTL, 0);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
ret = r600_page_table_init(dev);
|
||||
else
|
||||
ret = drm_ati_pcigart_init(dev, &dev_priv->gart_info);
|
||||
RADEON_WRITE(RADEON_SURFACE_CNTL, sctrl);
|
||||
|
||||
if (!ret) {
|
||||
DRM_ERROR("failed to init PCI GART!\n");
|
||||
radeon_do_cleanup_cp(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = radeon_setup_pcigart_surface(dev_priv);
|
||||
if (ret) {
|
||||
DRM_ERROR("failed to setup GART surface!\n");
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
r600_page_table_cleanup(dev, &dev_priv->gart_info);
|
||||
else
|
||||
drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info);
|
||||
radeon_do_cleanup_cp(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Turn on PCI GART */
|
||||
radeon_set_pcigart(dev_priv, 1);
|
||||
}
|
||||
|
@ -1268,14 +1530,18 @@ static int radeon_do_cleanup_cp(struct drm_device * dev)
|
|||
if (dev_priv->gart_info.bus_addr) {
|
||||
/* Turn off PCI GART */
|
||||
radeon_set_pcigart(dev_priv, 0);
|
||||
if (!drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info))
|
||||
DRM_ERROR("failed to cleanup PCI GART!\n");
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600)
|
||||
r600_page_table_cleanup(dev, &dev_priv->gart_info);
|
||||
else {
|
||||
if (!drm_ati_pcigart_cleanup(dev, &dev_priv->gart_info))
|
||||
DRM_ERROR("failed to cleanup PCI GART!\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (dev_priv->gart_info.gart_table_location == DRM_ATI_GART_FB)
|
||||
{
|
||||
drm_core_ioremapfree(&dev_priv->gart_info.mapping, dev);
|
||||
dev_priv->gart_info.addr = 0;
|
||||
dev_priv->gart_info.addr = NULL;
|
||||
}
|
||||
}
|
||||
/* only clear to the start of flags */
|
||||
|
@ -1326,6 +1592,7 @@ static int radeon_do_resume_cp(struct drm_device *dev, struct drm_file *file_pri
|
|||
|
||||
int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
drm_radeon_init_t *init = data;
|
||||
|
||||
LOCK_TEST_WITH_RETURN(dev, file_priv);
|
||||
|
@ -1338,8 +1605,13 @@ int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_pri
|
|||
case RADEON_INIT_R200_CP:
|
||||
case RADEON_INIT_R300_CP:
|
||||
return radeon_do_init_cp(dev, init, file_priv);
|
||||
case RADEON_INIT_R600_CP:
|
||||
return r600_do_init_cp(dev, init, file_priv);
|
||||
case RADEON_CLEANUP_CP:
|
||||
return radeon_do_cleanup_cp(dev);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return r600_do_cleanup_cp(dev);
|
||||
else
|
||||
return radeon_do_cleanup_cp(dev);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
@ -1362,7 +1634,10 @@ int radeon_cp_start(struct drm_device *dev, void *data, struct drm_file *file_pr
|
|||
return 0;
|
||||
}
|
||||
|
||||
radeon_do_cp_start(dev_priv);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_do_cp_start(dev_priv);
|
||||
else
|
||||
radeon_do_cp_start(dev_priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1393,7 +1668,10 @@ int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_pri
|
|||
* code so that the DRM ioctl wrapper can try again.
|
||||
*/
|
||||
if (stop->idle) {
|
||||
ret = radeon_do_cp_idle(dev_priv);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
ret = r600_do_cp_idle(dev_priv);
|
||||
else
|
||||
ret = radeon_do_cp_idle(dev_priv);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
@ -1402,10 +1680,16 @@ int radeon_cp_stop(struct drm_device *dev, void *data, struct drm_file *file_pri
|
|||
* we will get some dropped triangles as they won't be fully
|
||||
* rendered before the CP is shut down.
|
||||
*/
|
||||
radeon_do_cp_stop(dev_priv);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_do_cp_stop(dev_priv);
|
||||
else
|
||||
radeon_do_cp_stop(dev_priv);
|
||||
|
||||
/* Reset the engine */
|
||||
radeon_do_engine_reset(dev);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_do_engine_reset(dev);
|
||||
else
|
||||
radeon_do_engine_reset(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1418,29 +1702,47 @@ void radeon_do_release(struct drm_device * dev)
|
|||
if (dev_priv) {
|
||||
if (dev_priv->cp_running) {
|
||||
/* Stop the cp */
|
||||
while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
|
||||
DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
|
||||
while ((ret = r600_do_cp_idle(dev_priv)) != 0) {
|
||||
DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
|
||||
#ifdef __linux__
|
||||
schedule();
|
||||
schedule();
|
||||
#else
|
||||
tsleep(&ret, PZERO, "rdnrel", 1);
|
||||
tsleep(&ret, PZERO, "rdnrel", 1);
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
while ((ret = radeon_do_cp_idle(dev_priv)) != 0) {
|
||||
DRM_DEBUG("radeon_do_cp_idle %d\n", ret);
|
||||
#ifdef __linux__
|
||||
schedule();
|
||||
#else
|
||||
tsleep(&ret, PZERO, "rdnrel", 1);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
|
||||
r600_do_cp_stop(dev_priv);
|
||||
r600_do_engine_reset(dev);
|
||||
} else {
|
||||
radeon_do_cp_stop(dev_priv);
|
||||
radeon_do_engine_reset(dev);
|
||||
}
|
||||
radeon_do_cp_stop(dev_priv);
|
||||
radeon_do_engine_reset(dev);
|
||||
}
|
||||
|
||||
/* Disable *all* interrupts */
|
||||
if (dev_priv->mmio) /* remove this after permanent addmaps */
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_R600) {
|
||||
/* Disable *all* interrupts */
|
||||
if (dev_priv->mmio) /* remove this after permanent addmaps */
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
|
||||
|
||||
if (dev_priv->mmio) { /* remove all surfaces */
|
||||
for (i = 0; i < RADEON_MAX_SURFACES; i++) {
|
||||
RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0);
|
||||
RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND +
|
||||
16 * i, 0);
|
||||
RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND +
|
||||
16 * i, 0);
|
||||
if (dev_priv->mmio) { /* remove all surfaces */
|
||||
for (i = 0; i < RADEON_MAX_SURFACES; i++) {
|
||||
RADEON_WRITE(RADEON_SURFACE0_INFO + 16 * i, 0);
|
||||
RADEON_WRITE(RADEON_SURFACE0_LOWER_BOUND +
|
||||
16 * i, 0);
|
||||
RADEON_WRITE(RADEON_SURFACE0_UPPER_BOUND +
|
||||
16 * i, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1449,7 +1751,10 @@ void radeon_do_release(struct drm_device * dev)
|
|||
radeon_mem_takedown(&(dev_priv->fb_heap));
|
||||
|
||||
/* deallocate kernel resources */
|
||||
radeon_do_cleanup_cp(dev);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_do_cleanup_cp(dev);
|
||||
else
|
||||
radeon_do_cleanup_cp(dev);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1467,7 +1772,10 @@ int radeon_cp_reset(struct drm_device *dev, void *data, struct drm_file *file_pr
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
radeon_do_cp_reset(dev_priv);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_do_cp_reset(dev_priv);
|
||||
else
|
||||
radeon_do_cp_reset(dev_priv);
|
||||
|
||||
/* The CP is no longer running after an engine reset */
|
||||
dev_priv->cp_running = 0;
|
||||
|
@ -1482,23 +1790,36 @@ int radeon_cp_idle(struct drm_device *dev, void *data, struct drm_file *file_pri
|
|||
|
||||
LOCK_TEST_WITH_RETURN(dev, file_priv);
|
||||
|
||||
return radeon_do_cp_idle(dev_priv);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return r600_do_cp_idle(dev_priv);
|
||||
else
|
||||
return radeon_do_cp_idle(dev_priv);
|
||||
}
|
||||
|
||||
/* Added by Charl P. Botha to call radeon_do_resume_cp().
|
||||
*/
|
||||
int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
{
|
||||
return radeon_do_resume_cp(dev, file_priv);
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return r600_do_resume_cp(dev, file_priv);
|
||||
else
|
||||
return radeon_do_resume_cp(dev, file_priv);
|
||||
}
|
||||
|
||||
int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
LOCK_TEST_WITH_RETURN(dev, file_priv);
|
||||
|
||||
return radeon_do_engine_reset(dev);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return r600_do_engine_reset(dev);
|
||||
else
|
||||
return radeon_do_engine_reset(dev);
|
||||
}
|
||||
|
||||
/* ================================================================
|
||||
|
@ -1548,7 +1869,7 @@ struct drm_buf *radeon_freelist_get(struct drm_device * dev)
|
|||
start = dev_priv->last_buf;
|
||||
|
||||
for (t = 0; t < dev_priv->usec_timeout; t++) {
|
||||
u32 done_age = GET_SCRATCH(1);
|
||||
u32 done_age = GET_SCRATCH(dev_priv, 1);
|
||||
DRM_DEBUG("done_age = %d\n", done_age);
|
||||
for (i = start; i < dma->buf_count; i++) {
|
||||
buf = dma->buflist[i];
|
||||
|
@ -1582,8 +1903,9 @@ struct drm_buf *radeon_freelist_get(struct drm_device * dev)
|
|||
struct drm_buf *buf;
|
||||
int i, t;
|
||||
int start;
|
||||
u32 done_age = DRM_READ32(dev_priv->ring_rptr, RADEON_SCRATCHOFF(1));
|
||||
u32 done_age;
|
||||
|
||||
done_age = radeon_read_ring_rptr(dev_priv, RADEON_SCRATCHOFF(1));
|
||||
if (++dev_priv->last_buf >= dma->buf_count)
|
||||
dev_priv->last_buf = 0;
|
||||
|
||||
|
@ -1854,3 +2176,41 @@ int radeon_driver_unload(struct drm_device *dev)
|
|||
dev->dev_private = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void radeon_commit_ring(drm_radeon_private_t *dev_priv)
|
||||
{
|
||||
int i;
|
||||
u32 *ring;
|
||||
int tail_aligned;
|
||||
|
||||
/* check if the ring is padded out to 16-dword alignment */
|
||||
|
||||
tail_aligned = dev_priv->ring.tail & 0xf;
|
||||
if (tail_aligned) {
|
||||
int num_p2 = 16 - tail_aligned;
|
||||
|
||||
ring = dev_priv->ring.start;
|
||||
/* pad with some CP_PACKET2 */
|
||||
for (i = 0; i < num_p2; i++)
|
||||
ring[dev_priv->ring.tail + i] = CP_PACKET2();
|
||||
|
||||
dev_priv->ring.tail += i;
|
||||
|
||||
dev_priv->ring.space -= num_p2 * sizeof(u32);
|
||||
}
|
||||
|
||||
dev_priv->ring.tail &= dev_priv->ring.tail_mask;
|
||||
|
||||
DRM_MEMORYBARRIER();
|
||||
GET_RING_HEAD( dev_priv );
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
|
||||
RADEON_WRITE(R600_CP_RB_WPTR, dev_priv->ring.tail);
|
||||
/* read from PCI bus to ensure correct posting */
|
||||
RADEON_READ(R600_CP_RB_RPTR);
|
||||
} else {
|
||||
RADEON_WRITE(RADEON_CP_RB_WPTR, dev_priv->ring.tail);
|
||||
/* read from PCI bus to ensure correct posting */
|
||||
RADEON_READ(RADEON_CP_RB_RPTR);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,23 +41,15 @@ int radeon_no_wb;
|
|||
MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
|
||||
module_param_named(no_wb, radeon_no_wb, int, 0444);
|
||||
|
||||
static int dri_library_name(struct drm_device *dev, char *buf)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
int family = dev_priv->flags & RADEON_FAMILY_MASK;
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
(family < CHIP_R200) ? "radeon" :
|
||||
((family < CHIP_R300) ? "r200" :
|
||||
"r300"));
|
||||
}
|
||||
|
||||
static int radeon_suspend(struct drm_device *dev, pm_message_t state)
|
||||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return 0;
|
||||
|
||||
/* Disable *all* interrupts */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
|
||||
RADEON_WRITE(R500_DxMODE_INT_MASK, 0);
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
|
||||
return 0;
|
||||
|
@ -67,8 +59,11 @@ static int radeon_resume(struct drm_device *dev)
|
|||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
return 0;
|
||||
|
||||
/* Restore interrupt registers */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
|
||||
RADEON_WRITE(R500_DxMODE_INT_MASK, dev_priv->r500_disp_irq_reg);
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
|
||||
return 0;
|
||||
|
@ -95,7 +90,6 @@ static struct drm_driver driver = {
|
|||
.get_vblank_counter = radeon_get_vblank_counter,
|
||||
.enable_vblank = radeon_enable_vblank,
|
||||
.disable_vblank = radeon_disable_vblank,
|
||||
.dri_library_name = dri_library_name,
|
||||
.master_create = radeon_master_create,
|
||||
.master_destroy = radeon_master_destroy,
|
||||
.irq_preinstall = radeon_driver_irq_preinstall,
|
||||
|
|
|
@ -126,6 +126,7 @@ enum radeon_family {
|
|||
CHIP_RV410,
|
||||
CHIP_RS400,
|
||||
CHIP_RS480,
|
||||
CHIP_RS600,
|
||||
CHIP_RS690,
|
||||
CHIP_RS740,
|
||||
CHIP_RV515,
|
||||
|
@ -134,6 +135,16 @@ enum radeon_family {
|
|||
CHIP_RV560,
|
||||
CHIP_RV570,
|
||||
CHIP_R580,
|
||||
CHIP_R600,
|
||||
CHIP_RV610,
|
||||
CHIP_RV630,
|
||||
CHIP_RV620,
|
||||
CHIP_RV635,
|
||||
CHIP_RV670,
|
||||
CHIP_RS780,
|
||||
CHIP_RV770,
|
||||
CHIP_RV730,
|
||||
CHIP_RV710,
|
||||
CHIP_LAST,
|
||||
};
|
||||
|
||||
|
@ -160,10 +171,6 @@ enum radeon_chip_flags {
|
|||
RADEON_IS_IGPGART = 0x01000000UL,
|
||||
};
|
||||
|
||||
#define GET_RING_HEAD(dev_priv) (dev_priv->writeback_works ? \
|
||||
DRM_READ32( (dev_priv)->ring_rptr, 0 ) : RADEON_READ(RADEON_CP_RB_RPTR))
|
||||
#define SET_RING_HEAD(dev_priv,val) DRM_WRITE32( (dev_priv)->ring_rptr, 0, (val) )
|
||||
|
||||
typedef struct drm_radeon_freelist {
|
||||
unsigned int age;
|
||||
struct drm_buf *buf;
|
||||
|
@ -221,10 +228,11 @@ struct radeon_virt_surface {
|
|||
u32 upper;
|
||||
u32 flags;
|
||||
struct drm_file *file_priv;
|
||||
#define PCIGART_FILE_PRIV ((void *) -1L)
|
||||
};
|
||||
|
||||
#define RADEON_FLUSH_EMITED (1 < 0)
|
||||
#define RADEON_PURGE_EMITED (1 < 1)
|
||||
#define RADEON_FLUSH_EMITED (1 << 0)
|
||||
#define RADEON_PURGE_EMITED (1 << 1)
|
||||
|
||||
struct drm_radeon_master_private {
|
||||
drm_local_map_t *sarea;
|
||||
|
@ -248,7 +256,6 @@ typedef struct drm_radeon_private {
|
|||
drm_radeon_freelist_t *head;
|
||||
drm_radeon_freelist_t *tail;
|
||||
int last_buf;
|
||||
volatile u32 *scratch;
|
||||
int writeback_works;
|
||||
|
||||
int usec_timeout;
|
||||
|
@ -316,11 +323,31 @@ typedef struct drm_radeon_private {
|
|||
|
||||
/* starting from here on, data is preserved accross an open */
|
||||
uint32_t flags; /* see radeon_chip_flags */
|
||||
unsigned long fb_aper_offset;
|
||||
resource_size_t fb_aper_offset;
|
||||
|
||||
int num_gb_pipes;
|
||||
int track_flush;
|
||||
drm_local_map_t *mmio;
|
||||
|
||||
/* r6xx/r7xx pipe/shader config */
|
||||
int r600_max_pipes;
|
||||
int r600_max_tile_pipes;
|
||||
int r600_max_simds;
|
||||
int r600_max_backends;
|
||||
int r600_max_gprs;
|
||||
int r600_max_threads;
|
||||
int r600_max_stack_entries;
|
||||
int r600_max_hw_contexts;
|
||||
int r600_max_gs_threads;
|
||||
int r600_sx_max_export_size;
|
||||
int r600_sx_max_export_pos_size;
|
||||
int r600_sx_max_export_smx_size;
|
||||
int r600_sq_num_cf_insts;
|
||||
int r700_sx_num_of_sets;
|
||||
int r700_sc_prim_fifo_size;
|
||||
int r700_sc_hiz_tile_fifo_size;
|
||||
int r700_sc_earlyz_tile_fifo_fize;
|
||||
|
||||
} drm_radeon_private_t;
|
||||
|
||||
typedef struct drm_radeon_buf_priv {
|
||||
|
@ -338,6 +365,12 @@ extern int radeon_no_wb;
|
|||
extern struct drm_ioctl_desc radeon_ioctls[];
|
||||
extern int radeon_max_ioctl;
|
||||
|
||||
extern u32 radeon_get_ring_head(drm_radeon_private_t *dev_priv);
|
||||
extern void radeon_set_ring_head(drm_radeon_private_t *dev_priv, u32 val);
|
||||
|
||||
#define GET_RING_HEAD(dev_priv) radeon_get_ring_head(dev_priv)
|
||||
#define SET_RING_HEAD(dev_priv, val) radeon_set_ring_head(dev_priv, val)
|
||||
|
||||
/* Check whether the given hardware address is inside the framebuffer or the
|
||||
* GART area.
|
||||
*/
|
||||
|
@ -364,6 +397,9 @@ extern int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_fi
|
|||
extern int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv);
|
||||
extern int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
|
||||
extern u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv);
|
||||
extern void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc);
|
||||
extern void radeon_write_agp_base(drm_radeon_private_t *dev_priv, u64 agp_base);
|
||||
extern u32 RADEON_READ_MM(drm_radeon_private_t *dev_priv, int addr);
|
||||
|
||||
extern void radeon_freelist_reset(struct drm_device * dev);
|
||||
extern struct drm_buf *radeon_freelist_get(struct drm_device * dev);
|
||||
|
@ -383,6 +419,10 @@ extern void radeon_mem_takedown(struct mem_block **heap);
|
|||
extern void radeon_mem_release(struct drm_file *file_priv,
|
||||
struct mem_block *heap);
|
||||
|
||||
extern void radeon_enable_bm(struct drm_radeon_private *dev_priv);
|
||||
extern u32 radeon_read_ring_rptr(drm_radeon_private_t *dev_priv, u32 off);
|
||||
extern void radeon_write_ring_rptr(drm_radeon_private_t *dev_priv, u32 off, u32 val);
|
||||
|
||||
/* radeon_irq.c */
|
||||
extern void radeon_irq_set_state(struct drm_device *dev, u32 mask, int state);
|
||||
extern int radeon_irq_emit(struct drm_device *dev, void *data, struct drm_file *file_priv);
|
||||
|
@ -423,6 +463,21 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
struct drm_file *file_priv,
|
||||
drm_radeon_kcmd_buffer_t *cmdbuf);
|
||||
|
||||
/* r600_cp.c */
|
||||
extern int r600_do_engine_reset(struct drm_device *dev);
|
||||
extern int r600_do_cleanup_cp(struct drm_device *dev);
|
||||
extern int r600_do_init_cp(struct drm_device *dev, drm_radeon_init_t *init,
|
||||
struct drm_file *file_priv);
|
||||
extern int r600_do_resume_cp(struct drm_device *dev, struct drm_file *file_priv);
|
||||
extern int r600_do_cp_idle(drm_radeon_private_t *dev_priv);
|
||||
extern void r600_do_cp_start(drm_radeon_private_t *dev_priv);
|
||||
extern void r600_do_cp_reset(drm_radeon_private_t *dev_priv);
|
||||
extern void r600_do_cp_stop(drm_radeon_private_t *dev_priv);
|
||||
extern int r600_cp_dispatch_indirect(struct drm_device *dev,
|
||||
struct drm_buf *buf, int start, int end);
|
||||
extern int r600_page_table_init(struct drm_device *dev);
|
||||
extern void r600_page_table_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info);
|
||||
|
||||
/* Flags for stats.boxes
|
||||
*/
|
||||
#define RADEON_BOX_DMA_IDLE 0x1
|
||||
|
@ -434,6 +489,8 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
/* Register definitions, register access macros and drmAddMap constants
|
||||
* for Radeon kernel driver.
|
||||
*/
|
||||
#define RADEON_MM_INDEX 0x0000
|
||||
#define RADEON_MM_DATA 0x0004
|
||||
|
||||
#define RADEON_AGP_COMMAND 0x0f60
|
||||
#define RADEON_AGP_COMMAND_PCI_CONFIG 0x0060 /* offset in PCI config */
|
||||
|
@ -556,6 +613,56 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
#define RS690_MC_AGP_BASE 0x102
|
||||
#define RS690_MC_AGP_BASE_2 0x103
|
||||
|
||||
#define RS600_MC_INDEX 0x70
|
||||
# define RS600_MC_ADDR_MASK 0xffff
|
||||
# define RS600_MC_IND_SEQ_RBS_0 (1 << 16)
|
||||
# define RS600_MC_IND_SEQ_RBS_1 (1 << 17)
|
||||
# define RS600_MC_IND_SEQ_RBS_2 (1 << 18)
|
||||
# define RS600_MC_IND_SEQ_RBS_3 (1 << 19)
|
||||
# define RS600_MC_IND_AIC_RBS (1 << 20)
|
||||
# define RS600_MC_IND_CITF_ARB0 (1 << 21)
|
||||
# define RS600_MC_IND_CITF_ARB1 (1 << 22)
|
||||
# define RS600_MC_IND_WR_EN (1 << 23)
|
||||
#define RS600_MC_DATA 0x74
|
||||
|
||||
#define RS600_MC_STATUS 0x0
|
||||
# define RS600_MC_IDLE (1 << 1)
|
||||
#define RS600_MC_FB_LOCATION 0x4
|
||||
#define RS600_MC_AGP_LOCATION 0x5
|
||||
#define RS600_AGP_BASE 0x6
|
||||
#define RS600_AGP_BASE_2 0x7
|
||||
#define RS600_MC_CNTL1 0x9
|
||||
# define RS600_ENABLE_PAGE_TABLES (1 << 26)
|
||||
#define RS600_MC_PT0_CNTL 0x100
|
||||
# define RS600_ENABLE_PT (1 << 0)
|
||||
# define RS600_EFFECTIVE_L2_CACHE_SIZE(x) ((x) << 15)
|
||||
# define RS600_EFFECTIVE_L2_QUEUE_SIZE(x) ((x) << 21)
|
||||
# define RS600_INVALIDATE_ALL_L1_TLBS (1 << 28)
|
||||
# define RS600_INVALIDATE_L2_CACHE (1 << 29)
|
||||
#define RS600_MC_PT0_CONTEXT0_CNTL 0x102
|
||||
# define RS600_ENABLE_PAGE_TABLE (1 << 0)
|
||||
# define RS600_PAGE_TABLE_TYPE_FLAT (0 << 1)
|
||||
#define RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR 0x112
|
||||
#define RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR 0x114
|
||||
#define RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR 0x11c
|
||||
#define RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR 0x12c
|
||||
#define RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR 0x13c
|
||||
#define RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR 0x14c
|
||||
#define RS600_MC_PT0_CLIENT0_CNTL 0x16c
|
||||
# define RS600_ENABLE_TRANSLATION_MODE_OVERRIDE (1 << 0)
|
||||
# define RS600_TRANSLATION_MODE_OVERRIDE (1 << 1)
|
||||
# define RS600_SYSTEM_ACCESS_MODE_MASK (3 << 8)
|
||||
# define RS600_SYSTEM_ACCESS_MODE_PA_ONLY (0 << 8)
|
||||
# define RS600_SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 8)
|
||||
# define RS600_SYSTEM_ACCESS_MODE_IN_SYS (2 << 8)
|
||||
# define RS600_SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 8)
|
||||
# define RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASSTHROUGH (0 << 10)
|
||||
# define RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE (1 << 10)
|
||||
# define RS600_EFFECTIVE_L1_CACHE_SIZE(x) ((x) << 11)
|
||||
# define RS600_ENABLE_FRAGMENT_PROCESSING (1 << 14)
|
||||
# define RS600_EFFECTIVE_L1_QUEUE_SIZE(x) ((x) << 15)
|
||||
# define RS600_INVALIDATE_L1_TLB (1 << 20)
|
||||
|
||||
#define R520_MC_IND_INDEX 0x70
|
||||
#define R520_MC_IND_WR_EN (1 << 24)
|
||||
#define R520_MC_IND_DATA 0x74
|
||||
|
@ -580,7 +687,6 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
/* pipe config regs */
|
||||
#define R400_GB_PIPE_SELECT 0x402c
|
||||
#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
|
||||
#define R500_SU_REG_DEST 0x42c8
|
||||
#define R300_GB_TILE_CONFIG 0x4018
|
||||
# define R300_ENABLE_TILING (1 << 0)
|
||||
# define R300_PIPE_COUNT_RV350 (0 << 1)
|
||||
|
@ -639,9 +745,22 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
|
||||
#define RADEON_SCRATCHOFF( x ) (RADEON_SCRATCH_REG_OFFSET + 4*(x))
|
||||
|
||||
#define GET_SCRATCH( x ) (dev_priv->writeback_works \
|
||||
? DRM_READ32( dev_priv->ring_rptr, RADEON_SCRATCHOFF(x) ) \
|
||||
: RADEON_READ( RADEON_SCRATCH_REG0 + 4*(x) ) )
|
||||
extern u32 radeon_get_scratch(drm_radeon_private_t *dev_priv, int index);
|
||||
|
||||
#define GET_SCRATCH(dev_priv, x) radeon_get_scratch(dev_priv, x)
|
||||
|
||||
#define R600_SCRATCH_REG0 0x8500
|
||||
#define R600_SCRATCH_REG1 0x8504
|
||||
#define R600_SCRATCH_REG2 0x8508
|
||||
#define R600_SCRATCH_REG3 0x850c
|
||||
#define R600_SCRATCH_REG4 0x8510
|
||||
#define R600_SCRATCH_REG5 0x8514
|
||||
#define R600_SCRATCH_REG6 0x8518
|
||||
#define R600_SCRATCH_REG7 0x851c
|
||||
#define R600_SCRATCH_UMSK 0x8540
|
||||
#define R600_SCRATCH_ADDR 0x8544
|
||||
|
||||
#define R600_SCRATCHOFF(x) (R600_SCRATCH_REG_OFFSET + 4*(x))
|
||||
|
||||
#define RADEON_GEN_INT_CNTL 0x0040
|
||||
# define RADEON_CRTC_VBLANK_MASK (1 << 0)
|
||||
|
@ -922,6 +1041,7 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
#define RADEON_CP_RB_CNTL 0x0704
|
||||
# define RADEON_BUF_SWAP_32BIT (2 << 16)
|
||||
# define RADEON_RB_NO_UPDATE (1 << 27)
|
||||
# define RADEON_RB_RPTR_WR_ENA (1 << 31)
|
||||
#define RADEON_CP_RB_RPTR_ADDR 0x070c
|
||||
#define RADEON_CP_RB_RPTR 0x0710
|
||||
#define RADEON_CP_RB_WPTR 0x0714
|
||||
|
@ -983,6 +1103,14 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
# define RADEON_CNTL_BITBLT_MULTI 0x00009B00
|
||||
# define RADEON_CNTL_SET_SCISSORS 0xC0001E00
|
||||
|
||||
# define R600_IT_INDIRECT_BUFFER 0x00003200
|
||||
# define R600_IT_ME_INITIALIZE 0x00004400
|
||||
# define R600_ME_INITIALIZE_DEVICE_ID(x) ((x) << 16)
|
||||
# define R600_IT_EVENT_WRITE 0x00004600
|
||||
# define R600_IT_SET_CONFIG_REG 0x00006800
|
||||
# define R600_SET_CONFIG_REG_OFFSET 0x00008000
|
||||
# define R600_SET_CONFIG_REG_END 0x0000ac00
|
||||
|
||||
#define RADEON_CP_PACKET_MASK 0xC0000000
|
||||
#define RADEON_CP_PACKET_COUNT_MASK 0x3fff0000
|
||||
#define RADEON_CP_PACKET0_REG_MASK 0x000007ff
|
||||
|
@ -1181,6 +1309,422 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
#define R500_D1_VBLANK_INTERRUPT (1 << 4)
|
||||
#define R500_D2_VBLANK_INTERRUPT (1 << 5)
|
||||
|
||||
/* R6xx/R7xx registers */
|
||||
#define R600_MC_VM_FB_LOCATION 0x2180
|
||||
#define R600_MC_VM_AGP_TOP 0x2184
|
||||
#define R600_MC_VM_AGP_BOT 0x2188
|
||||
#define R600_MC_VM_AGP_BASE 0x218c
|
||||
#define R600_MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2190
|
||||
#define R600_MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2194
|
||||
#define R600_MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x2198
|
||||
|
||||
#define R700_MC_VM_FB_LOCATION 0x2024
|
||||
#define R700_MC_VM_AGP_TOP 0x2028
|
||||
#define R700_MC_VM_AGP_BOT 0x202c
|
||||
#define R700_MC_VM_AGP_BASE 0x2030
|
||||
#define R700_MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
|
||||
#define R700_MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
|
||||
#define R700_MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203c
|
||||
|
||||
#define R600_MCD_RD_A_CNTL 0x219c
|
||||
#define R600_MCD_RD_B_CNTL 0x21a0
|
||||
|
||||
#define R600_MCD_WR_A_CNTL 0x21a4
|
||||
#define R600_MCD_WR_B_CNTL 0x21a8
|
||||
|
||||
#define R600_MCD_RD_SYS_CNTL 0x2200
|
||||
#define R600_MCD_WR_SYS_CNTL 0x2214
|
||||
|
||||
#define R600_MCD_RD_GFX_CNTL 0x21fc
|
||||
#define R600_MCD_RD_HDP_CNTL 0x2204
|
||||
#define R600_MCD_RD_PDMA_CNTL 0x2208
|
||||
#define R600_MCD_RD_SEM_CNTL 0x220c
|
||||
#define R600_MCD_WR_GFX_CNTL 0x2210
|
||||
#define R600_MCD_WR_HDP_CNTL 0x2218
|
||||
#define R600_MCD_WR_PDMA_CNTL 0x221c
|
||||
#define R600_MCD_WR_SEM_CNTL 0x2220
|
||||
|
||||
# define R600_MCD_L1_TLB (1 << 0)
|
||||
# define R600_MCD_L1_FRAG_PROC (1 << 1)
|
||||
# define R600_MCD_L1_STRICT_ORDERING (1 << 2)
|
||||
|
||||
# define R600_MCD_SYSTEM_ACCESS_MODE_MASK (3 << 6)
|
||||
# define R600_MCD_SYSTEM_ACCESS_MODE_PA_ONLY (0 << 6)
|
||||
# define R600_MCD_SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 6)
|
||||
# define R600_MCD_SYSTEM_ACCESS_MODE_IN_SYS (2 << 6)
|
||||
# define R600_MCD_SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 6)
|
||||
|
||||
# define R600_MCD_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 8)
|
||||
# define R600_MCD_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE (1 << 8)
|
||||
|
||||
# define R600_MCD_SEMAPHORE_MODE (1 << 10)
|
||||
# define R600_MCD_WAIT_L2_QUERY (1 << 11)
|
||||
# define R600_MCD_EFFECTIVE_L1_TLB_SIZE(x) ((x) << 12)
|
||||
# define R600_MCD_EFFECTIVE_L1_QUEUE_SIZE(x) ((x) << 15)
|
||||
|
||||
#define R700_MC_VM_MD_L1_TLB0_CNTL 0x2654
|
||||
#define R700_MC_VM_MD_L1_TLB1_CNTL 0x2658
|
||||
#define R700_MC_VM_MD_L1_TLB2_CNTL 0x265c
|
||||
|
||||
#define R700_MC_VM_MB_L1_TLB0_CNTL 0x2234
|
||||
#define R700_MC_VM_MB_L1_TLB1_CNTL 0x2238
|
||||
#define R700_MC_VM_MB_L1_TLB2_CNTL 0x223c
|
||||
#define R700_MC_VM_MB_L1_TLB3_CNTL 0x2240
|
||||
|
||||
# define R700_ENABLE_L1_TLB (1 << 0)
|
||||
# define R700_ENABLE_L1_FRAGMENT_PROCESSING (1 << 1)
|
||||
# define R700_SYSTEM_ACCESS_MODE_IN_SYS (2 << 3)
|
||||
# define R700_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU (0 << 5)
|
||||
# define R700_EFFECTIVE_L1_TLB_SIZE(x) ((x) << 15)
|
||||
# define R700_EFFECTIVE_L1_QUEUE_SIZE(x) ((x) << 18)
|
||||
|
||||
#define R700_MC_ARB_RAMCFG 0x2760
|
||||
# define R700_NOOFBANK_SHIFT 0
|
||||
# define R700_NOOFBANK_MASK 0x3
|
||||
# define R700_NOOFRANK_SHIFT 2
|
||||
# define R700_NOOFRANK_MASK 0x1
|
||||
# define R700_NOOFROWS_SHIFT 3
|
||||
# define R700_NOOFROWS_MASK 0x7
|
||||
# define R700_NOOFCOLS_SHIFT 6
|
||||
# define R700_NOOFCOLS_MASK 0x3
|
||||
# define R700_CHANSIZE_SHIFT 8
|
||||
# define R700_CHANSIZE_MASK 0x1
|
||||
# define R700_BURSTLENGTH_SHIFT 9
|
||||
# define R700_BURSTLENGTH_MASK 0x1
|
||||
#define R600_RAMCFG 0x2408
|
||||
# define R600_NOOFBANK_SHIFT 0
|
||||
# define R600_NOOFBANK_MASK 0x1
|
||||
# define R600_NOOFRANK_SHIFT 1
|
||||
# define R600_NOOFRANK_MASK 0x1
|
||||
# define R600_NOOFROWS_SHIFT 2
|
||||
# define R600_NOOFROWS_MASK 0x7
|
||||
# define R600_NOOFCOLS_SHIFT 5
|
||||
# define R600_NOOFCOLS_MASK 0x3
|
||||
# define R600_CHANSIZE_SHIFT 7
|
||||
# define R600_CHANSIZE_MASK 0x1
|
||||
# define R600_BURSTLENGTH_SHIFT 8
|
||||
# define R600_BURSTLENGTH_MASK 0x1
|
||||
|
||||
#define R600_VM_L2_CNTL 0x1400
|
||||
# define R600_VM_L2_CACHE_EN (1 << 0)
|
||||
# define R600_VM_L2_FRAG_PROC (1 << 1)
|
||||
# define R600_VM_ENABLE_PTE_CACHE_LRU_W (1 << 9)
|
||||
# define R600_VM_L2_CNTL_QUEUE_SIZE(x) ((x) << 13)
|
||||
# define R700_VM_L2_CNTL_QUEUE_SIZE(x) ((x) << 14)
|
||||
|
||||
#define R600_VM_L2_CNTL2 0x1404
|
||||
# define R600_VM_L2_CNTL2_INVALIDATE_ALL_L1_TLBS (1 << 0)
|
||||
# define R600_VM_L2_CNTL2_INVALIDATE_L2_CACHE (1 << 1)
|
||||
#define R600_VM_L2_CNTL3 0x1408
|
||||
# define R600_VM_L2_CNTL3_BANK_SELECT_0(x) ((x) << 0)
|
||||
# define R600_VM_L2_CNTL3_BANK_SELECT_1(x) ((x) << 5)
|
||||
# define R600_VM_L2_CNTL3_CACHE_UPDATE_MODE(x) ((x) << 10)
|
||||
# define R700_VM_L2_CNTL3_BANK_SELECT(x) ((x) << 0)
|
||||
# define R700_VM_L2_CNTL3_CACHE_UPDATE_MODE(x) ((x) << 6)
|
||||
|
||||
#define R600_VM_L2_STATUS 0x140c
|
||||
|
||||
#define R600_VM_CONTEXT0_CNTL 0x1410
|
||||
# define R600_VM_ENABLE_CONTEXT (1 << 0)
|
||||
# define R600_VM_PAGE_TABLE_DEPTH_FLAT (0 << 1)
|
||||
|
||||
#define R600_VM_CONTEXT0_CNTL2 0x1430
|
||||
#define R600_VM_CONTEXT0_REQUEST_RESPONSE 0x1470
|
||||
#define R600_VM_CONTEXT0_INVALIDATION_LOW_ADDR 0x1490
|
||||
#define R600_VM_CONTEXT0_INVALIDATION_HIGH_ADDR 0x14b0
|
||||
#define R600_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x1574
|
||||
#define R600_VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x1594
|
||||
#define R600_VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x15b4
|
||||
|
||||
#define R700_VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153c
|
||||
#define R700_VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155c
|
||||
#define R700_VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157c
|
||||
|
||||
#define R600_HDP_HOST_PATH_CNTL 0x2c00
|
||||
|
||||
#define R600_GRBM_CNTL 0x8000
|
||||
# define R600_GRBM_READ_TIMEOUT(x) ((x) << 0)
|
||||
|
||||
#define R600_GRBM_STATUS 0x8010
|
||||
# define R600_CMDFIFO_AVAIL_MASK 0x1f
|
||||
# define R700_CMDFIFO_AVAIL_MASK 0xf
|
||||
# define R600_GUI_ACTIVE (1 << 31)
|
||||
#define R600_GRBM_STATUS2 0x8014
|
||||
#define R600_GRBM_SOFT_RESET 0x8020
|
||||
# define R600_SOFT_RESET_CP (1 << 0)
|
||||
#define R600_WAIT_UNTIL 0x8040
|
||||
|
||||
#define R600_CP_SEM_WAIT_TIMER 0x85bc
|
||||
#define R600_CP_ME_CNTL 0x86d8
|
||||
# define R600_CP_ME_HALT (1 << 28)
|
||||
#define R600_CP_QUEUE_THRESHOLDS 0x8760
|
||||
# define R600_ROQ_IB1_START(x) ((x) << 0)
|
||||
# define R600_ROQ_IB2_START(x) ((x) << 8)
|
||||
#define R600_CP_MEQ_THRESHOLDS 0x8764
|
||||
# define R700_STQ_SPLIT(x) ((x) << 0)
|
||||
# define R600_MEQ_END(x) ((x) << 16)
|
||||
# define R600_ROQ_END(x) ((x) << 24)
|
||||
#define R600_CP_PERFMON_CNTL 0x87fc
|
||||
#define R600_CP_RB_BASE 0xc100
|
||||
#define R600_CP_RB_CNTL 0xc104
|
||||
# define R600_RB_BUFSZ(x) ((x) << 0)
|
||||
# define R600_RB_BLKSZ(x) ((x) << 8)
|
||||
# define R600_RB_NO_UPDATE (1 << 27)
|
||||
# define R600_RB_RPTR_WR_ENA (1 << 31)
|
||||
#define R600_CP_RB_RPTR_WR 0xc108
|
||||
#define R600_CP_RB_RPTR_ADDR 0xc10c
|
||||
#define R600_CP_RB_RPTR_ADDR_HI 0xc110
|
||||
#define R600_CP_RB_WPTR 0xc114
|
||||
#define R600_CP_RB_WPTR_ADDR 0xc118
|
||||
#define R600_CP_RB_WPTR_ADDR_HI 0xc11c
|
||||
#define R600_CP_RB_RPTR 0x8700
|
||||
#define R600_CP_RB_WPTR_DELAY 0x8704
|
||||
#define R600_CP_PFP_UCODE_ADDR 0xc150
|
||||
#define R600_CP_PFP_UCODE_DATA 0xc154
|
||||
#define R600_CP_ME_RAM_RADDR 0xc158
|
||||
#define R600_CP_ME_RAM_WADDR 0xc15c
|
||||
#define R600_CP_ME_RAM_DATA 0xc160
|
||||
#define R600_CP_DEBUG 0xc1fc
|
||||
|
||||
#define R600_PA_CL_ENHANCE 0x8a14
|
||||
# define R600_CLIP_VTX_REORDER_ENA (1 << 0)
|
||||
# define R600_NUM_CLIP_SEQ(x) ((x) << 1)
|
||||
#define R600_PA_SC_LINE_STIPPLE_STATE 0x8b10
|
||||
#define R600_PA_SC_MULTI_CHIP_CNTL 0x8b20
|
||||
#define R700_PA_SC_FORCE_EOV_MAX_CNTS 0x8b24
|
||||
# define R700_FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
|
||||
# define R700_FORCE_EOV_MAX_REZ_CNT(x) ((x) << 16)
|
||||
#define R600_PA_SC_AA_SAMPLE_LOCS_2S 0x8b40
|
||||
#define R600_PA_SC_AA_SAMPLE_LOCS_4S 0x8b44
|
||||
#define R600_PA_SC_AA_SAMPLE_LOCS_8S_WD0 0x8b48
|
||||
#define R600_PA_SC_AA_SAMPLE_LOCS_8S_WD1 0x8b4c
|
||||
# define R600_S0_X(x) ((x) << 0)
|
||||
# define R600_S0_Y(x) ((x) << 4)
|
||||
# define R600_S1_X(x) ((x) << 8)
|
||||
# define R600_S1_Y(x) ((x) << 12)
|
||||
# define R600_S2_X(x) ((x) << 16)
|
||||
# define R600_S2_Y(x) ((x) << 20)
|
||||
# define R600_S3_X(x) ((x) << 24)
|
||||
# define R600_S3_Y(x) ((x) << 28)
|
||||
# define R600_S4_X(x) ((x) << 0)
|
||||
# define R600_S4_Y(x) ((x) << 4)
|
||||
# define R600_S5_X(x) ((x) << 8)
|
||||
# define R600_S5_Y(x) ((x) << 12)
|
||||
# define R600_S6_X(x) ((x) << 16)
|
||||
# define R600_S6_Y(x) ((x) << 20)
|
||||
# define R600_S7_X(x) ((x) << 24)
|
||||
# define R600_S7_Y(x) ((x) << 28)
|
||||
#define R600_PA_SC_FIFO_SIZE 0x8bd0
|
||||
# define R600_SC_PRIM_FIFO_SIZE(x) ((x) << 0)
|
||||
# define R600_SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 8)
|
||||
# define R600_SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 16)
|
||||
#define R700_PA_SC_FIFO_SIZE_R7XX 0x8bcc
|
||||
# define R700_SC_PRIM_FIFO_SIZE(x) ((x) << 0)
|
||||
# define R700_SC_HIZ_TILE_FIFO_SIZE(x) ((x) << 12)
|
||||
# define R700_SC_EARLYZ_TILE_FIFO_SIZE(x) ((x) << 20)
|
||||
#define R600_PA_SC_ENHANCE 0x8bf0
|
||||
# define R600_FORCE_EOV_MAX_CLK_CNT(x) ((x) << 0)
|
||||
# define R600_FORCE_EOV_MAX_TILE_CNT(x) ((x) << 12)
|
||||
#define R600_PA_SC_CLIPRECT_RULE 0x2820c
|
||||
#define R700_PA_SC_EDGERULE 0x28230
|
||||
#define R600_PA_SC_LINE_STIPPLE 0x28a0c
|
||||
#define R600_PA_SC_MODE_CNTL 0x28a4c
|
||||
#define R600_PA_SC_AA_CONFIG 0x28c04
|
||||
|
||||
#define R600_SX_EXPORT_BUFFER_SIZES 0x900c
|
||||
# define R600_COLOR_BUFFER_SIZE(x) ((x) << 0)
|
||||
# define R600_POSITION_BUFFER_SIZE(x) ((x) << 8)
|
||||
# define R600_SMX_BUFFER_SIZE(x) ((x) << 16)
|
||||
#define R600_SX_DEBUG_1 0x9054
|
||||
# define R600_SMX_EVENT_RELEASE (1 << 0)
|
||||
# define R600_ENABLE_NEW_SMX_ADDRESS (1 << 16)
|
||||
#define R700_SX_DEBUG_1 0x9058
|
||||
# define R700_ENABLE_NEW_SMX_ADDRESS (1 << 16)
|
||||
#define R600_SX_MISC 0x28350
|
||||
|
||||
#define R600_DB_DEBUG 0x9830
|
||||
# define R600_PREZ_MUST_WAIT_FOR_POSTZ_DONE (1 << 31)
|
||||
#define R600_DB_WATERMARKS 0x9838
|
||||
# define R600_DEPTH_FREE(x) ((x) << 0)
|
||||
# define R600_DEPTH_FLUSH(x) ((x) << 5)
|
||||
# define R600_DEPTH_PENDING_FREE(x) ((x) << 15)
|
||||
# define R600_DEPTH_CACHELINE_FREE(x) ((x) << 20)
|
||||
#define R700_DB_DEBUG3 0x98b0
|
||||
# define R700_DB_CLK_OFF_DELAY(x) ((x) << 11)
|
||||
#define RV700_DB_DEBUG4 0x9b8c
|
||||
# define RV700_DISABLE_TILE_COVERED_FOR_PS_ITER (1 << 6)
|
||||
|
||||
#define R600_VGT_CACHE_INVALIDATION 0x88c4
|
||||
# define R600_CACHE_INVALIDATION(x) ((x) << 0)
|
||||
# define R600_VC_ONLY 0
|
||||
# define R600_TC_ONLY 1
|
||||
# define R600_VC_AND_TC 2
|
||||
# define R700_AUTO_INVLD_EN(x) ((x) << 6)
|
||||
# define R700_NO_AUTO 0
|
||||
# define R700_ES_AUTO 1
|
||||
# define R700_GS_AUTO 2
|
||||
# define R700_ES_AND_GS_AUTO 3
|
||||
#define R600_VGT_GS_PER_ES 0x88c8
|
||||
#define R600_VGT_ES_PER_GS 0x88cc
|
||||
#define R600_VGT_GS_PER_VS 0x88e8
|
||||
#define R600_VGT_GS_VERTEX_REUSE 0x88d4
|
||||
#define R600_VGT_NUM_INSTANCES 0x8974
|
||||
#define R600_VGT_STRMOUT_EN 0x28ab0
|
||||
#define R600_VGT_EVENT_INITIATOR 0x28a90
|
||||
# define R600_CACHE_FLUSH_AND_INV_EVENT (0x16 << 0)
|
||||
#define R600_VGT_VERTEX_REUSE_BLOCK_CNTL 0x28c58
|
||||
# define R600_VTX_REUSE_DEPTH_MASK 0xff
|
||||
#define R600_VGT_OUT_DEALLOC_CNTL 0x28c5c
|
||||
# define R600_DEALLOC_DIST_MASK 0x7f
|
||||
|
||||
#define R600_CB_COLOR0_BASE 0x28040
|
||||
#define R600_CB_COLOR1_BASE 0x28044
|
||||
#define R600_CB_COLOR2_BASE 0x28048
|
||||
#define R600_CB_COLOR3_BASE 0x2804c
|
||||
#define R600_CB_COLOR4_BASE 0x28050
|
||||
#define R600_CB_COLOR5_BASE 0x28054
|
||||
#define R600_CB_COLOR6_BASE 0x28058
|
||||
#define R600_CB_COLOR7_BASE 0x2805c
|
||||
#define R600_CB_COLOR7_FRAG 0x280fc
|
||||
|
||||
#define R600_TC_CNTL 0x9608
|
||||
# define R600_TC_L2_SIZE(x) ((x) << 5)
|
||||
# define R600_L2_DISABLE_LATE_HIT (1 << 9)
|
||||
|
||||
#define R600_ARB_POP 0x2418
|
||||
# define R600_ENABLE_TC128 (1 << 30)
|
||||
#define R600_ARB_GDEC_RD_CNTL 0x246c
|
||||
|
||||
#define R600_TA_CNTL_AUX 0x9508
|
||||
# define R600_DISABLE_CUBE_WRAP (1 << 0)
|
||||
# define R600_DISABLE_CUBE_ANISO (1 << 1)
|
||||
# define R700_GETLOD_SELECT(x) ((x) << 2)
|
||||
# define R600_SYNC_GRADIENT (1 << 24)
|
||||
# define R600_SYNC_WALKER (1 << 25)
|
||||
# define R600_SYNC_ALIGNER (1 << 26)
|
||||
# define R600_BILINEAR_PRECISION_6_BIT (0 << 31)
|
||||
# define R600_BILINEAR_PRECISION_8_BIT (1 << 31)
|
||||
|
||||
#define R700_TCP_CNTL 0x9610
|
||||
|
||||
#define R600_SMX_DC_CTL0 0xa020
|
||||
# define R700_USE_HASH_FUNCTION (1 << 0)
|
||||
# define R700_CACHE_DEPTH(x) ((x) << 1)
|
||||
# define R700_FLUSH_ALL_ON_EVENT (1 << 10)
|
||||
# define R700_STALL_ON_EVENT (1 << 11)
|
||||
#define R700_SMX_EVENT_CTL 0xa02c
|
||||
# define R700_ES_FLUSH_CTL(x) ((x) << 0)
|
||||
# define R700_GS_FLUSH_CTL(x) ((x) << 3)
|
||||
# define R700_ACK_FLUSH_CTL(x) ((x) << 6)
|
||||
# define R700_SYNC_FLUSH_CTL (1 << 8)
|
||||
|
||||
#define R600_SQ_CONFIG 0x8c00
|
||||
# define R600_VC_ENABLE (1 << 0)
|
||||
# define R600_EXPORT_SRC_C (1 << 1)
|
||||
# define R600_DX9_CONSTS (1 << 2)
|
||||
# define R600_ALU_INST_PREFER_VECTOR (1 << 3)
|
||||
# define R600_DX10_CLAMP (1 << 4)
|
||||
# define R600_CLAUSE_SEQ_PRIO(x) ((x) << 8)
|
||||
# define R600_PS_PRIO(x) ((x) << 24)
|
||||
# define R600_VS_PRIO(x) ((x) << 26)
|
||||
# define R600_GS_PRIO(x) ((x) << 28)
|
||||
# define R600_ES_PRIO(x) ((x) << 30)
|
||||
#define R600_SQ_GPR_RESOURCE_MGMT_1 0x8c04
|
||||
# define R600_NUM_PS_GPRS(x) ((x) << 0)
|
||||
# define R600_NUM_VS_GPRS(x) ((x) << 16)
|
||||
# define R700_DYN_GPR_ENABLE (1 << 27)
|
||||
# define R600_NUM_CLAUSE_TEMP_GPRS(x) ((x) << 28)
|
||||
#define R600_SQ_GPR_RESOURCE_MGMT_2 0x8c08
|
||||
# define R600_NUM_GS_GPRS(x) ((x) << 0)
|
||||
# define R600_NUM_ES_GPRS(x) ((x) << 16)
|
||||
#define R600_SQ_THREAD_RESOURCE_MGMT 0x8c0c
|
||||
# define R600_NUM_PS_THREADS(x) ((x) << 0)
|
||||
# define R600_NUM_VS_THREADS(x) ((x) << 8)
|
||||
# define R600_NUM_GS_THREADS(x) ((x) << 16)
|
||||
# define R600_NUM_ES_THREADS(x) ((x) << 24)
|
||||
#define R600_SQ_STACK_RESOURCE_MGMT_1 0x8c10
|
||||
# define R600_NUM_PS_STACK_ENTRIES(x) ((x) << 0)
|
||||
# define R600_NUM_VS_STACK_ENTRIES(x) ((x) << 16)
|
||||
#define R600_SQ_STACK_RESOURCE_MGMT_2 0x8c14
|
||||
# define R600_NUM_GS_STACK_ENTRIES(x) ((x) << 0)
|
||||
# define R600_NUM_ES_STACK_ENTRIES(x) ((x) << 16)
|
||||
#define R600_SQ_MS_FIFO_SIZES 0x8cf0
|
||||
# define R600_CACHE_FIFO_SIZE(x) ((x) << 0)
|
||||
# define R600_FETCH_FIFO_HIWATER(x) ((x) << 8)
|
||||
# define R600_DONE_FIFO_HIWATER(x) ((x) << 16)
|
||||
# define R600_ALU_UPDATE_FIFO_HIWATER(x) ((x) << 24)
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_0 0x8db0
|
||||
# define R700_SIMDA_RING0(x) ((x) << 0)
|
||||
# define R700_SIMDA_RING1(x) ((x) << 8)
|
||||
# define R700_SIMDB_RING0(x) ((x) << 16)
|
||||
# define R700_SIMDB_RING1(x) ((x) << 24)
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_1 0x8db4
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_2 0x8db8
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_3 0x8dbc
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_4 0x8dc0
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_5 0x8dc4
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_6 0x8dc8
|
||||
#define R700_SQ_DYN_GPR_SIZE_SIMD_AB_7 0x8dcc
|
||||
|
||||
#define R600_SPI_PS_IN_CONTROL_0 0x286cc
|
||||
# define R600_NUM_INTERP(x) ((x) << 0)
|
||||
# define R600_POSITION_ENA (1 << 8)
|
||||
# define R600_POSITION_CENTROID (1 << 9)
|
||||
# define R600_POSITION_ADDR(x) ((x) << 10)
|
||||
# define R600_PARAM_GEN(x) ((x) << 15)
|
||||
# define R600_PARAM_GEN_ADDR(x) ((x) << 19)
|
||||
# define R600_BARYC_SAMPLE_CNTL(x) ((x) << 26)
|
||||
# define R600_PERSP_GRADIENT_ENA (1 << 28)
|
||||
# define R600_LINEAR_GRADIENT_ENA (1 << 29)
|
||||
# define R600_POSITION_SAMPLE (1 << 30)
|
||||
# define R600_BARYC_AT_SAMPLE_ENA (1 << 31)
|
||||
#define R600_SPI_PS_IN_CONTROL_1 0x286d0
|
||||
# define R600_GEN_INDEX_PIX (1 << 0)
|
||||
# define R600_GEN_INDEX_PIX_ADDR(x) ((x) << 1)
|
||||
# define R600_FRONT_FACE_ENA (1 << 8)
|
||||
# define R600_FRONT_FACE_CHAN(x) ((x) << 9)
|
||||
# define R600_FRONT_FACE_ALL_BITS (1 << 11)
|
||||
# define R600_FRONT_FACE_ADDR(x) ((x) << 12)
|
||||
# define R600_FOG_ADDR(x) ((x) << 17)
|
||||
# define R600_FIXED_PT_POSITION_ENA (1 << 24)
|
||||
# define R600_FIXED_PT_POSITION_ADDR(x) ((x) << 25)
|
||||
# define R700_POSITION_ULC (1 << 30)
|
||||
#define R600_SPI_INPUT_Z 0x286d8
|
||||
|
||||
#define R600_SPI_CONFIG_CNTL 0x9100
|
||||
# define R600_GPR_WRITE_PRIORITY(x) ((x) << 0)
|
||||
# define R600_DISABLE_INTERP_1 (1 << 5)
|
||||
#define R600_SPI_CONFIG_CNTL_1 0x913c
|
||||
# define R600_VTX_DONE_DELAY(x) ((x) << 0)
|
||||
# define R600_INTERP_ONE_PRIM_PER_ROW (1 << 4)
|
||||
|
||||
#define R600_GB_TILING_CONFIG 0x98f0
|
||||
# define R600_PIPE_TILING(x) ((x) << 1)
|
||||
# define R600_BANK_TILING(x) ((x) << 4)
|
||||
# define R600_GROUP_SIZE(x) ((x) << 6)
|
||||
# define R600_ROW_TILING(x) ((x) << 8)
|
||||
# define R600_BANK_SWAPS(x) ((x) << 11)
|
||||
# define R600_SAMPLE_SPLIT(x) ((x) << 14)
|
||||
# define R600_BACKEND_MAP(x) ((x) << 16)
|
||||
#define R600_DCP_TILING_CONFIG 0x6ca0
|
||||
#define R600_HDP_TILING_CONFIG 0x2f3c
|
||||
|
||||
#define R600_CC_RB_BACKEND_DISABLE 0x98f4
|
||||
#define R700_CC_SYS_RB_BACKEND_DISABLE 0x3f88
|
||||
# define R600_BACKEND_DISABLE(x) ((x) << 16)
|
||||
|
||||
#define R600_CC_GC_SHADER_PIPE_CONFIG 0x8950
|
||||
#define R600_GC_USER_SHADER_PIPE_CONFIG 0x8954
|
||||
# define R600_INACTIVE_QD_PIPES(x) ((x) << 8)
|
||||
# define R600_INACTIVE_QD_PIPES_MASK (0xff << 8)
|
||||
# define R600_INACTIVE_SIMDS(x) ((x) << 16)
|
||||
# define R600_INACTIVE_SIMDS_MASK (0xff << 16)
|
||||
|
||||
#define R700_CGTS_SYS_TCC_DISABLE 0x3f90
|
||||
#define R700_CGTS_USER_SYS_TCC_DISABLE 0x3f94
|
||||
#define R700_CGTS_TCC_DISABLE 0x9148
|
||||
#define R700_CGTS_USER_TCC_DISABLE 0x914c
|
||||
|
||||
/* Constants */
|
||||
#define RADEON_MAX_USEC_TIMEOUT 100000 /* 100 ms */
|
||||
|
||||
|
@ -1190,6 +1734,11 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
#define RADEON_LAST_SWI_REG RADEON_SCRATCH_REG3
|
||||
#define RADEON_LAST_DISPATCH 1
|
||||
|
||||
#define R600_LAST_FRAME_REG R600_SCRATCH_REG0
|
||||
#define R600_LAST_DISPATCH_REG R600_SCRATCH_REG1
|
||||
#define R600_LAST_CLEAR_REG R600_SCRATCH_REG2
|
||||
#define R600_LAST_SWI_REG R600_SCRATCH_REG3
|
||||
|
||||
#define RADEON_MAX_VB_AGE 0x7fffffff
|
||||
#define RADEON_MAX_VB_VERTS (0xffff)
|
||||
|
||||
|
@ -1198,7 +1747,15 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,
|
|||
#define RADEON_PCIGART_TABLE_SIZE (32*1024)
|
||||
|
||||
#define RADEON_READ(reg) DRM_READ32( dev_priv->mmio, (reg) )
|
||||
#define RADEON_WRITE(reg,val) DRM_WRITE32( dev_priv->mmio, (reg), (val) )
|
||||
#define RADEON_WRITE(reg, val) \
|
||||
do { \
|
||||
if (reg < 0x10000) { \
|
||||
DRM_WRITE32(dev_priv->mmio, (reg), (val)); \
|
||||
} else { \
|
||||
DRM_WRITE32(dev_priv->mmio, RADEON_MM_INDEX, (reg)); \
|
||||
DRM_WRITE32(dev_priv->mmio, RADEON_MM_DATA, (val)); \
|
||||
} \
|
||||
} while (0)
|
||||
#define RADEON_READ8(reg) DRM_READ8( dev_priv->mmio, (reg) )
|
||||
#define RADEON_WRITE8(reg,val) DRM_WRITE8( dev_priv->mmio, (reg), (val) )
|
||||
|
||||
|
@ -1238,11 +1795,19 @@ do { \
|
|||
RADEON_WRITE(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); \
|
||||
} while (0)
|
||||
|
||||
#define RS600_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
RADEON_WRITE(RS600_MC_INDEX, RS600_MC_IND_WR_EN | RS600_MC_IND_CITF_ARB0 | ((addr) & RS600_MC_ADDR_MASK)); \
|
||||
RADEON_WRITE(RS600_MC_DATA, val); \
|
||||
} while (0)
|
||||
|
||||
#define IGP_WRITE_MCIND(addr, val) \
|
||||
do { \
|
||||
if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) || \
|
||||
((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) \
|
||||
RS690_WRITE_MCIND(addr, val); \
|
||||
else if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS600) \
|
||||
RS600_WRITE_MCIND(addr, val); \
|
||||
else \
|
||||
RS480_WRITE_MCIND(addr, val); \
|
||||
} while (0)
|
||||
|
@ -1346,7 +1911,11 @@ do { \
|
|||
struct drm_radeon_master_private *master_priv = file_priv->master->driver_priv; \
|
||||
drm_radeon_sarea_t *sarea_priv = master_priv->sarea_priv; \
|
||||
if ( sarea_priv->last_dispatch >= RADEON_MAX_VB_AGE ) { \
|
||||
int __ret = radeon_do_cp_idle( dev_priv ); \
|
||||
int __ret; \
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) \
|
||||
__ret = r600_do_cp_idle(dev_priv); \
|
||||
else \
|
||||
__ret = radeon_do_cp_idle(dev_priv); \
|
||||
if ( __ret ) return __ret; \
|
||||
sarea_priv->last_dispatch = 0; \
|
||||
radeon_freelist_reset( dev ); \
|
||||
|
@ -1368,21 +1937,40 @@ do { \
|
|||
OUT_RING( age ); \
|
||||
} while (0)
|
||||
|
||||
#define R600_DISPATCH_AGE(age) do { \
|
||||
OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1)); \
|
||||
OUT_RING((R600_LAST_DISPATCH_REG - R600_SET_CONFIG_REG_OFFSET) >> 2); \
|
||||
OUT_RING(age); \
|
||||
} while (0)
|
||||
|
||||
#define R600_FRAME_AGE(age) do { \
|
||||
OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1)); \
|
||||
OUT_RING((R600_LAST_FRAME_REG - R600_SET_CONFIG_REG_OFFSET) >> 2); \
|
||||
OUT_RING(age); \
|
||||
} while (0)
|
||||
|
||||
#define R600_CLEAR_AGE(age) do { \
|
||||
OUT_RING(CP_PACKET3(R600_IT_SET_CONFIG_REG, 1)); \
|
||||
OUT_RING((R600_LAST_CLEAR_REG - R600_SET_CONFIG_REG_OFFSET) >> 2); \
|
||||
OUT_RING(age); \
|
||||
} while (0)
|
||||
|
||||
/* ================================================================
|
||||
* Ring control
|
||||
*/
|
||||
|
||||
#define RADEON_VERBOSE 0
|
||||
|
||||
#define RING_LOCALS int write, _nr; unsigned int mask; u32 *ring;
|
||||
#define RING_LOCALS int write, _nr, _align_nr; unsigned int mask; u32 *ring;
|
||||
|
||||
#define BEGIN_RING( n ) do { \
|
||||
if ( RADEON_VERBOSE ) { \
|
||||
DRM_INFO( "BEGIN_RING( %d )\n", (n)); \
|
||||
} \
|
||||
if ( dev_priv->ring.space <= (n) * sizeof(u32) ) { \
|
||||
_align_nr = (n + 0xf) & ~0xf; \
|
||||
if (dev_priv->ring.space <= (_align_nr * sizeof(u32))) { \
|
||||
COMMIT_RING(); \
|
||||
radeon_wait_ring( dev_priv, (n) * sizeof(u32) ); \
|
||||
radeon_wait_ring( dev_priv, _align_nr * sizeof(u32)); \
|
||||
} \
|
||||
_nr = n; dev_priv->ring.space -= (n) * sizeof(u32); \
|
||||
ring = dev_priv->ring.start; \
|
||||
|
@ -1399,19 +1987,16 @@ do { \
|
|||
DRM_ERROR( \
|
||||
"ADVANCE_RING(): mismatch: nr: %x write: %x line: %d\n", \
|
||||
((dev_priv->ring.tail + _nr) & mask), \
|
||||
write, __LINE__); \
|
||||
write, __LINE__); \
|
||||
} else \
|
||||
dev_priv->ring.tail = write; \
|
||||
} while (0)
|
||||
|
||||
extern void radeon_commit_ring(drm_radeon_private_t *dev_priv);
|
||||
|
||||
#define COMMIT_RING() do { \
|
||||
/* Flush writes to ring */ \
|
||||
DRM_MEMORYBARRIER(); \
|
||||
GET_RING_HEAD( dev_priv ); \
|
||||
RADEON_WRITE( RADEON_CP_RB_WPTR, dev_priv->ring.tail ); \
|
||||
/* read from PCI bus to ensure correct posting */ \
|
||||
RADEON_READ( RADEON_CP_RB_RPTR ); \
|
||||
} while (0)
|
||||
radeon_commit_ring(dev_priv); \
|
||||
} while(0)
|
||||
|
||||
#define OUT_RING( x ) do { \
|
||||
if ( RADEON_VERBOSE ) { \
|
||||
|
|
|
@ -65,7 +65,7 @@ int radeon_enable_vblank(struct drm_device *dev, int crtc)
|
|||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
|
||||
switch (crtc) {
|
||||
case 0:
|
||||
r500_vbl_irq_set_state(dev, R500_D1MODE_INT_MASK, 1);
|
||||
|
@ -100,7 +100,7 @@ void radeon_disable_vblank(struct drm_device *dev, int crtc)
|
|||
{
|
||||
drm_radeon_private_t *dev_priv = dev->dev_private;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
|
||||
switch (crtc) {
|
||||
case 0:
|
||||
r500_vbl_irq_set_state(dev, R500_D1MODE_INT_MASK, 0);
|
||||
|
@ -135,7 +135,7 @@ static inline u32 radeon_acknowledge_irqs(drm_radeon_private_t *dev_priv, u32 *r
|
|||
u32 irq_mask = RADEON_SW_INT_TEST;
|
||||
|
||||
*r500_disp_int = 0;
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
|
||||
/* vbl interrupts in a different place */
|
||||
|
||||
if (irqs & R500_DISPLAY_INT_STATUS) {
|
||||
|
@ -202,7 +202,7 @@ irqreturn_t radeon_driver_irq_handler(DRM_IRQ_ARGS)
|
|||
DRM_WAKEUP(&dev_priv->swi_queue);
|
||||
|
||||
/* VBLANK interrupt */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
|
||||
if (r500_disp_int & R500_D1_VBLANK_INTERRUPT)
|
||||
drm_handle_vblank(dev, 0);
|
||||
if (r500_disp_int & R500_D2_VBLANK_INTERRUPT)
|
||||
|
@ -265,7 +265,7 @@ u32 radeon_get_vblank_counter(struct drm_device *dev, int crtc)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600) {
|
||||
if (crtc == 0)
|
||||
return RADEON_READ(R500_D1CRTC_FRAME_COUNT);
|
||||
else
|
||||
|
@ -327,7 +327,7 @@ void radeon_driver_irq_preinstall(struct drm_device * dev)
|
|||
u32 dummy;
|
||||
|
||||
/* Disable *all* interrupts */
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
|
||||
RADEON_WRITE(R500_DxMODE_INT_MASK, 0);
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
|
||||
|
||||
|
@ -357,7 +357,7 @@ void radeon_driver_irq_uninstall(struct drm_device * dev)
|
|||
if (!dev_priv)
|
||||
return;
|
||||
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS600)
|
||||
RADEON_WRITE(R500_DxMODE_INT_MASK, 0);
|
||||
/* Disable *all* interrupts */
|
||||
RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
|
||||
|
|
|
@ -1556,9 +1556,15 @@ static void radeon_cp_discard_buffer(struct drm_device *dev, struct drm_master *
|
|||
buf_priv->age = ++master_priv->sarea_priv->last_dispatch;
|
||||
|
||||
/* Emit the vertex buffer age */
|
||||
BEGIN_RING(2);
|
||||
RADEON_DISPATCH_AGE(buf_priv->age);
|
||||
ADVANCE_RING();
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600) {
|
||||
BEGIN_RING(3);
|
||||
R600_DISPATCH_AGE(buf_priv->age);
|
||||
ADVANCE_RING();
|
||||
} else {
|
||||
BEGIN_RING(2);
|
||||
RADEON_DISPATCH_AGE(buf_priv->age);
|
||||
ADVANCE_RING();
|
||||
}
|
||||
|
||||
buf->pending = 1;
|
||||
buf->used = 0;
|
||||
|
@ -1980,7 +1986,7 @@ static int alloc_surface(drm_radeon_surface_alloc_t *new,
|
|||
|
||||
/* find a virtual surface */
|
||||
for (i = 0; i < 2 * RADEON_MAX_SURFACES; i++)
|
||||
if (dev_priv->virt_surfaces[i].file_priv == 0)
|
||||
if (dev_priv->virt_surfaces[i].file_priv == NULL)
|
||||
break;
|
||||
if (i == 2 * RADEON_MAX_SURFACES) {
|
||||
return -1;
|
||||
|
@ -2473,24 +2479,25 @@ static int radeon_cp_indirect(struct drm_device *dev, void *data, struct drm_fil
|
|||
|
||||
buf->used = indirect->end;
|
||||
|
||||
/* Wait for the 3D stream to idle before the indirect buffer
|
||||
* containing 2D acceleration commands is processed.
|
||||
*/
|
||||
BEGIN_RING(2);
|
||||
|
||||
RADEON_WAIT_UNTIL_3D_IDLE();
|
||||
|
||||
ADVANCE_RING();
|
||||
|
||||
/* Dispatch the indirect buffer full of commands from the
|
||||
* X server. This is insecure and is thus only available to
|
||||
* privileged clients.
|
||||
*/
|
||||
radeon_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
|
||||
if (indirect->discard) {
|
||||
radeon_cp_discard_buffer(dev, file_priv->master, buf);
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
r600_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
|
||||
else {
|
||||
/* Wait for the 3D stream to idle before the indirect buffer
|
||||
* containing 2D acceleration commands is processed.
|
||||
*/
|
||||
BEGIN_RING(2);
|
||||
RADEON_WAIT_UNTIL_3D_IDLE();
|
||||
ADVANCE_RING();
|
||||
radeon_cp_dispatch_indirect(dev, buf, indirect->start, indirect->end);
|
||||
}
|
||||
|
||||
if (indirect->discard)
|
||||
radeon_cp_discard_buffer(dev, file_priv->master, buf);
|
||||
|
||||
COMMIT_RING();
|
||||
return 0;
|
||||
}
|
||||
|
@ -3010,14 +3017,14 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
|
|||
break;
|
||||
case RADEON_PARAM_LAST_FRAME:
|
||||
dev_priv->stats.last_frame_reads++;
|
||||
value = GET_SCRATCH(0);
|
||||
value = GET_SCRATCH(dev_priv, 0);
|
||||
break;
|
||||
case RADEON_PARAM_LAST_DISPATCH:
|
||||
value = GET_SCRATCH(1);
|
||||
value = GET_SCRATCH(dev_priv, 1);
|
||||
break;
|
||||
case RADEON_PARAM_LAST_CLEAR:
|
||||
dev_priv->stats.last_clear_reads++;
|
||||
value = GET_SCRATCH(2);
|
||||
value = GET_SCRATCH(dev_priv, 2);
|
||||
break;
|
||||
case RADEON_PARAM_IRQ_NR:
|
||||
value = drm_dev_to_irq(dev);
|
||||
|
@ -3052,7 +3059,10 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil
|
|||
case RADEON_PARAM_SCRATCH_OFFSET:
|
||||
if (!dev_priv->writeback_works)
|
||||
return -EINVAL;
|
||||
value = RADEON_SCRATCH_REG_OFFSET;
|
||||
if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R600)
|
||||
value = R600_SCRATCH_REG_OFFSET;
|
||||
else
|
||||
value = RADEON_SCRATCH_REG_OFFSET;
|
||||
break;
|
||||
case RADEON_PARAM_CARD_TYPE:
|
||||
if (dev_priv->flags & RADEON_IS_PCIE)
|
||||
|
@ -3155,6 +3165,7 @@ void radeon_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
|
|||
|
||||
void radeon_driver_lastclose(struct drm_device *dev)
|
||||
{
|
||||
radeon_surfaces_release(PCIGART_FILE_PRIV, dev->dev_private);
|
||||
radeon_do_release(dev);
|
||||
}
|
||||
|
||||
|
|
|
@ -599,8 +599,8 @@ int savage_driver_firstopen(struct drm_device *dev)
|
|||
drm_mtrr_add(dev_priv->mtrr[2].base,
|
||||
dev_priv->mtrr[2].size, DRM_MTRR_WC);
|
||||
} else {
|
||||
DRM_ERROR("strange pci_resource_len %08lx\n",
|
||||
drm_get_resource_len(dev, 0));
|
||||
DRM_ERROR("strange pci_resource_len %08llx\n",
|
||||
(unsigned long long)drm_get_resource_len(dev, 0));
|
||||
}
|
||||
} else if (dev_priv->chipset != S3_SUPERSAVAGE &&
|
||||
dev_priv->chipset != S3_SAVAGE2000) {
|
||||
|
@ -620,8 +620,8 @@ int savage_driver_firstopen(struct drm_device *dev)
|
|||
drm_mtrr_add(dev_priv->mtrr[0].base,
|
||||
dev_priv->mtrr[0].size, DRM_MTRR_WC);
|
||||
} else {
|
||||
DRM_ERROR("strange pci_resource_len %08lx\n",
|
||||
drm_get_resource_len(dev, 1));
|
||||
DRM_ERROR("strange pci_resource_len %08llx\n",
|
||||
(unsigned long long)drm_get_resource_len(dev, 1));
|
||||
}
|
||||
} else {
|
||||
mmio_base = drm_get_resource_start(dev, 0);
|
||||
|
|
|
@ -28,11 +28,6 @@
|
|||
|
||||
#include "drm_pciids.h"
|
||||
|
||||
static int dri_library_name(struct drm_device *dev, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "unichrome");
|
||||
}
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
viadrv_PCI_IDS
|
||||
};
|
||||
|
@ -52,7 +47,6 @@ static struct drm_driver driver = {
|
|||
.irq_uninstall = via_driver_irq_uninstall,
|
||||
.irq_handler = via_driver_irq_handler,
|
||||
.dma_quiescent = via_driver_dma_quiescent,
|
||||
.dri_library_name = dri_library_name,
|
||||
.reclaim_buffers = drm_core_reclaim_buffers,
|
||||
.reclaim_buffers_locked = NULL,
|
||||
.reclaim_buffers_idlelocked = via_reclaim_buffers_locked,
|
||||
|
|
|
@ -281,16 +281,16 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
|
|||
|
||||
struct drm_ioctl_desc {
|
||||
unsigned int cmd;
|
||||
drm_ioctl_t *func;
|
||||
int flags;
|
||||
drm_ioctl_t *func;
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a driver or general drm_ioctl_desc array entry for the given
|
||||
* ioctl, for use by drm_ioctl().
|
||||
*/
|
||||
#define DRM_IOCTL_DEF(ioctl, func, flags) \
|
||||
[DRM_IOCTL_NR(ioctl)] = {ioctl, func, flags}
|
||||
#define DRM_IOCTL_DEF(ioctl, _func, _flags) \
|
||||
[DRM_IOCTL_NR(ioctl)] = {.cmd = ioctl, .func = _func, .flags = _flags}
|
||||
|
||||
struct drm_magic_entry {
|
||||
struct list_head head;
|
||||
|
@ -522,20 +522,33 @@ struct drm_mm {
|
|||
};
|
||||
|
||||
|
||||
/**
|
||||
* Kernel side of a mapping
|
||||
*/
|
||||
struct drm_local_map {
|
||||
resource_size_t offset; /**< Requested physical address (0 for SAREA)*/
|
||||
unsigned long size; /**< Requested physical size (bytes) */
|
||||
enum drm_map_type type; /**< Type of memory to map */
|
||||
enum drm_map_flags flags; /**< Flags */
|
||||
void *handle; /**< User-space: "Handle" to pass to mmap() */
|
||||
/**< Kernel-space: kernel-virtual address */
|
||||
int mtrr; /**< MTRR slot used */
|
||||
};
|
||||
|
||||
typedef struct drm_local_map drm_local_map_t;
|
||||
|
||||
/**
|
||||
* Mappings list
|
||||
*/
|
||||
struct drm_map_list {
|
||||
struct list_head head; /**< list head */
|
||||
struct drm_hash_item hash;
|
||||
struct drm_map *map; /**< mapping */
|
||||
struct drm_local_map *map; /**< mapping */
|
||||
uint64_t user_token;
|
||||
struct drm_master *master;
|
||||
struct drm_mm_node *file_offset_node; /**< fake offset */
|
||||
};
|
||||
|
||||
typedef struct drm_map drm_local_map_t;
|
||||
|
||||
/**
|
||||
* Context handle list
|
||||
*/
|
||||
|
@ -560,7 +573,7 @@ struct drm_ati_pcigart_info {
|
|||
dma_addr_t bus_addr;
|
||||
dma_addr_t table_mask;
|
||||
struct drm_dma_handle *table_handle;
|
||||
drm_local_map_t mapping;
|
||||
struct drm_local_map mapping;
|
||||
int table_size;
|
||||
};
|
||||
|
||||
|
@ -675,7 +688,6 @@ struct drm_driver {
|
|||
int (*kernel_context_switch) (struct drm_device *dev, int old,
|
||||
int new);
|
||||
void (*kernel_context_switch_unlock) (struct drm_device *dev);
|
||||
int (*dri_library_name) (struct drm_device *dev, char *buf);
|
||||
|
||||
/**
|
||||
* get_vblank_counter - get raw hardware vblank counter
|
||||
|
@ -747,8 +759,8 @@ struct drm_driver {
|
|||
struct drm_file *file_priv);
|
||||
void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
|
||||
struct drm_file *file_priv);
|
||||
unsigned long (*get_map_ofs) (struct drm_map * map);
|
||||
unsigned long (*get_reg_ofs) (struct drm_device *dev);
|
||||
resource_size_t (*get_map_ofs) (struct drm_local_map * map);
|
||||
resource_size_t (*get_reg_ofs) (struct drm_device *dev);
|
||||
void (*set_version) (struct drm_device *dev,
|
||||
struct drm_set_version *sv);
|
||||
|
||||
|
@ -981,7 +993,7 @@ struct drm_device {
|
|||
sigset_t sigmask;
|
||||
|
||||
struct drm_driver *driver;
|
||||
drm_local_map_t *agp_buffer_map;
|
||||
struct drm_local_map *agp_buffer_map;
|
||||
unsigned int agp_buffer_token;
|
||||
struct drm_minor *control; /**< Control node for card */
|
||||
struct drm_minor *primary; /**< render type primary screen head */
|
||||
|
@ -1098,8 +1110,8 @@ extern int drm_release(struct inode *inode, struct file *filp);
|
|||
extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
|
||||
extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma);
|
||||
extern void drm_vm_open_locked(struct vm_area_struct *vma);
|
||||
extern unsigned long drm_core_get_map_ofs(struct drm_map * map);
|
||||
extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev);
|
||||
extern resource_size_t drm_core_get_map_ofs(struct drm_local_map * map);
|
||||
extern resource_size_t drm_core_get_reg_ofs(struct drm_device *dev);
|
||||
extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
|
||||
|
||||
/* Memory management support (drm_memory.h) */
|
||||
|
@ -1202,13 +1214,13 @@ extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv
|
|||
/* Buffer management support (drm_bufs.h) */
|
||||
extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
|
||||
extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request);
|
||||
extern int drm_addmap(struct drm_device *dev, unsigned int offset,
|
||||
extern int drm_addmap(struct drm_device *dev, resource_size_t offset,
|
||||
unsigned int size, enum drm_map_type type,
|
||||
enum drm_map_flags flags, drm_local_map_t ** map_ptr);
|
||||
enum drm_map_flags flags, struct drm_local_map **map_ptr);
|
||||
extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_rmmap(struct drm_device *dev, drm_local_map_t *map);
|
||||
extern int drm_rmmap_locked(struct drm_device *dev, drm_local_map_t *map);
|
||||
extern int drm_rmmap(struct drm_device *dev, struct drm_local_map *map);
|
||||
extern int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map);
|
||||
extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_addbufs(struct drm_device *dev, void *data,
|
||||
|
@ -1222,10 +1234,10 @@ extern int drm_freebufs(struct drm_device *dev, void *data,
|
|||
extern int drm_mapbufs(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
extern int drm_order(unsigned long size);
|
||||
extern unsigned long drm_get_resource_start(struct drm_device *dev,
|
||||
extern resource_size_t drm_get_resource_start(struct drm_device *dev,
|
||||
unsigned int resource);
|
||||
extern resource_size_t drm_get_resource_len(struct drm_device *dev,
|
||||
unsigned int resource);
|
||||
extern unsigned long drm_get_resource_len(struct drm_device *dev,
|
||||
unsigned int resource);
|
||||
|
||||
/* DMA support (drm_dma.h) */
|
||||
extern int drm_dma_setup(struct drm_device *dev);
|
||||
|
@ -1301,7 +1313,7 @@ extern struct drm_master *drm_master_get(struct drm_master *master);
|
|||
extern void drm_master_put(struct drm_master **master);
|
||||
extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
|
||||
struct drm_driver *driver);
|
||||
extern int drm_put_dev(struct drm_device *dev);
|
||||
extern void drm_put_dev(struct drm_device *dev);
|
||||
extern int drm_put_minor(struct drm_minor **minor);
|
||||
extern unsigned int drm_debug;
|
||||
|
||||
|
@ -1311,7 +1323,7 @@ extern struct dentry *drm_debugfs_root;
|
|||
|
||||
extern struct idr drm_minors_idr;
|
||||
|
||||
extern drm_local_map_t *drm_getsarea(struct drm_device *dev);
|
||||
extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
|
||||
|
||||
/* Proc support (drm_proc.h) */
|
||||
extern int drm_proc_init(struct drm_minor *minor, int minor_id,
|
||||
|
@ -1453,12 +1465,12 @@ int drm_gem_open_ioctl(struct drm_device *dev, void *data,
|
|||
void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
|
||||
void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
|
||||
|
||||
extern void drm_core_ioremap(struct drm_map *map, struct drm_device *dev);
|
||||
extern void drm_core_ioremap_wc(struct drm_map *map, struct drm_device *dev);
|
||||
extern void drm_core_ioremapfree(struct drm_map *map, struct drm_device *dev);
|
||||
extern void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev);
|
||||
extern void drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
|
||||
extern void drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
|
||||
|
||||
static __inline__ struct drm_map *drm_core_findmap(struct drm_device *dev,
|
||||
unsigned int token)
|
||||
static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
|
||||
unsigned int token)
|
||||
{
|
||||
struct drm_map_list *_entry;
|
||||
list_for_each_entry(_entry, &dev->maplist, head)
|
||||
|
@ -1485,7 +1497,7 @@ static __inline__ int drm_device_is_pcie(struct drm_device *dev)
|
|||
return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
|
||||
}
|
||||
|
||||
static __inline__ void drm_core_dropmap(struct drm_map *map)
|
||||
static __inline__ void drm_core_dropmap(struct drm_local_map *map)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -550,7 +550,7 @@ struct drm_mode_config {
|
|||
int min_width, min_height;
|
||||
int max_width, max_height;
|
||||
struct drm_mode_config_funcs *funcs;
|
||||
unsigned long fb_base;
|
||||
resource_size_t fb_base;
|
||||
|
||||
/* pointers to standard properties */
|
||||
struct list_head property_blob_list;
|
||||
|
@ -613,7 +613,8 @@ extern void drm_fb_release(struct drm_file *file_priv);
|
|||
extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
|
||||
extern struct edid *drm_get_edid(struct drm_connector *connector,
|
||||
struct i2c_adapter *adapter);
|
||||
extern unsigned char *drm_do_probe_ddc_edid(struct i2c_adapter *adapter);
|
||||
extern int drm_do_probe_ddc_edid(struct i2c_adapter *adapter,
|
||||
unsigned char *buf, int len);
|
||||
extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
|
||||
extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
|
||||
extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode);
|
||||
|
@ -731,4 +732,5 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
|
|||
void *data, struct drm_file *file_priv);
|
||||
extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
|
||||
void *data, struct drm_file *file_priv);
|
||||
extern bool drm_detect_hdmi_monitor(struct edid *edid);
|
||||
#endif /* __DRM_CRTC_H__ */
|
||||
|
|
|
@ -6,6 +6,19 @@
|
|||
#include <linux/interrupt.h> /* For task queue support */
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifndef readq
|
||||
static u64 readq(void __iomem *reg)
|
||||
{
|
||||
return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
|
||||
}
|
||||
|
||||
static void writeq(u64 val, void __iomem *reg)
|
||||
{
|
||||
writel(val & 0xffffffff, reg);
|
||||
writel(val >> 32, reg + 0x4UL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Current process ID */
|
||||
#define DRM_CURRENTPID task_pid_nr(current)
|
||||
#define DRM_SUSER(p) capable(CAP_SYS_ADMIN)
|
||||
|
@ -23,6 +36,12 @@
|
|||
/** Write a dword into a MMIO region */
|
||||
#define DRM_WRITE32(map, offset, val) writel(val, ((void __iomem *)(map)->handle) + (offset))
|
||||
/** Read memory barrier */
|
||||
|
||||
/** Read a qword from a MMIO region - be careful using these unless you really understand them */
|
||||
#define DRM_READ64(map, offset) readq(((void __iomem *)(map)->handle) + (offset))
|
||||
/** Write a qword into a MMIO region */
|
||||
#define DRM_WRITE64(map, offset, val) writeq(val, ((void __iomem *)(map)->handle) + (offset))
|
||||
|
||||
#define DRM_READMEMORYBARRIER() rmb()
|
||||
/** Write memory barrier */
|
||||
#define DRM_WRITEMEMORYBARRIER() wmb()
|
||||
|
|
|
@ -239,10 +239,123 @@
|
|||
{0x1002, 0x7835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x791e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x791f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS690|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x793f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x7941, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x7942, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS600|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x796c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x796d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x796e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x796f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS740|RADEON_IS_IGP|RADEON_NEW_MEMMAP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x9400, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9401, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9402, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9403, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x940A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x940B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x940F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R600|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9440, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9441, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9442, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9444, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x944A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x944B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x944C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x944E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9450, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9452, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9456, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x945A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x945B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x946A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x946B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x947A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x947B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV770|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9480, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9487, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9488, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9489, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x948F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9490, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9491, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9498, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x949C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x949E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x949F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV730|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94C9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94CB, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x94CD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV610|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9500, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9501, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9504, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9505, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9506, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9507, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9508, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9509, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x950F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9511, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9515, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9517, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9519, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV670|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9540, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9541, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9542, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x954E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x954F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9552, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9553, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9555, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV710|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9580, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9581, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9583, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9586, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9587, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9588, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9589, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x958F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV630|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9590, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9591, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9593, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9595, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9596, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9597, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9598, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9599, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x959B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV635|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C9, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95C4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95CC, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95CD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95CE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x95CF, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV620|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x9610, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9611, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9612, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9613, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9614, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9615, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9616, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS780|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0, 0, 0}
|
||||
|
||||
#define r128_PCI_IDS \
|
||||
|
|
|
@ -306,6 +306,8 @@ typedef union {
|
|||
|
||||
#define RADEON_SCRATCH_REG_OFFSET 32
|
||||
|
||||
#define R600_SCRATCH_REG_OFFSET 256
|
||||
|
||||
#define RADEON_NR_SAREA_CLIPRECTS 12
|
||||
|
||||
/* There are 2 heaps (local/GART). Each region within a heap is a
|
||||
|
@ -528,7 +530,8 @@ typedef struct drm_radeon_init {
|
|||
RADEON_INIT_CP = 0x01,
|
||||
RADEON_CLEANUP_CP = 0x02,
|
||||
RADEON_INIT_R200_CP = 0x03,
|
||||
RADEON_INIT_R300_CP = 0x04
|
||||
RADEON_INIT_R300_CP = 0x04,
|
||||
RADEON_INIT_R600_CP = 0x05
|
||||
} func;
|
||||
unsigned long sarea_priv_offset;
|
||||
int is_pci;
|
||||
|
|
Loading…
Reference in New Issue