2005-06-28 22:48:56 +10:00
/*
* Copyright 1998 - 2003 VIA Technologies , Inc . All Rights Reserved .
* Copyright 2001 - 2003 S3 Graphics , Inc . 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 , sub license ,
* 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 NON - INFRINGEMENT . IN NO EVENT SHALL
* VIA , S3 GRAPHICS , 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 .
*/
# ifndef _VIA_DRV_H_
# define _VIA_DRV_H_
2019-07-23 22:09:43 +02:00
# include <linux/irqreturn.h>
2019-07-23 22:09:42 +02:00
# include <linux/jiffies.h>
# include <linux/sched.h>
# include <linux/sched/signal.h>
# include <linux/wait.h>
2019-07-23 22:09:43 +02:00
# include <drm/drm_ioctl.h>
2014-09-10 12:43:49 +02:00
# include <drm/drm_legacy.h>
2019-07-23 22:09:42 +02:00
# include <drm/drm_mm.h>
2019-07-23 22:09:43 +02:00
# include <drm/via_drm.h>
2014-09-10 12:43:49 +02:00
2005-11-12 21:52:46 +11:00
# define DRIVER_AUTHOR "Various"
2005-06-28 22:48:56 +10:00
# define DRIVER_NAME "via"
# define DRIVER_DESC "VIA Unichrome / Pro"
2007-05-08 15:47:41 +10:00
# define DRIVER_DATE "20070202"
2005-06-28 22:48:56 +10:00
# define DRIVER_MAJOR 2
2007-01-08 21:21:41 +11:00
# define DRIVER_MINOR 11
2007-05-08 15:47:41 +10:00
# define DRIVER_PATCHLEVEL 1
2005-06-28 22:48:56 +10:00
# include "via_verifier.h"
2005-11-12 21:52:46 +11:00
# include "via_dmablit.h"
2005-06-28 22:48:56 +10:00
# define VIA_PCI_BUF_SIZE 60000
# define VIA_FIRE_BUF_SIZE 1024
2005-11-12 21:52:46 +11:00
# define VIA_NUM_IRQS 4
2005-06-28 22:48:56 +10:00
typedef struct drm_via_ring_buffer {
2005-11-12 21:52:46 +11:00
drm_local_map_t map ;
2005-06-28 22:48:56 +10:00
char * virtual_start ;
} drm_via_ring_buffer_t ;
typedef uint32_t maskarray_t [ 5 ] ;
typedef struct drm_via_irq {
atomic_t irq_received ;
uint32_t pending_mask ;
uint32_t enable_mask ;
wait_queue_head_t irq_queue ;
} drm_via_irq_t ;
2005-09-25 14:28:13 +10:00
2005-06-28 22:48:56 +10:00
typedef struct drm_via_private {
drm_via_sarea_t * sarea_priv ;
2005-11-12 21:52:46 +11:00
drm_local_map_t * sarea ;
drm_local_map_t * fb ;
drm_local_map_t * mmio ;
2005-06-28 22:48:56 +10:00
unsigned long agpAddr ;
wait_queue_head_t decoder_queue [ VIA_NR_XVMC_LOCKS ] ;
char * dma_ptr ;
unsigned int dma_low ;
unsigned int dma_high ;
unsigned int dma_offset ;
uint32_t dma_wrap ;
volatile uint32_t * last_pause_ptr ;
volatile uint32_t * hw_addr_ptr ;
drm_via_ring_buffer_t ring ;
2017-11-04 22:20:08 +01:00
ktime_t last_vblank ;
2005-09-25 14:28:13 +10:00
int last_vblank_valid ;
2017-11-04 22:20:08 +01:00
ktime_t nsec_per_vblank ;
2008-09-30 12:14:26 -07:00
atomic_t vbl_received ;
2005-06-28 22:48:56 +10:00
drm_via_state_t hc_state ;
char pci_buf [ VIA_PCI_BUF_SIZE ] ;
const uint32_t * fire_offsets [ VIA_FIRE_BUF_SIZE ] ;
uint32_t num_fire_offsets ;
2007-01-08 21:19:57 +11:00
int chipset ;
2005-06-28 22:48:56 +10:00
drm_via_irq_t via_irqs [ VIA_NUM_IRQS ] ;
unsigned num_irqs ;
maskarray_t * irq_masks ;
2005-09-25 14:28:13 +10:00
uint32_t irq_enable_mask ;
uint32_t irq_pending_mask ;
2005-11-12 21:52:46 +11:00
int * irq_map ;
2006-08-07 22:03:22 +10:00
unsigned int idle_fault ;
int vram_initialized ;
2011-10-26 22:21:13 +02:00
struct drm_mm vram_mm ;
2006-08-07 22:03:22 +10:00
int agp_initialized ;
2011-10-26 22:21:13 +02:00
struct drm_mm agp_mm ;
2011-10-25 17:55:31 +02:00
/** Mapping of userspace keys to mm objects */
struct idr object_idr ;
2006-08-07 22:03:22 +10:00
unsigned long vram_offset ;
unsigned long agp_offset ;
2005-11-12 21:52:46 +11:00
drm_via_blitq_t blit_queues [ VIA_NUM_BLIT_ENGINES ] ;
2007-05-08 15:47:41 +10:00
uint32_t dma_diff ;
2005-06-28 22:48:56 +10:00
} drm_via_private_t ;
2015-10-15 07:55:48 +02:00
struct via_file_private {
struct list_head obj_list ;
} ;
2005-11-12 21:52:46 +11:00
enum via_family {
2007-01-08 21:19:57 +11:00
VIA_OTHER = 0 , /* Baseline */
VIA_PRO_GROUP_A , /* Another video engine and DMA commands */
VIA_DX9_0 /* Same video as pro_group_a, but 3D is unsupported */
2005-11-12 21:52:46 +11:00
} ;
2005-06-28 22:48:56 +10:00
/* VIA MMIO register access */
2019-07-23 22:09:41 +02:00
static inline u32 via_read ( struct drm_via_private * dev_priv , u32 reg )
{
return readl ( ( void __iomem * ) ( dev_priv - > mmio - > handle + reg ) ) ;
}
static inline void via_write ( struct drm_via_private * dev_priv , u32 reg ,
u32 val )
{
writel ( val , ( void __iomem * ) ( dev_priv - > mmio - > handle + reg ) ) ;
}
static inline void via_write8 ( struct drm_via_private * dev_priv , u32 reg ,
u32 val )
{
writeb ( val , ( void __iomem * ) ( dev_priv - > mmio - > handle + reg ) ) ;
}
static inline void via_write8_mask ( struct drm_via_private * dev_priv ,
u32 reg , u32 mask , u32 val )
{
u32 tmp ;
tmp = readb ( ( void __iomem * ) ( dev_priv - > mmio - > handle + reg ) ) ;
tmp = ( tmp & ~ mask ) | ( val & mask ) ;
writeb ( tmp , ( void __iomem * ) ( dev_priv - > mmio - > handle + reg ) ) ;
}
2005-06-28 22:48:56 +10:00
2019-07-23 22:09:42 +02:00
/*
* Poll in a loop waiting for ' contidition ' to be true .
* Note : A direct replacement with wait_event_interruptible_timeout ( )
* will not work unless driver is updated to emit wake_up ( )
* in relevant places that can impact the ' condition '
*
* Returns :
* ret keeps current value if ' condition ' becomes true
* ret = - BUSY if timeout happens
* ret = - EINTR if a signal interrupted the waiting period
*/
# define VIA_WAIT_ON( ret, queue, timeout, condition ) \
do { \
DECLARE_WAITQUEUE ( entry , current ) ; \
unsigned long end = jiffies + ( timeout ) ; \
add_wait_queue ( & ( queue ) , & entry ) ; \
\
for ( ; ; ) { \
__set_current_state ( TASK_INTERRUPTIBLE ) ; \
if ( condition ) \
break ; \
if ( time_after_eq ( jiffies , end ) ) { \
ret = - EBUSY ; \
break ; \
} \
schedule_timeout ( ( HZ / 100 > 1 ) ? HZ / 100 : 1 ) ; \
if ( signal_pending ( current ) ) { \
ret = - EINTR ; \
break ; \
} \
} \
__set_current_state ( TASK_RUNNING ) ; \
remove_wait_queue ( & ( queue ) , & entry ) ; \
} while ( 0 )
2013-08-02 13:27:49 -04:00
extern const struct drm_ioctl_desc via_ioctls [ ] ;
2005-11-12 21:52:46 +11:00
extern int via_max_ioctl ;
2007-09-03 12:06:45 +10:00
extern int via_fb_init ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_mem_alloc ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_mem_free ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_agp_init ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_map_init ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_decoder_futex ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_wait_irq ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
2010-07-11 15:32:42 +02:00
extern int via_dma_blit_sync ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
extern int via_dma_blit ( struct drm_device * dev , void * data , struct drm_file * file_priv ) ;
2005-11-12 21:52:46 +11:00
2007-07-11 15:53:27 +10:00
extern int via_driver_load ( struct drm_device * dev , unsigned long chipset ) ;
2017-01-06 15:57:31 -02:00
extern void via_driver_unload ( struct drm_device * dev ) ;
2005-11-12 21:52:46 +11:00
2010-07-11 15:32:42 +02:00
extern int via_init_context ( struct drm_device * dev , int context ) ;
extern int via_final_context ( struct drm_device * dev , int context ) ;
2005-06-28 22:48:56 +10:00
2010-07-11 15:32:42 +02:00
extern int via_do_cleanup_map ( struct drm_device * dev ) ;
2015-09-24 18:35:31 +02:00
extern u32 via_get_vblank_counter ( struct drm_device * dev , unsigned int pipe ) ;
extern int via_enable_vblank ( struct drm_device * dev , unsigned int pipe ) ;
extern void via_disable_vblank ( struct drm_device * dev , unsigned int pipe ) ;
2005-06-28 22:48:56 +10:00
2013-12-11 11:34:42 +01:00
extern irqreturn_t via_driver_irq_handler ( int irq , void * arg ) ;
2010-07-11 15:32:42 +02:00
extern void via_driver_irq_preinstall ( struct drm_device * dev ) ;
2008-09-30 12:14:26 -07:00
extern int via_driver_irq_postinstall ( struct drm_device * dev ) ;
2010-07-11 15:32:42 +02:00
extern void via_driver_irq_uninstall ( struct drm_device * dev ) ;
2005-06-28 22:48:56 +10:00
2010-07-11 15:32:42 +02:00
extern int via_dma_cleanup ( struct drm_device * dev ) ;
2005-06-28 22:48:56 +10:00
extern void via_init_command_verifier ( void ) ;
2010-07-11 15:32:42 +02:00
extern int via_driver_dma_quiescent ( struct drm_device * dev ) ;
2008-09-30 12:14:26 -07:00
extern void via_init_futex ( drm_via_private_t * dev_priv ) ;
extern void via_cleanup_futex ( drm_via_private_t * dev_priv ) ;
extern void via_release_futex ( drm_via_private_t * dev_priv , int context ) ;
2005-06-28 22:48:56 +10:00
2008-09-30 12:14:26 -07:00
extern void via_reclaim_buffers_locked ( struct drm_device * dev ,
struct drm_file * file_priv ) ;
2007-07-11 15:53:27 +10:00
extern void via_lastclose ( struct drm_device * dev ) ;
2006-08-07 22:03:22 +10:00
2007-07-11 15:53:27 +10:00
extern void via_dmablit_handler ( struct drm_device * dev , int engine , int from_irq ) ;
extern void via_init_dmablit ( struct drm_device * dev ) ;
2005-09-30 18:37:36 +10:00
2005-06-28 22:48:56 +10:00
# endif