2005-01-06 01:43:34 +00:00
|
|
|
/*-
|
2002-04-27 20:47:57 +00:00
|
|
|
* Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
|
|
|
|
* Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice (including the next
|
|
|
|
* paragraph) shall be included in all copies or substantial portions of the
|
|
|
|
* Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
* VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
|
|
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
|
|
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
|
* OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Rickard E. (Rik) Faith <faith@valinux.com>
|
|
|
|
* Gareth Hughes <gareth@valinux.com>
|
2003-08-19 02:57:31 +00:00
|
|
|
*
|
2002-04-27 20:47:57 +00:00
|
|
|
*/
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
#include <sys/cdefs.h>
|
|
|
|
__FBSDID("$FreeBSD$");
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
/** @file drm_bufs.c
|
|
|
|
* Implementation of the ioctls for setup of DRM mappings and DMA buffers.
|
|
|
|
*/
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
#include "dev/pci/pcireg.h"
|
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
#include "dev/drm/drmP.h"
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
/* Allocation of PCI memory resources (framebuffer, registers, etc.) for
|
|
|
|
* drm_get_resource_*. Note that they are not RF_ACTIVE, so there's no virtual
|
|
|
|
* address for accessing them. Cleaned up at unload.
|
|
|
|
*/
|
2008-08-23 20:59:12 +00:00
|
|
|
static int drm_alloc_resource(struct drm_device *dev, int resource)
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
{
|
2009-08-23 14:27:46 +00:00
|
|
|
struct resource *res;
|
|
|
|
int rid;
|
|
|
|
|
|
|
|
DRM_SPINLOCK_ASSERT(&dev->dev_lock);
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
if (resource >= DRM_MAX_PCI_RESOURCE) {
|
|
|
|
DRM_ERROR("Resource %d too large\n", resource);
|
|
|
|
return 1;
|
|
|
|
}
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
if (dev->pcir[resource] != NULL) {
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2009-08-23 14:27:46 +00:00
|
|
|
DRM_UNLOCK();
|
|
|
|
rid = PCIR_BAR(resource);
|
|
|
|
res = bus_alloc_resource_any(dev->device, SYS_RES_MEMORY, &rid,
|
|
|
|
RF_SHAREABLE);
|
2005-11-28 23:13:57 +00:00
|
|
|
DRM_LOCK();
|
2009-08-23 14:27:46 +00:00
|
|
|
if (res == NULL) {
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
DRM_ERROR("Couldn't find resource 0x%x\n", resource);
|
2005-11-28 23:13:57 +00:00
|
|
|
return 1;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
|
|
|
|
2009-08-23 14:27:46 +00:00
|
|
|
if (dev->pcir[resource] == NULL) {
|
|
|
|
dev->pcirid[resource] = rid;
|
|
|
|
dev->pcir[resource] = res;
|
|
|
|
}
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
return 0;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
unsigned long drm_get_resource_start(struct drm_device *dev,
|
|
|
|
unsigned int resource)
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
{
|
2005-11-28 23:13:57 +00:00
|
|
|
if (drm_alloc_resource(dev, resource) != 0)
|
|
|
|
return 0;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
return rman_get_start(dev->pcir[resource]);
|
|
|
|
}
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
unsigned long drm_get_resource_len(struct drm_device *dev,
|
|
|
|
unsigned int resource)
|
2005-11-28 23:13:57 +00:00
|
|
|
{
|
|
|
|
if (drm_alloc_resource(dev, resource) != 0)
|
|
|
|
return 0;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
return rman_get_size(dev->pcir[resource]);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_addmap(struct drm_device * dev, unsigned long offset,
|
|
|
|
unsigned long size,
|
2008-10-03 16:59:11 +00:00
|
|
|
enum drm_map_type type, enum drm_map_flags flags, drm_local_map_t **map_ptr)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
2003-03-09 02:08:30 +00:00
|
|
|
drm_local_map_t *map;
|
2005-11-28 23:13:57 +00:00
|
|
|
int align;
|
|
|
|
/*drm_agp_mem_t *entry;
|
|
|
|
int valid;*/
|
2002-04-27 20:47:57 +00:00
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
/* Only allow shared memory to be removable since we only keep enough
|
|
|
|
* book keeping information about shared memory to allow for removal
|
|
|
|
* when processes fork.
|
|
|
|
*/
|
2005-11-28 23:13:57 +00:00
|
|
|
if ((flags & _DRM_REMOVABLE) && type != _DRM_SHM) {
|
|
|
|
DRM_ERROR("Requested removable map for non-DRM_SHM\n");
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
return EINVAL;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
if ((offset & PAGE_MASK) || (size & PAGE_MASK)) {
|
|
|
|
DRM_ERROR("offset/size not page aligned: 0x%lx/0x%lx\n",
|
|
|
|
offset, size);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
return EINVAL;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
if (offset + size < offset) {
|
|
|
|
DRM_ERROR("offset and size wrap around: 0x%lx/0x%lx\n",
|
|
|
|
offset, size);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
return EINVAL;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
DRM_DEBUG("offset = 0x%08lx, size = 0x%08lx, type = %d\n", offset,
|
|
|
|
size, type);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
|
|
|
/* Check if this is just another version of a kernel-allocated map, and
|
|
|
|
* just hand that back if so.
|
|
|
|
*/
|
2005-11-28 23:13:57 +00:00
|
|
|
if (type == _DRM_REGISTERS || type == _DRM_FRAME_BUFFER ||
|
|
|
|
type == _DRM_SHM) {
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
TAILQ_FOREACH(map, &dev->maplist, link) {
|
2005-11-28 23:13:57 +00:00
|
|
|
if (map->type == type && (map->offset == offset ||
|
|
|
|
(map->type == _DRM_SHM &&
|
|
|
|
map->flags == _DRM_CONTAINS_LOCK))) {
|
|
|
|
map->size = size;
|
|
|
|
DRM_DEBUG("Found kernel map %d\n", type);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2005-11-28 23:13:57 +00:00
|
|
|
DRM_UNLOCK();
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
|
|
|
/* Allocate a new map structure, fill it in, and do any type-specific
|
|
|
|
* initialization necessary.
|
|
|
|
*/
|
2008-10-13 18:03:27 +00:00
|
|
|
map = malloc(sizeof(*map), DRM_MEM_MAPS, M_ZERO | M_NOWAIT);
|
2008-10-03 16:59:11 +00:00
|
|
|
if (!map) {
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return ENOMEM;
|
|
|
|
}
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
map->offset = offset;
|
|
|
|
map->size = size;
|
|
|
|
map->type = type;
|
|
|
|
map->flags = flags;
|
2010-04-22 18:21:25 +00:00
|
|
|
map->handle = (void *)((unsigned long)alloc_unr(dev->map_unrhdr) <<
|
|
|
|
DRM_MAP_HANDLE_SHIFT);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
switch (map->type) {
|
2002-04-27 20:47:57 +00:00
|
|
|
case _DRM_REGISTERS:
|
2010-04-22 18:21:25 +00:00
|
|
|
map->virtual = drm_ioremap(dev, map);
|
2004-01-06 04:34:53 +00:00
|
|
|
if (!(map->flags & _DRM_WRITE_COMBINING))
|
|
|
|
break;
|
|
|
|
/* FALLTHROUGH */
|
2002-04-27 20:47:57 +00:00
|
|
|
case _DRM_FRAME_BUFFER:
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
if (drm_mtrr_add(map->offset, map->size, DRM_MTRR_WC) == 0)
|
2004-01-06 04:34:53 +00:00
|
|
|
map->mtrr = 1;
|
2002-04-27 20:47:57 +00:00
|
|
|
break;
|
|
|
|
case _DRM_SHM:
|
2010-04-22 18:21:25 +00:00
|
|
|
map->virtual = malloc(map->size, DRM_MEM_MAPS, M_NOWAIT);
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("%lu %d %p\n",
|
2010-04-22 18:21:25 +00:00
|
|
|
map->size, drm_order(map->size), map->virtual);
|
|
|
|
if (!map->virtual) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2010-04-22 18:21:25 +00:00
|
|
|
map->offset = (unsigned long)map->virtual;
|
2008-10-03 16:59:11 +00:00
|
|
|
if (map->flags & _DRM_CONTAINS_LOCK) {
|
2003-11-12 20:56:30 +00:00
|
|
|
/* Prevent a 2nd X Server from creating a 2nd lock */
|
|
|
|
DRM_LOCK();
|
|
|
|
if (dev->lock.hw_lock != NULL) {
|
|
|
|
DRM_UNLOCK();
|
2010-04-22 18:21:25 +00:00
|
|
|
free(map->virtual, DRM_MEM_MAPS);
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
return EBUSY;
|
2003-11-12 20:56:30 +00:00
|
|
|
}
|
2010-04-22 18:21:25 +00:00
|
|
|
dev->lock.hw_lock = map->virtual; /* Pointer to lock */
|
2003-11-12 20:56:30 +00:00
|
|
|
DRM_UNLOCK();
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case _DRM_AGP:
|
2005-11-28 23:13:57 +00:00
|
|
|
/*valid = 0;*/
|
2008-08-23 20:59:12 +00:00
|
|
|
/* In some cases (i810 driver), user space may have already
|
|
|
|
* added the AGP base itself, because dev->agp->base previously
|
|
|
|
* only got set during AGP enable. So, only add the base
|
|
|
|
* address if the map's offset isn't already within the
|
|
|
|
* aperture.
|
|
|
|
*/
|
|
|
|
if (map->offset < dev->agp->base ||
|
|
|
|
map->offset > dev->agp->base +
|
|
|
|
dev->agp->info.ai_aperture_size - 1) {
|
|
|
|
map->offset += dev->agp->base;
|
|
|
|
}
|
2004-01-06 04:34:53 +00:00
|
|
|
map->mtrr = dev->agp->mtrr; /* for getmap */
|
2005-11-28 23:13:57 +00:00
|
|
|
/*for (entry = dev->agp->memory; entry; entry = entry->next) {
|
|
|
|
if ((map->offset >= entry->bound) &&
|
|
|
|
(map->offset + map->size <=
|
|
|
|
entry->bound + entry->pages * PAGE_SIZE)) {
|
|
|
|
valid = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!valid) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return EACCES;
|
2005-11-28 23:13:57 +00:00
|
|
|
}*/
|
2002-04-27 20:47:57 +00:00
|
|
|
break;
|
|
|
|
case _DRM_SCATTER_GATHER:
|
|
|
|
if (!dev->sg) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return EINVAL;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2010-04-22 18:44:23 +00:00
|
|
|
map->virtual = (void *)(dev->sg->vaddr + offset);
|
|
|
|
map->offset = dev->sg->vaddr + offset;
|
2002-04-27 20:47:57 +00:00
|
|
|
break;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
case _DRM_CONSISTENT:
|
2005-11-28 23:13:57 +00:00
|
|
|
/* Unfortunately, we don't get any alignment specification from
|
|
|
|
* the caller, so we have to guess. drm_pci_alloc requires
|
|
|
|
* a power-of-two alignment, so try to align the bus address of
|
|
|
|
* the map to it size if possible, otherwise just assume
|
|
|
|
* PAGE_SIZE alignment.
|
|
|
|
*/
|
|
|
|
align = map->size;
|
|
|
|
if ((align & (align - 1)) != 0)
|
|
|
|
align = PAGE_SIZE;
|
|
|
|
map->dmah = drm_pci_alloc(dev, map->size, align, 0xfffffffful);
|
|
|
|
if (map->dmah == NULL) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return ENOMEM;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
2010-04-22 18:21:25 +00:00
|
|
|
map->virtual = map->dmah->vaddr;
|
2005-11-28 23:13:57 +00:00
|
|
|
map->offset = map->dmah->busaddr;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
break;
|
2002-04-27 20:47:57 +00:00
|
|
|
default:
|
2005-11-28 23:13:57 +00:00
|
|
|
DRM_ERROR("Bad map type %d\n", map->type);
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
2008-08-23 20:59:12 +00:00
|
|
|
DRM_LOCK();
|
|
|
|
return EINVAL;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_LOCK();
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
TAILQ_INSERT_TAIL(&dev->maplist, map, link);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
done:
|
|
|
|
/* Jumped to, with lock held, when a kernel map is found. */
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
DRM_DEBUG("Added map %d 0x%lx/0x%lx\n", map->type, map->offset,
|
|
|
|
map->size);
|
|
|
|
|
|
|
|
*map_ptr = map;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_addmap_ioctl(struct drm_device *dev, void *data,
|
|
|
|
struct drm_file *file_priv)
|
2005-11-28 23:13:57 +00:00
|
|
|
{
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_map *request = data;
|
2005-11-28 23:13:57 +00:00
|
|
|
drm_local_map_t *map;
|
|
|
|
int err;
|
|
|
|
|
|
|
|
if (!(dev->flags & (FREAD|FWRITE)))
|
2008-08-23 20:59:12 +00:00
|
|
|
return EACCES; /* Require read/write */
|
2005-11-28 23:13:57 +00:00
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
if (!DRM_SUSER(DRM_CURPROC) && request->type != _DRM_AGP)
|
|
|
|
return EACCES;
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
DRM_LOCK();
|
2008-08-23 20:59:12 +00:00
|
|
|
err = drm_addmap(dev, request->offset, request->size, request->type,
|
|
|
|
request->flags, &map);
|
2005-11-28 23:13:57 +00:00
|
|
|
DRM_UNLOCK();
|
|
|
|
if (err != 0)
|
|
|
|
return err;
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
request->offset = map->offset;
|
|
|
|
request->size = map->size;
|
|
|
|
request->type = map->type;
|
|
|
|
request->flags = map->flags;
|
|
|
|
request->mtrr = map->mtrr;
|
2010-04-22 18:21:25 +00:00
|
|
|
request->handle = (void *)map->handle;
|
2003-03-09 02:08:30 +00:00
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
void drm_rmmap(struct drm_device *dev, drm_local_map_t *map)
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
{
|
|
|
|
DRM_SPINLOCK_ASSERT(&dev->dev_lock);
|
|
|
|
|
2009-06-20 16:37:24 +00:00
|
|
|
if (map == NULL)
|
|
|
|
return;
|
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
TAILQ_REMOVE(&dev->maplist, map, link);
|
|
|
|
|
|
|
|
switch (map->type) {
|
|
|
|
case _DRM_REGISTERS:
|
|
|
|
if (map->bsr == NULL)
|
|
|
|
drm_ioremapfree(map);
|
|
|
|
/* FALLTHROUGH */
|
|
|
|
case _DRM_FRAME_BUFFER:
|
|
|
|
if (map->mtrr) {
|
|
|
|
int __unused retcode;
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
retcode = drm_mtrr_del(0, map->offset, map->size,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
DRM_MTRR_WC);
|
|
|
|
DRM_DEBUG("mtrr_del = %d\n", retcode);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case _DRM_SHM:
|
2010-04-22 18:21:25 +00:00
|
|
|
free(map->virtual, DRM_MEM_MAPS);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
break;
|
|
|
|
case _DRM_AGP:
|
|
|
|
case _DRM_SCATTER_GATHER:
|
|
|
|
break;
|
|
|
|
case _DRM_CONSISTENT:
|
2005-11-28 23:13:57 +00:00
|
|
|
drm_pci_free(dev, map->dmah);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
break;
|
2008-08-23 20:59:12 +00:00
|
|
|
default:
|
|
|
|
DRM_ERROR("Bad map type %d\n", map->type);
|
|
|
|
break;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (map->bsr != NULL) {
|
|
|
|
bus_release_resource(dev->device, SYS_RES_MEMORY, map->rid,
|
|
|
|
map->bsr);
|
|
|
|
}
|
|
|
|
|
2010-04-22 18:21:25 +00:00
|
|
|
DRM_UNLOCK();
|
|
|
|
if (map->handle)
|
|
|
|
free_unr(dev->map_unrhdr, (unsigned long)map->handle >>
|
|
|
|
DRM_MAP_HANDLE_SHIFT);
|
|
|
|
DRM_LOCK();
|
|
|
|
|
2008-10-13 18:03:27 +00:00
|
|
|
free(map, DRM_MEM_MAPS);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
}
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
/* Remove a map private from list and deallocate resources if the mapping
|
|
|
|
* isn't in use.
|
|
|
|
*/
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_rmmap_ioctl(struct drm_device *dev, void *data,
|
|
|
|
struct drm_file *file_priv)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
2003-03-09 02:08:30 +00:00
|
|
|
drm_local_map_t *map;
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_map *request = data;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_LOCK();
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
TAILQ_FOREACH(map, &dev->maplist, link) {
|
2008-08-23 20:59:12 +00:00
|
|
|
if (map->handle == request->handle &&
|
2003-10-24 01:48:17 +00:00
|
|
|
map->flags & _DRM_REMOVABLE)
|
|
|
|
break;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
/* No match found. */
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
if (map == NULL) {
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_UNLOCK();
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
drm_rmmap(dev, map);
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
|
|
|
|
DRM_UNLOCK();
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
static void drm_cleanup_buf_error(struct drm_device *dev,
|
|
|
|
drm_buf_entry_t *entry)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (entry->seg_count) {
|
|
|
|
for (i = 0; i < entry->seg_count; i++) {
|
2005-11-28 23:13:57 +00:00
|
|
|
drm_pci_free(dev, entry->seglist[i]);
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-10-13 18:03:27 +00:00
|
|
|
free(entry->seglist, DRM_MEM_SEGS);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
entry->seg_count = 0;
|
|
|
|
}
|
|
|
|
|
2003-08-19 02:57:31 +00:00
|
|
|
if (entry->buf_count) {
|
|
|
|
for (i = 0; i < entry->buf_count; i++) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(entry->buflist[i].dev_private, DRM_MEM_BUFS);
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-10-13 18:03:27 +00:00
|
|
|
free(entry->buflist, DRM_MEM_BUFS);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
entry->buf_count = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
static int drm_do_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
|
|
|
drm_buf_entry_t *entry;
|
2005-11-28 23:13:57 +00:00
|
|
|
/*drm_agp_mem_t *agp_entry;
|
|
|
|
int valid*/
|
2002-04-27 20:47:57 +00:00
|
|
|
drm_buf_t *buf;
|
|
|
|
unsigned long offset;
|
|
|
|
unsigned long agp_offset;
|
|
|
|
int count;
|
|
|
|
int order;
|
|
|
|
int size;
|
|
|
|
int alignment;
|
|
|
|
int page_order;
|
|
|
|
int total;
|
|
|
|
int byte_count;
|
|
|
|
int i;
|
|
|
|
drm_buf_t **temp_buflist;
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
count = request->count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
order = drm_order(request->size);
|
2002-04-27 20:47:57 +00:00
|
|
|
size = 1 << order;
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
alignment = (request->flags & _DRM_PAGE_ALIGN)
|
2008-10-03 16:59:11 +00:00
|
|
|
? round_page(size) : size;
|
2002-04-27 20:47:57 +00:00
|
|
|
page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
|
|
|
|
total = PAGE_SIZE << page_order;
|
|
|
|
|
|
|
|
byte_count = 0;
|
2003-04-25 01:18:47 +00:00
|
|
|
agp_offset = dev->agp->base + request->agp_start;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("count: %d\n", count);
|
|
|
|
DRM_DEBUG("order: %d\n", order);
|
|
|
|
DRM_DEBUG("size: %d\n", size);
|
|
|
|
DRM_DEBUG("agp_offset: 0x%lx\n", agp_offset);
|
|
|
|
DRM_DEBUG("alignment: %d\n", alignment);
|
|
|
|
DRM_DEBUG("page_order: %d\n", page_order);
|
|
|
|
DRM_DEBUG("total: %d\n", total);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
/* Make sure buffers are located in AGP memory that we own */
|
|
|
|
/* Breaks MGA due to drm_alloc_agp not setting up entries for the
|
|
|
|
* memory. Safe to ignore for now because these ioctls are still
|
|
|
|
* root-only.
|
|
|
|
*/
|
|
|
|
/*valid = 0;
|
|
|
|
for (agp_entry = dev->agp->memory; agp_entry;
|
|
|
|
agp_entry = agp_entry->next) {
|
|
|
|
if ((agp_offset >= agp_entry->bound) &&
|
|
|
|
(agp_offset + total * count <=
|
|
|
|
agp_entry->bound + agp_entry->pages * PAGE_SIZE)) {
|
|
|
|
valid = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!valid) {
|
|
|
|
DRM_DEBUG("zone invalid\n");
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
2005-11-28 23:13:57 +00:00
|
|
|
}*/
|
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
entry = &dma->bufs[order];
|
|
|
|
|
2008-10-13 18:03:27 +00:00
|
|
|
entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2008-10-03 16:59:11 +00:00
|
|
|
if (!entry->buflist) {
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
entry->buf_size = size;
|
|
|
|
entry->page_order = page_order;
|
|
|
|
|
|
|
|
offset = 0;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
while (entry->buf_count < count) {
|
2002-04-27 20:47:57 +00:00
|
|
|
buf = &entry->buflist[entry->buf_count];
|
|
|
|
buf->idx = dma->buf_count + entry->buf_count;
|
|
|
|
buf->total = alignment;
|
|
|
|
buf->order = order;
|
|
|
|
buf->used = 0;
|
|
|
|
|
|
|
|
buf->offset = (dma->byte_count + offset);
|
|
|
|
buf->bus_address = agp_offset + offset;
|
|
|
|
buf->address = (void *)(agp_offset + offset);
|
|
|
|
buf->next = NULL;
|
|
|
|
buf->pending = 0;
|
2008-08-23 20:59:12 +00:00
|
|
|
buf->file_priv = NULL;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
buf->dev_priv_size = dev->driver->buf_priv_size;
|
2008-10-13 18:03:27 +00:00
|
|
|
buf->dev_private = malloc(buf->dev_priv_size, DRM_MEM_BUFS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (buf->dev_private == NULL) {
|
2002-04-27 20:47:57 +00:00
|
|
|
/* Set count correctly so we free the proper amount. */
|
|
|
|
entry->buf_count = count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
offset += alignment;
|
|
|
|
entry->buf_count++;
|
|
|
|
byte_count += PAGE_SIZE << page_order;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("byte_count: %d\n", byte_count);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
temp_buflist = realloc(dma->buflist,
|
2008-10-13 18:03:27 +00:00
|
|
|
(dma->buf_count + entry->buf_count) * sizeof(*dma->buflist),
|
|
|
|
DRM_MEM_BUFS, M_NOWAIT);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (temp_buflist == NULL) {
|
2002-04-27 20:47:57 +00:00
|
|
|
/* Free the entry because it isn't valid */
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
dma->buflist = temp_buflist;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < entry->buf_count; i++) {
|
2002-04-27 20:47:57 +00:00
|
|
|
dma->buflist[i + dma->buf_count] = &entry->buflist[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
dma->buf_count += entry->buf_count;
|
|
|
|
dma->byte_count += byte_count;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
|
|
|
|
DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
request->count = entry->buf_count;
|
|
|
|
request->size = size;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
dma->flags = _DRM_DMA_USE_AGP;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
static int drm_do_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
|
|
|
int count;
|
|
|
|
int order;
|
|
|
|
int size;
|
|
|
|
int total;
|
|
|
|
int page_order;
|
|
|
|
drm_buf_entry_t *entry;
|
|
|
|
drm_buf_t *buf;
|
|
|
|
int alignment;
|
|
|
|
unsigned long offset;
|
|
|
|
int i;
|
|
|
|
int byte_count;
|
|
|
|
int page_count;
|
|
|
|
unsigned long *temp_pagelist;
|
|
|
|
drm_buf_t **temp_buflist;
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
count = request->count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
order = drm_order(request->size);
|
2002-04-27 20:47:57 +00:00
|
|
|
size = 1 << order;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("count=%d, size=%d (%d), order=%d\n",
|
|
|
|
request->count, request->size, size, order);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
alignment = (request->flags & _DRM_PAGE_ALIGN)
|
2008-10-03 16:59:11 +00:00
|
|
|
? round_page(size) : size;
|
2002-04-27 20:47:57 +00:00
|
|
|
page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
|
|
|
|
total = PAGE_SIZE << page_order;
|
|
|
|
|
|
|
|
entry = &dma->bufs[order];
|
|
|
|
|
2008-10-13 18:03:27 +00:00
|
|
|
entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2008-10-13 18:03:27 +00:00
|
|
|
entry->seglist = malloc(count * sizeof(*entry->seglist), DRM_MEM_SEGS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-08-19 02:57:31 +00:00
|
|
|
/* Keep the original pagelist until we know all the allocations
|
|
|
|
* have succeeded
|
|
|
|
*/
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
temp_pagelist = malloc((dma->page_count + (count << page_order)) *
|
2008-10-13 18:03:27 +00:00
|
|
|
sizeof(*dma->pagelist), DRM_MEM_PAGES, M_NOWAIT);
|
2003-08-19 02:57:31 +00:00
|
|
|
|
|
|
|
if (entry->buflist == NULL || entry->seglist == NULL ||
|
2005-11-28 23:13:57 +00:00
|
|
|
temp_pagelist == NULL) {
|
2008-10-13 18:03:27 +00:00
|
|
|
free(temp_pagelist, DRM_MEM_PAGES);
|
|
|
|
free(entry->seglist, DRM_MEM_SEGS);
|
|
|
|
free(entry->buflist, DRM_MEM_BUFS);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-10-03 16:59:11 +00:00
|
|
|
|
2003-08-19 02:57:31 +00:00
|
|
|
memcpy(temp_pagelist, dma->pagelist, dma->page_count *
|
|
|
|
sizeof(*dma->pagelist));
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("pagelist: %d entries\n",
|
|
|
|
dma->page_count + (count << page_order));
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
entry->buf_size = size;
|
|
|
|
entry->page_order = page_order;
|
|
|
|
byte_count = 0;
|
|
|
|
page_count = 0;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
while (entry->buf_count < count) {
|
2008-09-09 02:05:03 +00:00
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2005-11-28 23:13:57 +00:00
|
|
|
drm_dma_handle_t *dmah = drm_pci_alloc(dev, size, alignment,
|
|
|
|
0xfffffffful);
|
2008-09-09 02:05:03 +00:00
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2005-11-28 23:13:57 +00:00
|
|
|
if (dmah == NULL) {
|
2003-08-19 02:57:31 +00:00
|
|
|
/* Set count correctly so we free the proper amount. */
|
|
|
|
entry->buf_count = count;
|
|
|
|
entry->seg_count = count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-10-13 18:03:27 +00:00
|
|
|
free(temp_pagelist, DRM_MEM_PAGES);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2003-08-19 02:57:31 +00:00
|
|
|
}
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
entry->seglist[entry->seg_count++] = dmah;
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < (1 << page_order); i++) {
|
|
|
|
DRM_DEBUG("page %d @ %p\n",
|
|
|
|
dma->page_count + page_count,
|
|
|
|
(char *)dmah->vaddr + PAGE_SIZE * i);
|
2003-08-19 02:57:31 +00:00
|
|
|
temp_pagelist[dma->page_count + page_count++] =
|
2005-11-28 23:13:57 +00:00
|
|
|
(long)dmah->vaddr + PAGE_SIZE * i;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-10-03 16:59:11 +00:00
|
|
|
for (offset = 0;
|
|
|
|
offset + size <= total && entry->buf_count < count;
|
|
|
|
offset += alignment, ++entry->buf_count) {
|
2002-04-27 20:47:57 +00:00
|
|
|
buf = &entry->buflist[entry->buf_count];
|
|
|
|
buf->idx = dma->buf_count + entry->buf_count;
|
|
|
|
buf->total = alignment;
|
|
|
|
buf->order = order;
|
|
|
|
buf->used = 0;
|
|
|
|
buf->offset = (dma->byte_count + byte_count + offset);
|
2005-11-28 23:13:57 +00:00
|
|
|
buf->address = ((char *)dmah->vaddr + offset);
|
|
|
|
buf->bus_address = dmah->busaddr + offset;
|
2002-04-27 20:47:57 +00:00
|
|
|
buf->next = NULL;
|
|
|
|
buf->pending = 0;
|
2008-08-23 20:59:12 +00:00
|
|
|
buf->file_priv = NULL;
|
2003-08-19 02:57:31 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
buf->dev_priv_size = dev->driver->buf_priv_size;
|
2008-10-13 18:03:27 +00:00
|
|
|
buf->dev_private = malloc(buf->dev_priv_size,
|
|
|
|
DRM_MEM_BUFS, M_NOWAIT | M_ZERO);
|
2003-08-19 02:57:31 +00:00
|
|
|
if (buf->dev_private == NULL) {
|
|
|
|
/* Set count correctly so we free the proper amount. */
|
|
|
|
entry->buf_count = count;
|
|
|
|
entry->seg_count = count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-10-13 18:03:27 +00:00
|
|
|
free(temp_pagelist, DRM_MEM_PAGES);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2003-08-19 02:57:31 +00:00
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("buffer %d @ %p\n",
|
|
|
|
entry->buf_count, buf->address);
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
byte_count += PAGE_SIZE << page_order;
|
|
|
|
}
|
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
temp_buflist = realloc(dma->buflist,
|
2008-10-13 18:03:27 +00:00
|
|
|
(dma->buf_count + entry->buf_count) * sizeof(*dma->buflist),
|
|
|
|
DRM_MEM_BUFS, M_NOWAIT);
|
2003-08-19 02:57:31 +00:00
|
|
|
if (temp_buflist == NULL) {
|
2002-04-27 20:47:57 +00:00
|
|
|
/* Free the entry because it isn't valid */
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-10-13 18:03:27 +00:00
|
|
|
free(temp_pagelist, DRM_MEM_PAGES);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
dma->buflist = temp_buflist;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < entry->buf_count; i++) {
|
2002-04-27 20:47:57 +00:00
|
|
|
dma->buflist[i + dma->buf_count] = &entry->buflist[i];
|
|
|
|
}
|
|
|
|
|
2003-08-19 02:57:31 +00:00
|
|
|
/* No allocations failed, so now we can replace the orginal pagelist
|
|
|
|
* with the new one.
|
|
|
|
*/
|
2008-10-13 18:03:27 +00:00
|
|
|
free(dma->pagelist, DRM_MEM_PAGES);
|
2003-08-19 02:57:31 +00:00
|
|
|
dma->pagelist = temp_pagelist;
|
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
dma->buf_count += entry->buf_count;
|
|
|
|
dma->seg_count += entry->seg_count;
|
|
|
|
dma->page_count += entry->seg_count << page_order;
|
|
|
|
dma->byte_count += PAGE_SIZE * (entry->seg_count << page_order);
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
request->count = entry->buf_count;
|
|
|
|
request->size = size;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
static int drm_do_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
|
|
|
drm_buf_entry_t *entry;
|
|
|
|
drm_buf_t *buf;
|
|
|
|
unsigned long offset;
|
|
|
|
unsigned long agp_offset;
|
|
|
|
int count;
|
|
|
|
int order;
|
|
|
|
int size;
|
|
|
|
int alignment;
|
|
|
|
int page_order;
|
|
|
|
int total;
|
|
|
|
int byte_count;
|
|
|
|
int i;
|
|
|
|
drm_buf_t **temp_buflist;
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
count = request->count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
order = drm_order(request->size);
|
2002-04-27 20:47:57 +00:00
|
|
|
size = 1 << order;
|
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
alignment = (request->flags & _DRM_PAGE_ALIGN)
|
2008-10-03 16:59:11 +00:00
|
|
|
? round_page(size) : size;
|
2002-04-27 20:47:57 +00:00
|
|
|
page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
|
|
|
|
total = PAGE_SIZE << page_order;
|
|
|
|
|
|
|
|
byte_count = 0;
|
2003-04-25 01:18:47 +00:00
|
|
|
agp_offset = request->agp_start;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("count: %d\n", count);
|
|
|
|
DRM_DEBUG("order: %d\n", order);
|
|
|
|
DRM_DEBUG("size: %d\n", size);
|
|
|
|
DRM_DEBUG("agp_offset: %ld\n", agp_offset);
|
|
|
|
DRM_DEBUG("alignment: %d\n", alignment);
|
|
|
|
DRM_DEBUG("page_order: %d\n", page_order);
|
|
|
|
DRM_DEBUG("total: %d\n", total);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
entry = &dma->bufs[order];
|
|
|
|
|
2008-10-13 18:03:27 +00:00
|
|
|
entry->buflist = malloc(count * sizeof(*entry->buflist), DRM_MEM_BUFS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (entry->buflist == NULL)
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
entry->buf_size = size;
|
|
|
|
entry->page_order = page_order;
|
|
|
|
|
|
|
|
offset = 0;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
while (entry->buf_count < count) {
|
2002-04-27 20:47:57 +00:00
|
|
|
buf = &entry->buflist[entry->buf_count];
|
|
|
|
buf->idx = dma->buf_count + entry->buf_count;
|
|
|
|
buf->total = alignment;
|
|
|
|
buf->order = order;
|
|
|
|
buf->used = 0;
|
|
|
|
|
|
|
|
buf->offset = (dma->byte_count + offset);
|
|
|
|
buf->bus_address = agp_offset + offset;
|
2010-04-22 18:44:23 +00:00
|
|
|
buf->address = (void *)(agp_offset + offset + dev->sg->vaddr);
|
2002-04-27 20:47:57 +00:00
|
|
|
buf->next = NULL;
|
|
|
|
buf->pending = 0;
|
2008-08-23 20:59:12 +00:00
|
|
|
buf->file_priv = NULL;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
buf->dev_priv_size = dev->driver->buf_priv_size;
|
2008-10-13 18:03:27 +00:00
|
|
|
buf->dev_private = malloc(buf->dev_priv_size, DRM_MEM_BUFS,
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
M_NOWAIT | M_ZERO);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (buf->dev_private == NULL) {
|
2002-04-27 20:47:57 +00:00
|
|
|
/* Set count correctly so we free the proper amount. */
|
|
|
|
entry->buf_count = count;
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("buffer %d @ %p\n",
|
|
|
|
entry->buf_count, buf->address);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
offset += alignment;
|
|
|
|
entry->buf_count++;
|
|
|
|
byte_count += PAGE_SIZE << page_order;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("byte_count: %d\n", byte_count);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
temp_buflist = realloc(dma->buflist,
|
2008-10-13 18:03:27 +00:00
|
|
|
(dma->buf_count + entry->buf_count) * sizeof(*dma->buflist),
|
|
|
|
DRM_MEM_BUFS, M_NOWAIT);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (temp_buflist == NULL) {
|
2002-04-27 20:47:57 +00:00
|
|
|
/* Free the entry because it isn't valid */
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_cleanup_buf_error(dev, entry);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
dma->buflist = temp_buflist;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < entry->buf_count; i++) {
|
2002-04-27 20:47:57 +00:00
|
|
|
dma->buflist[i + dma->buf_count] = &entry->buflist[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
dma->buf_count += entry->buf_count;
|
|
|
|
dma->byte_count += byte_count;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
|
|
|
|
DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-04-25 01:18:47 +00:00
|
|
|
request->count = entry->buf_count;
|
|
|
|
request->size = size;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
dma->flags = _DRM_DMA_USE_SG;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc *request)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
2005-11-28 23:13:57 +00:00
|
|
|
int order, ret;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
if (request->count < 0 || request->count > 4096)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
order = drm_order(request->size);
|
|
|
|
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
|
|
|
|
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2003-04-25 01:18:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
/* No more allocations after first buffer-using ioctl. */
|
|
|
|
if (dev->buf_use != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return EBUSY;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
/* No more than one allocation per order */
|
|
|
|
if (dev->dma->bufs[order].buf_count != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = drm_do_addbufs_agp(dev, request);
|
|
|
|
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
int drm_addbufs_sg(struct drm_device *dev, struct drm_buf_desc *request)
|
2005-11-28 23:13:57 +00:00
|
|
|
{
|
|
|
|
int order, ret;
|
|
|
|
|
|
|
|
if (!DRM_SUSER(DRM_CURPROC))
|
2008-08-23 20:59:12 +00:00
|
|
|
return EACCES;
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
if (request->count < 0 || request->count > 4096)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
order = drm_order(request->size);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
|
|
|
|
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2003-04-25 01:18:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
/* No more allocations after first buffer-using ioctl. */
|
|
|
|
if (dev->buf_use != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return EBUSY;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
/* No more than one allocation per order */
|
|
|
|
if (dev->dma->bufs[order].buf_count != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2005-11-28 23:13:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = drm_do_addbufs_sg(dev, request);
|
|
|
|
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc *request)
|
2005-11-28 23:13:57 +00:00
|
|
|
{
|
|
|
|
int order, ret;
|
|
|
|
|
|
|
|
if (!DRM_SUSER(DRM_CURPROC))
|
2008-08-23 20:59:12 +00:00
|
|
|
return EACCES;
|
2005-11-28 23:13:57 +00:00
|
|
|
|
|
|
|
if (request->count < 0 || request->count > 4096)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
order = drm_order(request->size);
|
|
|
|
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
|
2008-08-23 20:59:12 +00:00
|
|
|
return EINVAL;
|
|
|
|
|
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2005-11-28 23:13:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
/* No more allocations after first buffer-using ioctl. */
|
|
|
|
if (dev->buf_use != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return EBUSY;
|
2003-04-25 01:18:47 +00:00
|
|
|
}
|
2003-10-24 01:48:17 +00:00
|
|
|
/* No more than one allocation per order */
|
|
|
|
if (dev->dma->bufs[order].buf_count != 0) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
return ENOMEM;
|
2003-10-24 01:48:17 +00:00
|
|
|
}
|
2003-04-25 01:18:47 +00:00
|
|
|
|
2005-11-28 23:13:57 +00:00
|
|
|
ret = drm_do_addbufs_pci(dev, request);
|
|
|
|
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2009-02-27 06:01:42 +00:00
|
|
|
int drm_addbufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
2005-11-28 23:13:57 +00:00
|
|
|
{
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_buf_desc *request = data;
|
2005-11-28 23:13:57 +00:00
|
|
|
int err;
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
if (request->flags & _DRM_AGP_BUFFER)
|
|
|
|
err = drm_addbufs_agp(dev, request);
|
|
|
|
else if (request->flags & _DRM_SG_BUFFER)
|
|
|
|
err = drm_addbufs_sg(dev, request);
|
2002-04-27 20:47:57 +00:00
|
|
|
else
|
2008-08-23 20:59:12 +00:00
|
|
|
err = drm_addbufs_pci(dev, request);
|
2003-04-25 01:18:47 +00:00
|
|
|
|
|
|
|
return err;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_infobufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_buf_info *request = data;
|
2002-04-27 20:47:57 +00:00
|
|
|
int i;
|
|
|
|
int count;
|
2003-10-24 01:48:17 +00:00
|
|
|
int retcode = 0;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2002-04-27 20:47:57 +00:00
|
|
|
++dev->buf_use; /* Can't allocate more after this call */
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
|
|
|
|
if (dma->bufs[i].buf_count)
|
|
|
|
++count;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("count = %d\n", count);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
if (request->count >= count) {
|
|
|
|
for (i = 0, count = 0; i < DRM_MAX_ORDER + 1; i++) {
|
|
|
|
if (dma->bufs[i].buf_count) {
|
|
|
|
struct drm_buf_desc from;
|
2003-04-25 01:18:47 +00:00
|
|
|
|
|
|
|
from.count = dma->bufs[i].buf_count;
|
|
|
|
from.size = dma->bufs[i].buf_size;
|
|
|
|
from.low_mark = dma->bufs[i].freelist.low_mark;
|
|
|
|
from.high_mark = dma->bufs[i].freelist.high_mark;
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_TO_USER(&request->list[count], &from,
|
2008-10-03 16:59:11 +00:00
|
|
|
sizeof(struct drm_buf_desc)) != 0) {
|
2008-08-23 20:59:12 +00:00
|
|
|
retcode = EFAULT;
|
2003-10-24 01:48:17 +00:00
|
|
|
break;
|
|
|
|
}
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("%d %d %d %d %d\n",
|
|
|
|
i, dma->bufs[i].buf_count,
|
|
|
|
dma->bufs[i].buf_size,
|
|
|
|
dma->bufs[i].freelist.low_mark,
|
|
|
|
dma->bufs[i].freelist.high_mark);
|
2002-04-27 20:47:57 +00:00
|
|
|
++count;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-08-23 20:59:12 +00:00
|
|
|
request->count = count;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
return retcode;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_markbufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_buf_desc *request = data;
|
2002-04-27 20:47:57 +00:00
|
|
|
int order;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("%d, %d, %d\n",
|
|
|
|
request->size, request->low_mark, request->high_mark);
|
2003-10-24 01:48:17 +00:00
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
order = drm_order(request->size);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER ||
|
2008-08-23 20:59:12 +00:00
|
|
|
request->low_mark < 0 || request->high_mark < 0) {
|
|
|
|
return EINVAL;
|
2003-10-24 01:48:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2008-08-23 20:59:12 +00:00
|
|
|
if (request->low_mark > dma->bufs[order].buf_count ||
|
|
|
|
request->high_mark > dma->bufs[order].buf_count) {
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
|
|
|
return EINVAL;
|
2003-10-24 01:48:17 +00:00
|
|
|
}
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
dma->bufs[order].freelist.low_mark = request->low_mark;
|
|
|
|
dma->bufs[order].freelist.high_mark = request->high_mark;
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_freebufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_buf_free *request = data;
|
2002-04-27 20:47:57 +00:00
|
|
|
int i;
|
|
|
|
int idx;
|
|
|
|
drm_buf_t *buf;
|
2003-10-24 01:48:17 +00:00
|
|
|
int retcode = 0;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("%d\n", request->count);
|
2003-10-24 01:48:17 +00:00
|
|
|
|
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < request->count; i++) {
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_FROM_USER(&idx, &request->list[i], sizeof(idx))) {
|
|
|
|
retcode = EFAULT;
|
2003-10-24 01:48:17 +00:00
|
|
|
break;
|
|
|
|
}
|
2008-10-03 16:59:11 +00:00
|
|
|
if (idx < 0 || idx >= dma->buf_count) {
|
|
|
|
DRM_ERROR("Index %d (of %d max)\n",
|
|
|
|
idx, dma->buf_count - 1);
|
2008-08-23 20:59:12 +00:00
|
|
|
retcode = EINVAL;
|
2003-10-24 01:48:17 +00:00
|
|
|
break;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
buf = dma->buflist[idx];
|
2008-10-03 16:59:11 +00:00
|
|
|
if (buf->file_priv != file_priv) {
|
2003-04-25 01:18:47 +00:00
|
|
|
DRM_ERROR("Process %d freeing buffer not owned\n",
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_CURRENTPID);
|
2008-08-23 20:59:12 +00:00
|
|
|
retcode = EINVAL;
|
2003-10-24 01:48:17 +00:00
|
|
|
break;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_free_buffer(dev, buf);
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
return retcode;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
int drm_mapbufs(struct drm_device *dev, void *data, struct drm_file *file_priv)
|
2002-04-27 20:47:57 +00:00
|
|
|
{
|
|
|
|
drm_device_dma_t *dma = dev->dma;
|
|
|
|
int retcode = 0;
|
|
|
|
const int zero = 0;
|
2003-10-24 01:48:17 +00:00
|
|
|
vm_offset_t address;
|
|
|
|
struct vmspace *vms;
|
|
|
|
vm_ooffset_t foff;
|
|
|
|
vm_size_t size;
|
|
|
|
vm_offset_t vaddr;
|
2008-10-03 16:59:11 +00:00
|
|
|
struct drm_buf_map *request = data;
|
2002-04-27 20:47:57 +00:00
|
|
|
int i;
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
vms = DRM_CURPROC->td_proc->p_vmspace;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
DRM_SPINLOCK(&dev->dma_lock);
|
|
|
|
dev->buf_use++; /* Can't allocate more after this call */
|
|
|
|
DRM_SPINUNLOCK(&dev->dma_lock);
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
if (request->count < dma->buf_count)
|
2003-10-24 01:48:17 +00:00
|
|
|
goto done;
|
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
if ((drm_core_has_AGP(dev) && (dma->flags & _DRM_DMA_USE_AGP)) ||
|
|
|
|
(drm_core_check_feature(dev, DRIVER_SG) &&
|
|
|
|
(dma->flags & _DRM_DMA_USE_SG))) {
|
Update to DRM CVS as of 2005-04-12, bringing many changes:
- Split core DRM routines back into their own module, rather than using the
nasty templated system like before.
- Development-class R300 support in radeon driver (requires userland pieces, of
course).
- Mach64 driver (haven't tested in a while -- my mach64s no longer fit in the
testbox). Covers Rage Pros, Rage Mobility P/M, Rage XL, and some others.
- i915 driver files, which just need to get drm_drv.c fixed to allow attachment
to the drmsub device. Covers i830 through i915 integrated graphics.
- savage driver files, which should require minimal changes to work. Covers the
Savage3D, Savage IX/MX, Savage 4, ProSavage.
- Support for color and texture tiling and HyperZ features of Radeon.
Thanks to: scottl (much p4 handholding)
Jung-uk Kim (helpful prodding)
PR: [1] kern/76879, [2] kern/72548
Submitted by: [1] Alex, lesha at intercaf dot ru
[2] Shaun Jurrens, shaun at shamz dot net
2005-04-16 03:44:47 +00:00
|
|
|
drm_local_map_t *map = dev->agp_buffer_map;
|
2003-10-24 01:48:17 +00:00
|
|
|
|
|
|
|
if (map == NULL) {
|
|
|
|
retcode = EINVAL;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
size = round_page(map->size);
|
2010-04-22 18:21:25 +00:00
|
|
|
foff = (unsigned long)map->handle;
|
2003-10-24 01:48:17 +00:00
|
|
|
} else {
|
|
|
|
size = round_page(dma->byte_count),
|
|
|
|
foff = 0;
|
|
|
|
}
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2003-10-24 01:48:17 +00:00
|
|
|
vaddr = round_page((vm_offset_t)vms->vm_daddr + MAXDSIZ);
|
Add a new file operations hook for mmap operations. File type-specific
logic is now placed in the mmap hook implementation rather than requiring
it to be placed in sys/vm/vm_mmap.c. This hook allows new file types to
support mmap() as well as potentially allowing mmap() for existing file
types that do not currently support any mapping.
The vm_mmap() function is now split up into two functions. A new
vm_mmap_object() function handles the "back half" of vm_mmap() and accepts
a referenced VM object to map rather than a (handle, handle_type) tuple.
vm_mmap() is now reduced to converting a (handle, handle_type) tuple to a
a VM object and then calling vm_mmap_object() to handle the actual mapping.
The vm_mmap() function remains for use by other parts of the kernel
(e.g. device drivers and exec) but now only supports mapping vnodes,
character devices, and anonymous memory.
The mmap() system call invokes vm_mmap_object() directly with a NULL object
for anonymous mappings. For mappings using a file descriptor, the
descriptors fo_mmap() hook is invoked instead. The fo_mmap() hook is
responsible for performing type-specific checks and adjustments to
arguments as well as possibly modifying mapping parameters such as flags
or the object offset. The fo_mmap() hook routines then call
vm_mmap_object() to handle the actual mapping.
The fo_mmap() hook is optional. If it is not set, then fo_mmap() will
fail with ENODEV. A fo_mmap() hook is implemented for regular files,
character devices, and shared memory objects (created via shm_open()).
While here, consistently use the VM_PROT_* constants for the vm_prot_t
type for the 'prot' variable passed to vm_mmap() and vm_mmap_object()
as well as the vm_mmap_vnode() and vm_mmap_cdev() helper routines.
Previously some places were using the mmap()-specific PROT_* constants
instead. While this happens to work because PROT_xx == VM_PROT_xx,
using VM_PROT_* is more correct.
Differential Revision: https://reviews.freebsd.org/D2658
Reviewed by: alc (glanced over), kib
MFC after: 1 month
Sponsored by: Chelsio
2015-06-04 19:41:15 +00:00
|
|
|
retcode = vm_mmap(&vms->vm_map, &vaddr, size, VM_PROT_READ |
|
|
|
|
VM_PROT_WRITE, VM_PROT_ALL, MAP_SHARED | MAP_NOSYNC, OBJT_DEVICE,
|
2009-03-09 07:49:13 +00:00
|
|
|
dev->devnode, foff);
|
2003-10-24 01:48:17 +00:00
|
|
|
if (retcode)
|
|
|
|
goto done;
|
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
request->virtual = (void *)vaddr;
|
2003-10-24 01:48:17 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
for (i = 0; i < dma->buf_count; i++) {
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_TO_USER(&request->list[i].idx,
|
|
|
|
&dma->buflist[i]->idx, sizeof(request->list[0].idx))) {
|
2003-10-24 01:48:17 +00:00
|
|
|
retcode = EFAULT;
|
|
|
|
goto done;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_TO_USER(&request->list[i].total,
|
|
|
|
&dma->buflist[i]->total, sizeof(request->list[0].total))) {
|
2003-10-24 01:48:17 +00:00
|
|
|
retcode = EFAULT;
|
|
|
|
goto done;
|
|
|
|
}
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_TO_USER(&request->list[i].used, &zero,
|
2003-10-24 01:48:17 +00:00
|
|
|
sizeof(zero))) {
|
|
|
|
retcode = EFAULT;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
address = vaddr + dma->buflist[i]->offset; /* *** */
|
2008-08-23 20:59:12 +00:00
|
|
|
if (DRM_COPY_TO_USER(&request->list[i].address, &address,
|
2003-10-24 01:48:17 +00:00
|
|
|
sizeof(address))) {
|
|
|
|
retcode = EFAULT;
|
2002-04-27 20:47:57 +00:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
2003-10-24 01:48:17 +00:00
|
|
|
|
2002-04-27 20:47:57 +00:00
|
|
|
done:
|
2008-08-23 20:59:12 +00:00
|
|
|
request->count = dma->buf_count;
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-10-03 16:59:11 +00:00
|
|
|
DRM_DEBUG("%d buffers, retcode = %d\n", request->count, retcode);
|
2002-04-27 20:47:57 +00:00
|
|
|
|
2008-08-23 20:59:12 +00:00
|
|
|
return retcode;
|
2002-04-27 20:47:57 +00:00
|
|
|
}
|
2008-10-03 16:59:11 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Compute order. Can be made faster.
|
|
|
|
*/
|
|
|
|
int drm_order(unsigned long size)
|
|
|
|
{
|
|
|
|
int order;
|
|
|
|
|
2008-10-04 14:45:34 +00:00
|
|
|
if (size == 0)
|
|
|
|
return 0;
|
2008-10-03 16:59:11 +00:00
|
|
|
|
2009-03-17 03:32:12 +00:00
|
|
|
order = flsl(size) - 1;
|
2008-10-04 14:45:34 +00:00
|
|
|
if (size & ~(1ul << order))
|
2008-10-03 16:59:11 +00:00
|
|
|
++order;
|
|
|
|
|
|
|
|
return order;
|
|
|
|
}
|