1*4882a593Smuzhiyun /* via_dmablit.h -- PCI DMA BitBlt support for the VIA Unichrome/Pro 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright 2005 Thomas Hellstrom. 4*4882a593Smuzhiyun * All Rights Reserved. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 7*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 8*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 9*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sub license, 10*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 11*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 12*4882a593Smuzhiyun * 13*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the 14*4882a593Smuzhiyun * next paragraph) shall be included in all copies or substantial portions 15*4882a593Smuzhiyun * of the Software. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 20*4882a593Smuzhiyun * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 21*4882a593Smuzhiyun * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 22*4882a593Smuzhiyun * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 23*4882a593Smuzhiyun * USE OR OTHER DEALINGS IN THE SOFTWARE. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * Authors: 26*4882a593Smuzhiyun * Thomas Hellstrom. 27*4882a593Smuzhiyun * Register info from Digeo Inc. 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #ifndef _VIA_DMABLIT_H 31*4882a593Smuzhiyun #define _VIA_DMABLIT_H 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #include <linux/dma-mapping.h> 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define VIA_NUM_BLIT_ENGINES 2 36*4882a593Smuzhiyun #define VIA_NUM_BLIT_SLOTS 8 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct _drm_via_descriptor; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun typedef struct _drm_via_sg_info { 41*4882a593Smuzhiyun struct page **pages; 42*4882a593Smuzhiyun unsigned long num_pages; 43*4882a593Smuzhiyun struct _drm_via_descriptor **desc_pages; 44*4882a593Smuzhiyun int num_desc_pages; 45*4882a593Smuzhiyun int num_desc; 46*4882a593Smuzhiyun enum dma_data_direction direction; 47*4882a593Smuzhiyun unsigned char *bounce_buffer; 48*4882a593Smuzhiyun dma_addr_t chain_start; 49*4882a593Smuzhiyun uint32_t free_on_sequence; 50*4882a593Smuzhiyun unsigned int descriptors_per_page; 51*4882a593Smuzhiyun int aborted; 52*4882a593Smuzhiyun enum { 53*4882a593Smuzhiyun dr_via_device_mapped, 54*4882a593Smuzhiyun dr_via_desc_pages_alloc, 55*4882a593Smuzhiyun dr_via_pages_locked, 56*4882a593Smuzhiyun dr_via_pages_alloc, 57*4882a593Smuzhiyun dr_via_sg_init 58*4882a593Smuzhiyun } state; 59*4882a593Smuzhiyun } drm_via_sg_info_t; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun typedef struct _drm_via_blitq { 62*4882a593Smuzhiyun struct drm_device *dev; 63*4882a593Smuzhiyun uint32_t cur_blit_handle; 64*4882a593Smuzhiyun uint32_t done_blit_handle; 65*4882a593Smuzhiyun unsigned serviced; 66*4882a593Smuzhiyun unsigned head; 67*4882a593Smuzhiyun unsigned cur; 68*4882a593Smuzhiyun unsigned num_free; 69*4882a593Smuzhiyun unsigned num_outstanding; 70*4882a593Smuzhiyun unsigned long end; 71*4882a593Smuzhiyun int aborting; 72*4882a593Smuzhiyun int is_active; 73*4882a593Smuzhiyun drm_via_sg_info_t *blits[VIA_NUM_BLIT_SLOTS]; 74*4882a593Smuzhiyun spinlock_t blit_lock; 75*4882a593Smuzhiyun wait_queue_head_t blit_queue[VIA_NUM_BLIT_SLOTS]; 76*4882a593Smuzhiyun wait_queue_head_t busy_queue; 77*4882a593Smuzhiyun struct work_struct wq; 78*4882a593Smuzhiyun struct timer_list poll_timer; 79*4882a593Smuzhiyun } drm_via_blitq_t; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* 83*4882a593Smuzhiyun * PCI DMA Registers 84*4882a593Smuzhiyun * Channels 2 & 3 don't seem to be implemented in hardware. 85*4882a593Smuzhiyun */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define VIA_PCI_DMA_MAR0 0xE40 /* Memory Address Register of Channel 0 */ 88*4882a593Smuzhiyun #define VIA_PCI_DMA_DAR0 0xE44 /* Device Address Register of Channel 0 */ 89*4882a593Smuzhiyun #define VIA_PCI_DMA_BCR0 0xE48 /* Byte Count Register of Channel 0 */ 90*4882a593Smuzhiyun #define VIA_PCI_DMA_DPR0 0xE4C /* Descriptor Pointer Register of Channel 0 */ 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define VIA_PCI_DMA_MAR1 0xE50 /* Memory Address Register of Channel 1 */ 93*4882a593Smuzhiyun #define VIA_PCI_DMA_DAR1 0xE54 /* Device Address Register of Channel 1 */ 94*4882a593Smuzhiyun #define VIA_PCI_DMA_BCR1 0xE58 /* Byte Count Register of Channel 1 */ 95*4882a593Smuzhiyun #define VIA_PCI_DMA_DPR1 0xE5C /* Descriptor Pointer Register of Channel 1 */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define VIA_PCI_DMA_MAR2 0xE60 /* Memory Address Register of Channel 2 */ 98*4882a593Smuzhiyun #define VIA_PCI_DMA_DAR2 0xE64 /* Device Address Register of Channel 2 */ 99*4882a593Smuzhiyun #define VIA_PCI_DMA_BCR2 0xE68 /* Byte Count Register of Channel 2 */ 100*4882a593Smuzhiyun #define VIA_PCI_DMA_DPR2 0xE6C /* Descriptor Pointer Register of Channel 2 */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define VIA_PCI_DMA_MAR3 0xE70 /* Memory Address Register of Channel 3 */ 103*4882a593Smuzhiyun #define VIA_PCI_DMA_DAR3 0xE74 /* Device Address Register of Channel 3 */ 104*4882a593Smuzhiyun #define VIA_PCI_DMA_BCR3 0xE78 /* Byte Count Register of Channel 3 */ 105*4882a593Smuzhiyun #define VIA_PCI_DMA_DPR3 0xE7C /* Descriptor Pointer Register of Channel 3 */ 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun #define VIA_PCI_DMA_MR0 0xE80 /* Mode Register of Channel 0 */ 108*4882a593Smuzhiyun #define VIA_PCI_DMA_MR1 0xE84 /* Mode Register of Channel 1 */ 109*4882a593Smuzhiyun #define VIA_PCI_DMA_MR2 0xE88 /* Mode Register of Channel 2 */ 110*4882a593Smuzhiyun #define VIA_PCI_DMA_MR3 0xE8C /* Mode Register of Channel 3 */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun #define VIA_PCI_DMA_CSR0 0xE90 /* Command/Status Register of Channel 0 */ 113*4882a593Smuzhiyun #define VIA_PCI_DMA_CSR1 0xE94 /* Command/Status Register of Channel 1 */ 114*4882a593Smuzhiyun #define VIA_PCI_DMA_CSR2 0xE98 /* Command/Status Register of Channel 2 */ 115*4882a593Smuzhiyun #define VIA_PCI_DMA_CSR3 0xE9C /* Command/Status Register of Channel 3 */ 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #define VIA_PCI_DMA_PTR 0xEA0 /* Priority Type Register */ 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* Define for DMA engine */ 120*4882a593Smuzhiyun /* DPR */ 121*4882a593Smuzhiyun #define VIA_DMA_DPR_EC (1<<1) /* end of chain */ 122*4882a593Smuzhiyun #define VIA_DMA_DPR_DDIE (1<<2) /* descriptor done interrupt enable */ 123*4882a593Smuzhiyun #define VIA_DMA_DPR_DT (1<<3) /* direction of transfer (RO) */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* MR */ 126*4882a593Smuzhiyun #define VIA_DMA_MR_CM (1<<0) /* chaining mode */ 127*4882a593Smuzhiyun #define VIA_DMA_MR_TDIE (1<<1) /* transfer done interrupt enable */ 128*4882a593Smuzhiyun #define VIA_DMA_MR_HENDMACMD (1<<7) /* ? */ 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* CSR */ 131*4882a593Smuzhiyun #define VIA_DMA_CSR_DE (1<<0) /* DMA enable */ 132*4882a593Smuzhiyun #define VIA_DMA_CSR_TS (1<<1) /* transfer start */ 133*4882a593Smuzhiyun #define VIA_DMA_CSR_TA (1<<2) /* transfer abort */ 134*4882a593Smuzhiyun #define VIA_DMA_CSR_TD (1<<3) /* transfer done */ 135*4882a593Smuzhiyun #define VIA_DMA_CSR_DD (1<<4) /* descriptor done */ 136*4882a593Smuzhiyun #define VIA_DMA_DPR_EC (1<<1) /* end of chain */ 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #endif 141