提交 d40c8533 编写于 作者: D Dave Airlie

drm: realign via driver with drm git tree

This just realigns some code/whitespace between the kernel and main tree
Signed-off-by: NDave Airlie <airlied@linux.ie>
上级 1f4eccfd
...@@ -41,9 +41,9 @@ ...@@ -41,9 +41,9 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#define VIA_PGDN(x) (((unsigned long)(x)) & PAGE_MASK) #define VIA_PGDN(x) (((unsigned long)(x)) & PAGE_MASK)
#define VIA_PGOFF(x) (((unsigned long)(x)) & ~PAGE_MASK) #define VIA_PGOFF(x) (((unsigned long)(x)) & ~PAGE_MASK)
#define VIA_PFN(x) ((unsigned long)(x) >> PAGE_SHIFT) #define VIA_PFN(x) ((unsigned long)(x) >> PAGE_SHIFT)
typedef struct _drm_via_descriptor { typedef struct _drm_via_descriptor {
uint32_t mem_addr; uint32_t mem_addr;
...@@ -121,19 +121,19 @@ via_map_blit_for_device(struct pci_dev *pdev, ...@@ -121,19 +121,19 @@ via_map_blit_for_device(struct pci_dev *pdev,
while (line_len > 0) { while (line_len > 0) {
remaining_len = min(PAGE_SIZE-VIA_PGOFF(cur_mem), line_len); remaining_len = min(PAGE_SIZE-VIA_PGOFF(cur_mem), line_len);
line_len -= remaining_len; line_len -= remaining_len;
if (mode == 1) { if (mode == 1) {
desc_ptr->mem_addr = desc_ptr->mem_addr =
dma_map_page(&pdev->dev, dma_map_page(&pdev->dev,
vsg->pages[VIA_PFN(cur_mem) - vsg->pages[VIA_PFN(cur_mem) -
VIA_PFN(first_addr)], VIA_PFN(first_addr)],
VIA_PGOFF(cur_mem), remaining_len, VIA_PGOFF(cur_mem), remaining_len,
vsg->direction); vsg->direction);
desc_ptr->dev_addr = cur_fb; desc_ptr->dev_addr = cur_fb;
desc_ptr->size = remaining_len; desc_ptr->size = remaining_len;
desc_ptr->next = (uint32_t) next; desc_ptr->next = (uint32_t) next;
next = dma_map_single(&pdev->dev, desc_ptr, sizeof(*desc_ptr), next = dma_map_single(&pdev->dev, desc_ptr, sizeof(*desc_ptr),
DMA_TO_DEVICE); DMA_TO_DEVICE);
...@@ -162,7 +162,7 @@ via_map_blit_for_device(struct pci_dev *pdev, ...@@ -162,7 +162,7 @@ via_map_blit_for_device(struct pci_dev *pdev,
/* /*
* Function that frees up all resources for a blit. It is usable even if the * Function that frees up all resources for a blit. It is usable even if the
* blit info has only be partially built as long as the status enum is consistent * blit info has only been partially built as long as the status enum is consistent
* with the actual status of the used resources. * with the actual status of the used resources.
*/ */
...@@ -238,8 +238,11 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer) ...@@ -238,8 +238,11 @@ via_lock_all_dma_pages(drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer)
return DRM_ERR(ENOMEM); return DRM_ERR(ENOMEM);
memset(vsg->pages, 0, sizeof(struct page *) * vsg->num_pages); memset(vsg->pages, 0, sizeof(struct page *) * vsg->num_pages);
down_read(&current->mm->mmap_sem); down_read(&current->mm->mmap_sem);
ret = get_user_pages(current, current->mm, (unsigned long) xfer->mem_addr, ret = get_user_pages(current, current->mm,
vsg->num_pages, vsg->direction, 0, vsg->pages, NULL); (unsigned long)xfer->mem_addr,
vsg->num_pages,
(vsg->direction == DMA_FROM_DEVICE),
0, vsg->pages, NULL);
up_read(&current->mm->mmap_sem); up_read(&current->mm->mmap_sem);
if (ret != vsg->num_pages) { if (ret != vsg->num_pages) {
...@@ -475,9 +478,15 @@ via_dmablit_timer(unsigned long data) ...@@ -475,9 +478,15 @@ via_dmablit_timer(unsigned long data)
if (!timer_pending(&blitq->poll_timer)) { if (!timer_pending(&blitq->poll_timer)) {
blitq->poll_timer.expires = jiffies+1; blitq->poll_timer.expires = jiffies+1;
add_timer(&blitq->poll_timer); add_timer(&blitq->poll_timer);
}
via_dmablit_handler(dev, engine, 0);
/*
* Rerun handler to delete timer if engines are off, and
* to shorten abort latency. This is a little nasty.
*/
via_dmablit_handler(dev, engine, 0);
}
} }
...@@ -597,15 +606,27 @@ via_build_sg_info(drm_device_t *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t * ...@@ -597,15 +606,27 @@ via_build_sg_info(drm_device_t *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t *
* (Not a big limitation anyway.) * (Not a big limitation anyway.)
*/ */
if (((xfer->mem_stride - xfer->line_length) >= PAGE_SIZE) || if ((xfer->mem_stride - xfer->line_length) >= PAGE_SIZE) {
(xfer->mem_stride > 2048*4)) {
DRM_ERROR("Too large system memory stride. Stride: %d, " DRM_ERROR("Too large system memory stride. Stride: %d, "
"Length: %d\n", xfer->mem_stride, xfer->line_length); "Length: %d\n", xfer->mem_stride, xfer->line_length);
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
if (xfer->num_lines > 2048) { if ((xfer->mem_stride == xfer->line_length) &&
DRM_ERROR("Too many PCI DMA bitblt lines.\n"); (xfer->fb_stride == xfer->line_length)) {
xfer->mem_stride *= xfer->num_lines;
xfer->line_length = xfer->mem_stride;
xfer->fb_stride = xfer->mem_stride;
xfer->num_lines = 1;
}
/*
* Don't lock an arbitrary large number of pages, since that causes a
* DOS security hole.
*/
if (xfer->num_lines > 2048 || (xfer->num_lines*xfer->mem_stride > (2048*2048*4))) {
DRM_ERROR("Too large PCI DMA bitblt.\n");
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
...@@ -628,16 +649,17 @@ via_build_sg_info(drm_device_t *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t * ...@@ -628,16 +649,17 @@ via_build_sg_info(drm_device_t *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t *
#ifdef VIA_BUGFREE #ifdef VIA_BUGFREE
if ((((unsigned long)xfer->mem_addr & 3) != ((unsigned long)xfer->fb_addr & 3)) || if ((((unsigned long)xfer->mem_addr & 3) != ((unsigned long)xfer->fb_addr & 3)) ||
((xfer->mem_stride & 3) != (xfer->fb_stride & 3))) { ((xfer->num_lines > 1) && ((xfer->mem_stride & 3) != (xfer->fb_stride & 3)))) {
DRM_ERROR("Invalid DRM bitblt alignment.\n"); DRM_ERROR("Invalid DRM bitblt alignment.\n");
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
#else #else
if ((((unsigned long)xfer->mem_addr & 15) || if ((((unsigned long)xfer->mem_addr & 15) ||
((unsigned long)xfer->fb_addr & 3)) || (xfer->mem_stride & 15) || ((unsigned long)xfer->fb_addr & 3)) ||
(xfer->fb_stride & 3)) { ((xfer->num_lines > 1) &&
((xfer->mem_stride & 15) || (xfer->fb_stride & 3)))) {
DRM_ERROR("Invalid DRM bitblt alignment.\n"); DRM_ERROR("Invalid DRM bitblt alignment.\n");
return DRM_ERR(EINVAL); return DRM_ERR(EINVAL);
} }
#endif #endif
...@@ -715,7 +737,7 @@ via_dmablit(drm_device_t *dev, drm_via_dmablit_t *xfer) ...@@ -715,7 +737,7 @@ via_dmablit(drm_device_t *dev, drm_via_dmablit_t *xfer)
drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private; drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
drm_via_sg_info_t *vsg; drm_via_sg_info_t *vsg;
drm_via_blitq_t *blitq; drm_via_blitq_t *blitq;
int ret; int ret;
int engine; int engine;
unsigned long irqsave; unsigned long irqsave;
...@@ -756,7 +778,7 @@ via_dmablit(drm_device_t *dev, drm_via_dmablit_t *xfer) ...@@ -756,7 +778,7 @@ via_dmablit(drm_device_t *dev, drm_via_dmablit_t *xfer)
/* /*
* Sync on a previously submitted blit. Note that the X server use signals extensively, and * Sync on a previously submitted blit. Note that the X server use signals extensively, and
* that there is a very big proability that this IOCTL will be interrupted by a signal. In that * that there is a very big probability that this IOCTL will be interrupted by a signal. In that
* case it returns with -EAGAIN for the signal to be delivered. * case it returns with -EAGAIN for the signal to be delivered.
* The caller should then reissue the IOCTL. This is similar to what is being done for drmGetLock(). * The caller should then reissue the IOCTL. This is similar to what is being done for drmGetLock().
*/ */
......
...@@ -250,6 +250,12 @@ typedef struct drm_via_blitsync { ...@@ -250,6 +250,12 @@ typedef struct drm_via_blitsync {
unsigned engine; unsigned engine;
} drm_via_blitsync_t; } drm_via_blitsync_t;
/* - * Below,"flags" is currently unused but will be used for possible future
* extensions like kernel space bounce buffers for bad alignments and
* blit engine busy-wait polling for better latency in the absence of
* interrupts.
*/
typedef struct drm_via_dmablit { typedef struct drm_via_dmablit {
uint32_t num_lines; uint32_t num_lines;
uint32_t line_length; uint32_t line_length;
...@@ -260,7 +266,7 @@ typedef struct drm_via_dmablit { ...@@ -260,7 +266,7 @@ typedef struct drm_via_dmablit {
unsigned char *mem_addr; unsigned char *mem_addr;
uint32_t mem_stride; uint32_t mem_stride;
int bounce_buffer; uint32_t flags;
int to_fb; int to_fb;
drm_via_blitsync_t sync; drm_via_blitsync_t sync;
......
...@@ -52,7 +52,7 @@ int via_agp_init(DRM_IOCTL_ARGS) ...@@ -52,7 +52,7 @@ int via_agp_init(DRM_IOCTL_ARGS)
return ret; return ret;
} }
dev_priv->agp_initialized = TRUE; dev_priv->agp_initialized = 1;
dev_priv->agp_offset = agp.offset; dev_priv->agp_offset = agp.offset;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
...@@ -79,7 +79,7 @@ int via_fb_init(DRM_IOCTL_ARGS) ...@@ -79,7 +79,7 @@ int via_fb_init(DRM_IOCTL_ARGS)
return ret; return ret;
} }
dev_priv->vram_initialized = TRUE; dev_priv->vram_initialized = 1;
dev_priv->vram_offset = fb.offset; dev_priv->vram_offset = fb.offset;
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册