2009-12-11 19:24:15 +10:00
/*
* Copyright 2005 Stephane Marchesin .
* 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 .
*/
# ifndef __NOUVEAU_DRV_H__
# define __NOUVEAU_DRV_H__
# define DRIVER_AUTHOR "Stephane Marchesin"
# define DRIVER_EMAIL "dri-devel@lists.sourceforge.net"
# define DRIVER_NAME "nouveau"
# define DRIVER_DESC "nVidia Riva / TNT / GeForce"
# define DRIVER_DATE "20090420"
# define DRIVER_MAJOR 0
# define DRIVER_MINOR 0
2010-02-12 10:27:35 +10:00
# define DRIVER_PATCHLEVEL 16
2009-12-11 19:24:15 +10:00
# define NOUVEAU_FAMILY 0x0000FFFF
# define NOUVEAU_FLAGS 0xFFFF0000
# include "ttm/ttm_bo_api.h"
# include "ttm/ttm_bo_driver.h"
# include "ttm/ttm_placement.h"
# include "ttm/ttm_memory.h"
# include "ttm/ttm_module.h"
struct nouveau_fpriv {
struct ttm_object_file * tfile ;
} ;
# define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
# include "nouveau_drm.h"
# include "nouveau_reg.h"
# include "nouveau_bios.h"
drm/nv40: implement ctxprog/state generation
The context programs are *very* simple compared to the ones used by
the binary driver. There's notes in nv40_grctx.c explaining most of
the things we don't implement. If we discover if/why any of it is
required further down the track, we'll handle it then.
The PGRAPH state generated for each chipset should match what NVIDIA
do almost exactly (there's a couple of exceptions). If someone has
a lot of time on their hands, they could figure out the mapping of
object/method to PGRAPH register and demagic the initial state a little,
it's not terribly important however.
At time of commit, confirmed to be working at least well enough for
accelerated X (and where tested, for 3D apps) on NV40, NV43, NV44, NV46,
NV49, NV4A, NV4B and NV4E.
A module option has been added to force the use of external firmware
blobs if it becomes required.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2009-12-15 22:02:47 +10:00
struct nouveau_grctx ;
2009-12-11 19:24:15 +10:00
# define MAX_NUM_DCB_ENTRIES 16
# define NOUVEAU_MAX_CHANNEL_NR 128
2009-12-11 16:51:09 +01:00
# define NOUVEAU_MAX_TILE_NR 15
2009-12-11 19:24:15 +10:00
# define NV50_VM_MAX_VRAM (2*1024*1024*1024ULL)
# define NV50_VM_BLOCK (512*1024*1024ULL)
# define NV50_VM_VRAM_NR (NV50_VM_MAX_VRAM / NV50_VM_BLOCK)
2009-12-11 16:51:09 +01:00
struct nouveau_tile_reg {
struct nouveau_fence * fence ;
uint32_t addr ;
uint32_t size ;
bool used ;
} ;
2009-12-11 19:24:15 +10:00
struct nouveau_bo {
struct ttm_buffer_object bo ;
struct ttm_placement placement ;
u32 placements [ 3 ] ;
2010-03-18 13:07:47 +01:00
u32 busy_placements [ 3 ] ;
2009-12-11 19:24:15 +10:00
struct ttm_bo_kmap_obj kmap ;
struct list_head head ;
/* protected by ttm_bo_reserve() */
struct drm_file * reserved_by ;
struct list_head entry ;
int pbbo_index ;
2010-02-12 10:27:35 +10:00
bool validate_mapped ;
2009-12-11 19:24:15 +10:00
struct nouveau_channel * channel ;
bool mappable ;
bool no_vm ;
uint32_t tile_mode ;
uint32_t tile_flags ;
2009-12-11 16:51:09 +01:00
struct nouveau_tile_reg * tile ;
2009-12-11 19:24:15 +10:00
struct drm_gem_object * gem ;
int pin_refcnt ;
} ;
2010-10-10 06:01:08 +02:00
# define nouveau_bo_tile_layout(nvbo) \
( ( nvbo ) - > tile_flags & NOUVEAU_GEM_TILE_LAYOUT_MASK )
2009-12-11 19:24:15 +10:00
static inline struct nouveau_bo *
nouveau_bo ( struct ttm_buffer_object * bo )
{
return container_of ( bo , struct nouveau_bo , bo ) ;
}
static inline struct nouveau_bo *
nouveau_gem_object ( struct drm_gem_object * gem )
{
return gem ? gem - > driver_private : NULL ;
}
/* TODO: submit equivalent to TTM generic API upstream? */
static inline void __iomem *
nvbo_kmap_obj_iovirtual ( struct nouveau_bo * nvbo )
{
bool is_iomem ;
void __iomem * ioptr = ( void __force __iomem * ) ttm_kmap_obj_virtual (
& nvbo - > kmap , & is_iomem ) ;
WARN_ON_ONCE ( ioptr & & ! is_iomem ) ;
return ioptr ;
}
enum nouveau_flags {
NV_NFORCE = 0x10000000 ,
NV_NFORCE2 = 0x20000000
} ;
# define NVOBJ_ENGINE_SW 0
# define NVOBJ_ENGINE_GR 1
2010-10-19 20:06:01 +10:00
# define NVOBJ_ENGINE_PPP 2
# define NVOBJ_ENGINE_COPY 3
# define NVOBJ_ENGINE_VP 4
# define NVOBJ_ENGINE_CRYPT 5
# define NVOBJ_ENGINE_BSP 6
2010-10-19 19:47:06 +10:00
# define NVOBJ_ENGINE_DISPLAY 0xcafe0001
2009-12-11 19:24:15 +10:00
# define NVOBJ_ENGINE_INT 0xdeadbeef
# define NVOBJ_FLAG_ZERO_ALLOC (1 << 1)
# define NVOBJ_FLAG_ZERO_FREE (1 << 2)
struct nouveau_gpuobj {
2010-09-01 15:24:29 +10:00
struct drm_device * dev ;
2010-09-01 15:24:37 +10:00
struct kref refcount ;
2009-12-11 19:24:15 +10:00
struct list_head list ;
2010-06-01 15:32:24 +10:00
struct drm_mm_node * im_pramin ;
2009-12-11 19:24:15 +10:00
struct nouveau_bo * im_backing ;
uint32_t * im_backing_suspend ;
int im_bound ;
uint32_t flags ;
2010-09-01 15:24:32 +10:00
u32 size ;
2010-09-01 15:24:30 +10:00
u32 pinst ;
u32 cinst ;
u64 vinst ;
2009-12-11 19:24:15 +10:00
uint32_t engine ;
uint32_t class ;
void ( * dtor ) ( struct drm_device * , struct nouveau_gpuobj * ) ;
void * priv ;
} ;
struct nouveau_channel {
struct drm_device * dev ;
int id ;
2010-10-18 03:55:48 +02:00
/* references to the channel data structure */
struct kref ref ;
/* users of the hardware channel resources, the hardware
* context will be kicked off when it reaches zero . */
atomic_t users ;
2010-10-05 16:53:48 +10:00
struct mutex mutex ;
2009-12-11 19:24:15 +10:00
/* owner of this fifo */
struct drm_file * file_priv ;
/* mapping of the fifo itself */
struct drm_local_map * map ;
/* mapping of the regs controling the fifo */
void __iomem * user ;
uint32_t user_get ;
uint32_t user_put ;
/* Fencing */
struct {
/* lock protects the pending list only */
spinlock_t lock ;
struct list_head pending ;
uint32_t sequence ;
uint32_t sequence_ack ;
2010-05-31 12:00:43 +10:00
atomic_t last_sequence_irq ;
2009-12-11 19:24:15 +10:00
} fence ;
/* DMA push buffer */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * pushbuf ;
struct nouveau_bo * pushbuf_bo ;
uint32_t pushbuf_base ;
2009-12-11 19:24:15 +10:00
/* Notifier memory */
struct nouveau_bo * notifier_bo ;
2010-06-01 15:32:24 +10:00
struct drm_mm notifier_heap ;
2009-12-11 19:24:15 +10:00
/* PFIFO context */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * ramfc ;
struct nouveau_gpuobj * cache ;
2009-12-11 19:24:15 +10:00
/* PGRAPH context */
/* XXX may be merge 2 pointers as private data ??? */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * ramin_grctx ;
2010-10-19 20:06:01 +10:00
struct nouveau_gpuobj * crypt_ctx ;
2009-12-11 19:24:15 +10:00
void * pgraph_ctx ;
/* NV50 VM */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * vm_pd ;
struct nouveau_gpuobj * vm_gart_pt ;
struct nouveau_gpuobj * vm_vram_pt [ NV50_VM_VRAM_NR ] ;
2009-12-11 19:24:15 +10:00
/* Objects */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * ramin ; /* Private instmem */
struct drm_mm ramin_heap ; /* Private PRAMIN heap */
struct nouveau_ramht * ramht ; /* Hash table */
2009-12-11 19:24:15 +10:00
/* GPU object info for stuff used in-kernel (mm_enabled) */
uint32_t m2mf_ntfy ;
uint32_t vram_handle ;
uint32_t gart_handle ;
bool accel_done ;
/* Push buffer state (only for drm's channel on !mm_enabled) */
struct {
int max ;
int free ;
int cur ;
int put ;
/* access via pushbuf_bo */
2010-02-11 16:37:26 +10:00
int ib_base ;
int ib_max ;
int ib_free ;
int ib_put ;
2009-12-11 19:24:15 +10:00
} dma ;
uint32_t sw_subchannel [ 8 ] ;
struct {
struct nouveau_gpuobj * vblsem ;
uint32_t vblsem_offset ;
uint32_t vblsem_rval ;
struct list_head vbl_wait ;
} nvsw ;
struct {
bool active ;
char name [ 32 ] ;
struct drm_info_list info ;
} debugfs ;
} ;
struct nouveau_instmem_engine {
void * priv ;
int ( * init ) ( struct drm_device * dev ) ;
void ( * takedown ) ( struct drm_device * dev ) ;
int ( * suspend ) ( struct drm_device * dev ) ;
void ( * resume ) ( struct drm_device * dev ) ;
int ( * populate ) ( struct drm_device * , struct nouveau_gpuobj * ,
2010-10-15 09:15:26 +10:00
u32 * size , u32 align ) ;
2009-12-11 19:24:15 +10:00
void ( * clear ) ( struct drm_device * , struct nouveau_gpuobj * ) ;
int ( * bind ) ( struct drm_device * , struct nouveau_gpuobj * ) ;
int ( * unbind ) ( struct drm_device * , struct nouveau_gpuobj * ) ;
2010-07-08 11:29:10 +10:00
void ( * flush ) ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
} ;
struct nouveau_mc_engine {
int ( * init ) ( struct drm_device * dev ) ;
void ( * takedown ) ( struct drm_device * dev ) ;
} ;
struct nouveau_timer_engine {
int ( * init ) ( struct drm_device * dev ) ;
void ( * takedown ) ( struct drm_device * dev ) ;
uint64_t ( * read ) ( struct drm_device * dev ) ;
} ;
struct nouveau_fb_engine {
2009-12-16 12:12:27 +01:00
int num_tiles ;
2009-12-11 19:24:15 +10:00
int ( * init ) ( struct drm_device * dev ) ;
void ( * takedown ) ( struct drm_device * dev ) ;
2009-12-16 12:12:27 +01:00
void ( * set_region_tiling ) ( struct drm_device * dev , int i , uint32_t addr ,
uint32_t size , uint32_t pitch ) ;
2009-12-11 19:24:15 +10:00
} ;
struct nouveau_fifo_engine {
int channels ;
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * playlist [ 2 ] ;
2010-07-08 15:28:48 +10:00
int cur_playlist ;
2009-12-11 19:24:15 +10:00
int ( * init ) ( struct drm_device * ) ;
void ( * takedown ) ( struct drm_device * ) ;
void ( * disable ) ( struct drm_device * ) ;
void ( * enable ) ( struct drm_device * ) ;
bool ( * reassign ) ( struct drm_device * , bool enable ) ;
2009-12-13 20:07:42 +01:00
bool ( * cache_pull ) ( struct drm_device * dev , bool enable ) ;
2009-12-11 19:24:15 +10:00
int ( * channel_id ) ( struct drm_device * ) ;
int ( * create_context ) ( struct nouveau_channel * ) ;
void ( * destroy_context ) ( struct nouveau_channel * ) ;
int ( * load_context ) ( struct nouveau_channel * ) ;
int ( * unload_context ) ( struct drm_device * ) ;
2010-10-22 10:26:24 +10:00
void ( * tlb_flush ) ( struct drm_device * dev ) ;
2009-12-11 19:24:15 +10:00
} ;
struct nouveau_pgraph_engine {
bool accel_blocked ;
2010-10-20 10:39:35 +10:00
bool registered ;
drm/nv40: implement ctxprog/state generation
The context programs are *very* simple compared to the ones used by
the binary driver. There's notes in nv40_grctx.c explaining most of
the things we don't implement. If we discover if/why any of it is
required further down the track, we'll handle it then.
The PGRAPH state generated for each chipset should match what NVIDIA
do almost exactly (there's a couple of exceptions). If someone has
a lot of time on their hands, they could figure out the mapping of
object/method to PGRAPH register and demagic the initial state a little,
it's not terribly important however.
At time of commit, confirmed to be working at least well enough for
accelerated X (and where tested, for 3D apps) on NV40, NV43, NV44, NV46,
NV49, NV4A, NV4B and NV4E.
A module option has been added to force the use of external firmware
blobs if it becomes required.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2009-12-15 22:02:47 +10:00
int grctx_size ;
2009-12-11 19:24:15 +10:00
2010-07-08 15:40:18 +10:00
/* NV2x/NV3x context table (0x400780) */
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * ctx_table ;
2010-07-08 15:40:18 +10:00
2009-12-11 19:24:15 +10:00
int ( * init ) ( struct drm_device * ) ;
void ( * takedown ) ( struct drm_device * ) ;
void ( * fifo_access ) ( struct drm_device * , bool ) ;
struct nouveau_channel * ( * channel ) ( struct drm_device * ) ;
int ( * create_context ) ( struct nouveau_channel * ) ;
void ( * destroy_context ) ( struct nouveau_channel * ) ;
int ( * load_context ) ( struct nouveau_channel * ) ;
int ( * unload_context ) ( struct drm_device * ) ;
2010-10-22 10:26:24 +10:00
void ( * tlb_flush ) ( struct drm_device * dev ) ;
2009-12-16 12:12:27 +01:00
void ( * set_region_tiling ) ( struct drm_device * dev , int i , uint32_t addr ,
uint32_t size , uint32_t pitch ) ;
2009-12-11 19:24:15 +10:00
} ;
2010-07-24 17:37:33 +02:00
struct nouveau_display_engine {
int ( * early_init ) ( struct drm_device * ) ;
void ( * late_takedown ) ( struct drm_device * ) ;
int ( * create ) ( struct drm_device * ) ;
int ( * init ) ( struct drm_device * ) ;
void ( * destroy ) ( struct drm_device * ) ;
} ;
2010-07-26 09:28:25 +10:00
struct nouveau_gpio_engine {
int ( * init ) ( struct drm_device * ) ;
void ( * takedown ) ( struct drm_device * ) ;
int ( * get ) ( struct drm_device * , enum dcb_gpio_tag ) ;
int ( * set ) ( struct drm_device * , enum dcb_gpio_tag , int state ) ;
void ( * irq_enable ) ( struct drm_device * , enum dcb_gpio_tag , bool on ) ;
} ;
2010-09-16 15:39:49 +10:00
struct nouveau_pm_voltage_level {
u8 voltage ;
u8 vid ;
} ;
struct nouveau_pm_voltage {
bool supported ;
u8 vid_mask ;
struct nouveau_pm_voltage_level * level ;
int nr_level ;
} ;
# define NOUVEAU_PM_MAX_LEVEL 8
struct nouveau_pm_level {
struct device_attribute dev_attr ;
char name [ 32 ] ;
int id ;
u32 core ;
u32 memory ;
u32 shader ;
u32 unk05 ;
u8 voltage ;
u8 fanspeed ;
2010-09-27 10:13:23 +10:00
u16 memscript ;
2010-09-16 15:39:49 +10:00
} ;
2010-09-22 20:54:22 +02:00
struct nouveau_pm_temp_sensor_constants {
u16 offset_constant ;
s16 offset_mult ;
u16 offset_div ;
u16 slope_mult ;
u16 slope_div ;
} ;
struct nouveau_pm_threshold_temp {
s16 critical ;
s16 down_clock ;
s16 fan_boost ;
} ;
2010-09-17 23:17:24 +02:00
struct nouveau_pm_memtiming {
u32 reg_100220 ;
u32 reg_100224 ;
u32 reg_100228 ;
u32 reg_10022c ;
u32 reg_100230 ;
u32 reg_100234 ;
u32 reg_100238 ;
u32 reg_10023c ;
} ;
struct nouveau_pm_memtimings {
bool supported ;
struct nouveau_pm_memtiming * timing ;
int nr_timing ;
} ;
2010-09-16 15:39:49 +10:00
struct nouveau_pm_engine {
struct nouveau_pm_voltage voltage ;
struct nouveau_pm_level perflvl [ NOUVEAU_PM_MAX_LEVEL ] ;
int nr_perflvl ;
2010-09-17 23:17:24 +02:00
struct nouveau_pm_memtimings memtimings ;
2010-09-22 20:54:22 +02:00
struct nouveau_pm_temp_sensor_constants sensor_constants ;
struct nouveau_pm_threshold_temp threshold_temp ;
2010-09-16 15:39:49 +10:00
struct nouveau_pm_level boot ;
struct nouveau_pm_level * cur ;
2010-09-23 20:58:38 +02:00
struct device * hwmon ;
2010-10-12 12:31:32 +10:00
struct notifier_block acpi_nb ;
2010-09-23 20:58:38 +02:00
2010-09-16 15:39:49 +10:00
int ( * clock_get ) ( struct drm_device * , u32 id ) ;
2010-09-27 09:47:56 +10:00
void * ( * clock_pre ) ( struct drm_device * , struct nouveau_pm_level * ,
u32 id , int khz ) ;
2010-09-16 15:39:49 +10:00
void ( * clock_set ) ( struct drm_device * , void * ) ;
int ( * voltage_get ) ( struct drm_device * ) ;
int ( * voltage_set ) ( struct drm_device * , int voltage ) ;
int ( * fanspeed_get ) ( struct drm_device * ) ;
int ( * fanspeed_set ) ( struct drm_device * , int fanspeed ) ;
2010-09-23 20:58:38 +02:00
int ( * temp_get ) ( struct drm_device * ) ;
2010-09-16 15:39:49 +10:00
} ;
2010-10-19 20:06:01 +10:00
struct nouveau_crypt_engine {
bool registered ;
int ( * init ) ( struct drm_device * ) ;
void ( * takedown ) ( struct drm_device * ) ;
int ( * create_context ) ( struct nouveau_channel * ) ;
void ( * destroy_context ) ( struct nouveau_channel * ) ;
void ( * tlb_flush ) ( struct drm_device * dev ) ;
} ;
2009-12-11 19:24:15 +10:00
struct nouveau_engine {
struct nouveau_instmem_engine instmem ;
struct nouveau_mc_engine mc ;
struct nouveau_timer_engine timer ;
struct nouveau_fb_engine fb ;
struct nouveau_pgraph_engine graph ;
struct nouveau_fifo_engine fifo ;
2010-07-24 17:37:33 +02:00
struct nouveau_display_engine display ;
2010-07-26 09:28:25 +10:00
struct nouveau_gpio_engine gpio ;
2010-09-16 15:39:49 +10:00
struct nouveau_pm_engine pm ;
2010-10-19 20:06:01 +10:00
struct nouveau_crypt_engine crypt ;
2009-12-11 19:24:15 +10:00
} ;
struct nouveau_pll_vals {
union {
struct {
# ifdef __BIG_ENDIAN
uint8_t N1 , M1 , N2 , M2 ;
# else
uint8_t M1 , N1 , M2 , N2 ;
# endif
} ;
struct {
uint16_t NM1 , NM2 ;
} __attribute__ ( ( packed ) ) ;
} ;
int log2P ;
int refclk ;
} ;
enum nv04_fp_display_regs {
FP_DISPLAY_END ,
FP_TOTAL ,
FP_CRTC ,
FP_SYNC_START ,
FP_SYNC_END ,
FP_VALID_START ,
FP_VALID_END
} ;
struct nv04_crtc_reg {
2010-10-11 03:43:58 +02:00
unsigned char MiscOutReg ;
2010-07-20 16:48:08 +02:00
uint8_t CRTC [ 0xa0 ] ;
2009-12-11 19:24:15 +10:00
uint8_t CR58 [ 0x10 ] ;
uint8_t Sequencer [ 5 ] ;
uint8_t Graphics [ 9 ] ;
uint8_t Attribute [ 21 ] ;
2010-10-11 03:43:58 +02:00
unsigned char DAC [ 768 ] ;
2009-12-11 19:24:15 +10:00
/* PCRTC regs */
uint32_t fb_start ;
uint32_t crtc_cfg ;
uint32_t cursor_cfg ;
uint32_t gpio_ext ;
uint32_t crtc_830 ;
uint32_t crtc_834 ;
uint32_t crtc_850 ;
uint32_t crtc_eng_ctrl ;
/* PRAMDAC regs */
uint32_t nv10_cursync ;
struct nouveau_pll_vals pllvals ;
uint32_t ramdac_gen_ctrl ;
uint32_t ramdac_630 ;
uint32_t ramdac_634 ;
uint32_t tv_setup ;
uint32_t tv_vtotal ;
uint32_t tv_vskew ;
uint32_t tv_vsync_delay ;
uint32_t tv_htotal ;
uint32_t tv_hskew ;
uint32_t tv_hsync_delay ;
uint32_t tv_hsync_delay2 ;
uint32_t fp_horiz_regs [ 7 ] ;
uint32_t fp_vert_regs [ 7 ] ;
uint32_t dither ;
uint32_t fp_control ;
uint32_t dither_regs [ 6 ] ;
uint32_t fp_debug_0 ;
uint32_t fp_debug_1 ;
uint32_t fp_debug_2 ;
uint32_t fp_margin_color ;
uint32_t ramdac_8c0 ;
uint32_t ramdac_a20 ;
uint32_t ramdac_a24 ;
uint32_t ramdac_a34 ;
uint32_t ctv_regs [ 38 ] ;
} ;
struct nv04_output_reg {
uint32_t output ;
int head ;
} ;
struct nv04_mode_state {
2010-10-11 03:43:58 +02:00
struct nv04_crtc_reg crtc_reg [ 2 ] ;
2009-12-11 19:24:15 +10:00
uint32_t pllsel ;
uint32_t sel_clk ;
} ;
enum nouveau_card_type {
NV_04 = 0x00 ,
NV_10 = 0x10 ,
NV_20 = 0x20 ,
NV_30 = 0x30 ,
NV_40 = 0x40 ,
NV_50 = 0x50 ,
2010-08-03 10:00:56 +10:00
NV_C0 = 0xc0 ,
2009-12-11 19:24:15 +10:00
} ;
struct drm_nouveau_private {
struct drm_device * dev ;
/* the card type, takes NV_* as values */
enum nouveau_card_type card_type ;
/* exact chipset, derived from NV_PMC_BOOT_0 */
int chipset ;
int flags ;
void __iomem * mmio ;
2010-09-01 15:24:33 +10:00
2010-09-01 15:24:38 +10:00
spinlock_t ramin_lock ;
2009-12-11 19:24:15 +10:00
void __iomem * ramin ;
2010-09-01 15:24:33 +10:00
u32 ramin_size ;
u32 ramin_base ;
bool ramin_available ;
2010-09-01 15:24:38 +10:00
struct drm_mm ramin_heap ;
struct list_head gpuobj_list ;
2010-10-20 10:39:35 +10:00
struct list_head classes ;
2009-12-11 19:24:15 +10:00
2010-01-15 09:24:20 +10:00
struct nouveau_bo * vga_ram ;
2009-12-11 19:24:15 +10:00
struct workqueue_struct * wq ;
struct work_struct irq_work ;
2010-03-30 15:14:41 +10:00
struct work_struct hpd_work ;
2009-12-11 19:24:15 +10:00
2010-11-16 18:40:52 -05:00
struct {
spinlock_t lock ;
uint32_t hpd0_bits ;
uint32_t hpd1_bits ;
} hpd_state ;
2009-12-11 19:24:15 +10:00
struct list_head vbl_waiting ;
struct {
2010-03-09 10:56:52 +10:00
struct drm_global_reference mem_global_ref ;
2009-12-11 19:24:15 +10:00
struct ttm_bo_global_ref bo_global_ref ;
struct ttm_bo_device bdev ;
atomic_t validate_sequence ;
} ttm ;
2010-09-22 00:58:54 +02:00
struct {
spinlock_t lock ;
struct drm_mm heap ;
struct nouveau_bo * bo ;
} fence ;
2010-10-06 16:16:59 +10:00
struct {
spinlock_t lock ;
struct nouveau_channel * ptr [ NOUVEAU_MAX_CHANNEL_NR ] ;
} channels ;
2009-12-11 19:24:15 +10:00
struct nouveau_engine engine ;
struct nouveau_channel * channel ;
2010-02-01 20:58:27 +01:00
/* For PFIFO and PGRAPH. */
spinlock_t context_switch_lock ;
2009-12-11 19:24:15 +10:00
/* RAMIN configuration, RAMFC, RAMHT and RAMRO offsets */
2010-09-01 15:24:35 +10:00
struct nouveau_ramht * ramht ;
struct nouveau_gpuobj * ramfc ;
struct nouveau_gpuobj * ramro ;
2009-12-11 19:24:15 +10:00
uint32_t ramin_rsvd_vram ;
struct {
enum {
NOUVEAU_GART_NONE = 0 ,
NOUVEAU_GART_AGP ,
NOUVEAU_GART_SGDMA
} type ;
uint64_t aper_base ;
uint64_t aper_size ;
uint64_t aper_free ;
struct nouveau_gpuobj * sg_ctxdma ;
struct page * sg_dummy_page ;
dma_addr_t sg_dummy_bus ;
} gart_info ;
2009-12-11 16:51:09 +01:00
/* nv10-nv40 tiling regions */
2010-09-07 18:24:52 +02:00
struct nouveau_tile_reg tile [ NOUVEAU_MAX_TILE_NR ] ;
2009-12-11 16:51:09 +01:00
2010-03-18 09:45:20 +10:00
/* VRAM/fb configuration */
uint64_t vram_size ;
uint64_t vram_sys_base ;
2010-08-12 12:37:28 +10:00
u32 vram_rblock_size ;
2010-03-18 09:45:20 +10:00
uint64_t fb_phys ;
uint64_t fb_available_size ;
uint64_t fb_mappable_pages ;
uint64_t fb_aper_free ;
int fb_mtrr ;
2009-12-11 19:24:15 +10:00
/* G8x/G9x virtual address space */
uint64_t vm_gart_base ;
uint64_t vm_gart_size ;
uint64_t vm_vram_base ;
uint64_t vm_vram_size ;
uint64_t vm_end ;
struct nouveau_gpuobj * vm_vram_pt [ NV50_VM_VRAM_NR ] ;
int vm_vram_pt_nr ;
2010-02-24 10:03:05 +10:00
struct nvbios vbios ;
2009-12-11 19:24:15 +10:00
struct nv04_mode_state mode_reg ;
struct nv04_mode_state saved_reg ;
uint32_t saved_vga_font [ 4 ] [ 16384 ] ;
uint32_t crtc_owner ;
uint32_t dac_users [ 4 ] ;
struct nouveau_suspend_resume {
uint32_t * ramin_copy ;
} susres ;
struct backlight_device * backlight ;
struct nouveau_channel * evo ;
2010-10-19 14:18:06 +10:00
u32 evo_alloc ;
2010-07-06 08:54:34 +10:00
struct {
struct dcb_entry * dcb ;
u16 script ;
u32 pclk ;
} evo_irq ;
2009-12-11 19:24:15 +10:00
struct {
struct dentry * channel_root ;
} debugfs ;
2010-03-30 05:34:13 +00:00
2010-03-30 05:34:14 +00:00
struct nouveau_fbdev * nfbdev ;
2010-05-16 17:29:56 +02:00
struct apertures_struct * apertures ;
2009-12-11 19:24:15 +10:00
} ;
2010-09-21 18:57:11 +02:00
static inline struct drm_nouveau_private *
nouveau_private ( struct drm_device * dev )
{
return dev - > dev_private ;
}
2009-12-11 19:24:15 +10:00
static inline struct drm_nouveau_private *
nouveau_bdev ( struct ttm_bo_device * bd )
{
return container_of ( bd , struct drm_nouveau_private , ttm . bdev ) ;
}
static inline int
nouveau_bo_ref ( struct nouveau_bo * ref , struct nouveau_bo * * pnvbo )
{
struct nouveau_bo * prev ;
if ( ! pnvbo )
return - EINVAL ;
prev = * pnvbo ;
* pnvbo = ref ? nouveau_bo ( ttm_bo_reference ( & ref - > bo ) ) : NULL ;
if ( prev ) {
struct ttm_buffer_object * bo = & prev - > bo ;
ttm_bo_unref ( & bo ) ;
}
return 0 ;
}
/* nouveau_drv.c */
2010-09-08 02:28:23 +02:00
extern int nouveau_agpmode ;
2009-12-11 19:24:15 +10:00
extern int nouveau_duallink ;
extern int nouveau_uscript_lvds ;
extern int nouveau_uscript_tmds ;
extern int nouveau_vram_pushbuf ;
extern int nouveau_vram_notify ;
extern int nouveau_fbpercrtc ;
2010-03-15 09:43:51 +10:00
extern int nouveau_tv_disable ;
2009-12-11 19:24:15 +10:00
extern char * nouveau_tv_norm ;
extern int nouveau_reg_debug ;
extern char * nouveau_vbios ;
2010-01-18 11:42:37 +10:00
extern int nouveau_ignorelid ;
2010-01-26 14:00:42 +00:00
extern int nouveau_nofbaccel ;
extern int nouveau_noaccel ;
2010-09-29 11:15:01 +00:00
extern int nouveau_force_post ;
2010-03-04 12:00:39 +10:00
extern int nouveau_override_conntype ;
2010-09-16 16:47:14 +10:00
extern char * nouveau_perflvl ;
extern int nouveau_perflvl_wr ;
2009-12-11 19:24:15 +10:00
2010-02-01 15:38:10 +10:00
extern int nouveau_pci_suspend ( struct pci_dev * pdev , pm_message_t pm_state ) ;
extern int nouveau_pci_resume ( struct pci_dev * pdev ) ;
2009-12-11 19:24:15 +10:00
/* nouveau_state.c */
extern void nouveau_preclose ( struct drm_device * dev , struct drm_file * ) ;
extern int nouveau_load ( struct drm_device * , unsigned long flags ) ;
extern int nouveau_firstopen ( struct drm_device * ) ;
extern void nouveau_lastclose ( struct drm_device * ) ;
extern int nouveau_unload ( struct drm_device * ) ;
extern int nouveau_ioctl_getparam ( struct drm_device * , void * data ,
struct drm_file * ) ;
extern int nouveau_ioctl_setparam ( struct drm_device * , void * data ,
struct drm_file * ) ;
extern bool nouveau_wait_until ( struct drm_device * , uint64_t timeout ,
uint32_t reg , uint32_t mask , uint32_t val ) ;
extern bool nouveau_wait_for_idle ( struct drm_device * ) ;
extern int nouveau_card_init ( struct drm_device * ) ;
/* nouveau_mem.c */
2010-09-01 15:24:34 +10:00
extern int nouveau_mem_vram_init ( struct drm_device * ) ;
extern void nouveau_mem_vram_fini ( struct drm_device * ) ;
extern int nouveau_mem_gart_init ( struct drm_device * ) ;
extern void nouveau_mem_gart_fini ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
extern int nouveau_mem_init_agp ( struct drm_device * ) ;
2010-07-23 20:29:13 +02:00
extern int nouveau_mem_reset_agp ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
extern void nouveau_mem_close ( struct drm_device * ) ;
2009-12-11 16:51:09 +01:00
extern struct nouveau_tile_reg * nv10_mem_set_tiling ( struct drm_device * dev ,
uint32_t addr ,
uint32_t size ,
uint32_t pitch ) ;
extern void nv10_mem_expire_tiling ( struct drm_device * dev ,
struct nouveau_tile_reg * tile ,
struct nouveau_fence * fence ) ;
2009-12-11 19:24:15 +10:00
extern int nv50_mem_vm_bind_linear ( struct drm_device * , uint64_t virt ,
uint32_t size , uint32_t flags ,
uint64_t phys ) ;
extern void nv50_mem_vm_unbind ( struct drm_device * , uint64_t virt ,
uint32_t size ) ;
/* nouveau_notifier.c */
extern int nouveau_notifier_init_channel ( struct nouveau_channel * ) ;
extern void nouveau_notifier_takedown_channel ( struct nouveau_channel * ) ;
extern int nouveau_notifier_alloc ( struct nouveau_channel * , uint32_t handle ,
int cout , uint32_t * offset ) ;
extern int nouveau_notifier_offset ( struct nouveau_gpuobj * , uint32_t * ) ;
extern int nouveau_ioctl_notifier_alloc ( struct drm_device * , void * data ,
struct drm_file * ) ;
extern int nouveau_ioctl_notifier_free ( struct drm_device * , void * data ,
struct drm_file * ) ;
/* nouveau_channel.c */
extern struct drm_ioctl_desc nouveau_ioctls [ ] ;
extern int nouveau_max_ioctl ;
extern void nouveau_channel_cleanup ( struct drm_device * , struct drm_file * ) ;
extern int nouveau_channel_alloc ( struct drm_device * dev ,
struct nouveau_channel * * chan ,
struct drm_file * file_priv ,
uint32_t fb_ctxdma , uint32_t tt_ctxdma ) ;
2010-10-06 16:16:59 +10:00
extern struct nouveau_channel *
2010-10-18 02:58:04 +02:00
nouveau_channel_get_unlocked ( struct nouveau_channel * ) ;
extern struct nouveau_channel *
2010-10-06 16:16:59 +10:00
nouveau_channel_get ( struct drm_device * , struct drm_file * , int id ) ;
2010-10-18 02:58:04 +02:00
extern void nouveau_channel_put_unlocked ( struct nouveau_channel * * ) ;
2010-10-06 16:16:59 +10:00
extern void nouveau_channel_put ( struct nouveau_channel * * ) ;
2010-10-18 03:55:48 +02:00
extern void nouveau_channel_ref ( struct nouveau_channel * chan ,
struct nouveau_channel * * pchan ) ;
2009-12-11 19:24:15 +10:00
/* nouveau_object.c */
2010-10-20 10:39:35 +10:00
# define NVOBJ_CLASS(d,c,e) do { \
int ret = nouveau_gpuobj_class_new ( ( d ) , ( c ) , NVOBJ_ENGINE_ # # e ) ; \
if ( ret ) \
return ret ; \
} while ( 0 )
# define NVOBJ_MTHD(d,c,m,e) do { \
int ret = nouveau_gpuobj_mthd_new ( ( d ) , ( c ) , ( m ) , ( e ) ) ; \
if ( ret ) \
return ret ; \
} while ( 0 )
2009-12-11 19:24:15 +10:00
extern int nouveau_gpuobj_early_init ( struct drm_device * ) ;
extern int nouveau_gpuobj_init ( struct drm_device * ) ;
extern void nouveau_gpuobj_takedown ( struct drm_device * ) ;
extern int nouveau_gpuobj_suspend ( struct drm_device * dev ) ;
extern void nouveau_gpuobj_suspend_cleanup ( struct drm_device * dev ) ;
extern void nouveau_gpuobj_resume ( struct drm_device * dev ) ;
2010-10-20 10:39:35 +10:00
extern int nouveau_gpuobj_class_new ( struct drm_device * , u32 class , u32 eng ) ;
extern int nouveau_gpuobj_mthd_new ( struct drm_device * , u32 class , u32 mthd ,
int ( * exec ) ( struct nouveau_channel * ,
u32 class , u32 mthd , u32 data ) ) ;
extern int nouveau_gpuobj_mthd_call ( struct nouveau_channel * , u32 , u32 , u32 ) ;
2009-12-11 19:24:15 +10:00
extern int nouveau_gpuobj_channel_init ( struct nouveau_channel * ,
uint32_t vram_h , uint32_t tt_h ) ;
extern void nouveau_gpuobj_channel_takedown ( struct nouveau_channel * ) ;
extern int nouveau_gpuobj_new ( struct drm_device * , struct nouveau_channel * ,
uint32_t size , int align , uint32_t flags ,
struct nouveau_gpuobj * * ) ;
2010-09-01 15:24:31 +10:00
extern void nouveau_gpuobj_ref ( struct nouveau_gpuobj * ,
struct nouveau_gpuobj * * ) ;
2010-09-01 15:24:32 +10:00
extern int nouveau_gpuobj_new_fake ( struct drm_device * , u32 pinst , u64 vinst ,
u32 size , u32 flags ,
2010-09-01 15:24:31 +10:00
struct nouveau_gpuobj * * ) ;
2009-12-11 19:24:15 +10:00
extern int nouveau_gpuobj_dma_new ( struct nouveau_channel * , int class ,
uint64_t offset , uint64_t size , int access ,
int target , struct nouveau_gpuobj * * ) ;
extern int nouveau_gpuobj_gart_dma_new ( struct nouveau_channel * ,
uint64_t offset , uint64_t size ,
int access , struct nouveau_gpuobj * * ,
uint32_t * o_ret ) ;
extern int nouveau_gpuobj_gr_new ( struct nouveau_channel * , int class ,
struct nouveau_gpuobj * * ) ;
extern int nouveau_ioctl_grobj_alloc ( struct drm_device * , void * data ,
struct drm_file * ) ;
extern int nouveau_ioctl_gpuobj_free ( struct drm_device * , void * data ,
struct drm_file * ) ;
/* nouveau_irq.c */
extern irqreturn_t nouveau_irq_handler ( DRM_IRQ_ARGS ) ;
extern void nouveau_irq_preinstall ( struct drm_device * ) ;
extern int nouveau_irq_postinstall ( struct drm_device * ) ;
extern void nouveau_irq_uninstall ( struct drm_device * ) ;
/* nouveau_sgdma.c */
extern int nouveau_sgdma_init ( struct drm_device * ) ;
extern void nouveau_sgdma_takedown ( struct drm_device * ) ;
extern int nouveau_sgdma_get_page ( struct drm_device * , uint32_t offset ,
uint32_t * page ) ;
extern struct ttm_backend * nouveau_sgdma_init_ttm ( struct drm_device * ) ;
/* nouveau_debugfs.c */
# if defined(CONFIG_DRM_NOUVEAU_DEBUG)
extern int nouveau_debugfs_init ( struct drm_minor * ) ;
extern void nouveau_debugfs_takedown ( struct drm_minor * ) ;
extern int nouveau_debugfs_channel_init ( struct nouveau_channel * ) ;
extern void nouveau_debugfs_channel_fini ( struct nouveau_channel * ) ;
# else
static inline int
nouveau_debugfs_init ( struct drm_minor * minor )
{
return 0 ;
}
static inline void nouveau_debugfs_takedown ( struct drm_minor * minor )
{
}
static inline int
nouveau_debugfs_channel_init ( struct nouveau_channel * chan )
{
return 0 ;
}
static inline void
nouveau_debugfs_channel_fini ( struct nouveau_channel * chan )
{
}
# endif
/* nouveau_dma.c */
2010-01-08 10:57:39 +10:00
extern void nouveau_dma_pre_init ( struct nouveau_channel * ) ;
2009-12-11 19:24:15 +10:00
extern int nouveau_dma_init ( struct nouveau_channel * ) ;
2010-02-11 16:37:26 +10:00
extern int nouveau_dma_wait ( struct nouveau_channel * , int slots , int size ) ;
2009-12-11 19:24:15 +10:00
/* nouveau_acpi.c */
2010-04-07 13:55:09 +10:00
# define ROM_BIOS_PAGE 4096
2010-03-03 09:20:25 +10:00
# if defined(CONFIG_ACPI)
2010-02-01 15:38:10 +10:00
void nouveau_register_dsm_handler ( void ) ;
void nouveau_unregister_dsm_handler ( void ) ;
2010-04-07 13:55:09 +10:00
int nouveau_acpi_get_bios_chunk ( uint8_t * bios , int offset , int len ) ;
bool nouveau_acpi_rom_supported ( struct pci_dev * pdev ) ;
2010-07-12 15:33:07 +10:00
int nouveau_acpi_edid ( struct drm_device * , struct drm_connector * ) ;
2010-03-01 21:50:01 +11:00
# else
static inline void nouveau_register_dsm_handler ( void ) { }
static inline void nouveau_unregister_dsm_handler ( void ) { }
2010-04-07 13:55:09 +10:00
static inline bool nouveau_acpi_rom_supported ( struct pci_dev * pdev ) { return false ; }
static inline int nouveau_acpi_get_bios_chunk ( uint8_t * bios , int offset , int len ) { return - EINVAL ; }
2010-07-23 10:00:12 +10:00
static inline int nouveau_acpi_edid ( struct drm_device * dev , struct drm_connector * connector ) { return - EINVAL ; }
2010-03-01 21:50:01 +11:00
# endif
2009-12-11 19:24:15 +10:00
/* nouveau_backlight.c */
# ifdef CONFIG_DRM_NOUVEAU_BACKLIGHT
extern int nouveau_backlight_init ( struct drm_device * ) ;
extern void nouveau_backlight_exit ( struct drm_device * ) ;
# else
static inline int nouveau_backlight_init ( struct drm_device * dev )
{
return 0 ;
}
static inline void nouveau_backlight_exit ( struct drm_device * dev ) { }
# endif
/* nouveau_bios.c */
extern int nouveau_bios_init ( struct drm_device * ) ;
extern void nouveau_bios_takedown ( struct drm_device * dev ) ;
extern int nouveau_run_vbios_init ( struct drm_device * ) ;
extern void nouveau_bios_run_init_table ( struct drm_device * , uint16_t table ,
struct dcb_entry * ) ;
extern struct dcb_gpio_entry * nouveau_bios_gpio_entry ( struct drm_device * ,
enum dcb_gpio_tag ) ;
extern struct dcb_connector_table_entry *
nouveau_bios_connector_entry ( struct drm_device * , int index ) ;
2010-09-16 15:25:25 +10:00
extern u32 get_pll_register ( struct drm_device * , enum pll_types ) ;
2009-12-11 19:24:15 +10:00
extern int get_pll_limits ( struct drm_device * , uint32_t limit_match ,
struct pll_lims * ) ;
extern int nouveau_bios_run_display_table ( struct drm_device * ,
struct dcb_entry * ,
uint32_t script , int pxclk ) ;
extern void * nouveau_bios_dp_table ( struct drm_device * , struct dcb_entry * ,
int * length ) ;
extern bool nouveau_bios_fp_mode ( struct drm_device * , struct drm_display_mode * ) ;
extern uint8_t * nouveau_bios_embedded_edid ( struct drm_device * ) ;
extern int nouveau_bios_parse_lvds_table ( struct drm_device * , int pxclk ,
bool * dl , bool * if_is_24bit ) ;
extern int run_tmds_table ( struct drm_device * , struct dcb_entry * ,
int head , int pxclk ) ;
extern int call_lvds_script ( struct drm_device * , struct dcb_entry * , int head ,
enum LVDS_script , int pxclk ) ;
/* nouveau_ttm.c */
int nouveau_ttm_global_init ( struct drm_nouveau_private * ) ;
void nouveau_ttm_global_release ( struct drm_nouveau_private * ) ;
int nouveau_ttm_mmap ( struct file * , struct vm_area_struct * ) ;
/* nouveau_dp.c */
int nouveau_dp_auxch ( struct nouveau_i2c_chan * auxch , int cmd , int addr ,
uint8_t * data , int data_nr ) ;
bool nouveau_dp_detect ( struct drm_encoder * ) ;
bool nouveau_dp_link_train ( struct drm_encoder * ) ;
/* nv04_fb.c */
extern int nv04_fb_init ( struct drm_device * ) ;
extern void nv04_fb_takedown ( struct drm_device * ) ;
/* nv10_fb.c */
extern int nv10_fb_init ( struct drm_device * ) ;
extern void nv10_fb_takedown ( struct drm_device * ) ;
2009-12-16 12:12:27 +01:00
extern void nv10_fb_set_region_tiling ( struct drm_device * , int , uint32_t ,
uint32_t , uint32_t ) ;
2009-12-11 19:24:15 +10:00
2010-07-21 21:08:11 +02:00
/* nv30_fb.c */
extern int nv30_fb_init ( struct drm_device * ) ;
extern void nv30_fb_takedown ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
/* nv40_fb.c */
extern int nv40_fb_init ( struct drm_device * ) ;
extern void nv40_fb_takedown ( struct drm_device * ) ;
2009-12-16 12:12:27 +01:00
extern void nv40_fb_set_region_tiling ( struct drm_device * , int , uint32_t ,
uint32_t , uint32_t ) ;
2010-03-01 00:18:39 +00:00
/* nv50_fb.c */
extern int nv50_fb_init ( struct drm_device * ) ;
extern void nv50_fb_takedown ( struct drm_device * ) ;
2010-09-03 15:46:58 +10:00
extern void nv50_fb_vm_trap ( struct drm_device * , int display , const char * ) ;
2010-03-01 00:18:39 +00:00
2010-08-03 10:00:56 +10:00
/* nvc0_fb.c */
extern int nvc0_fb_init ( struct drm_device * ) ;
extern void nvc0_fb_takedown ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
/* nv04_fifo.c */
extern int nv04_fifo_init ( struct drm_device * ) ;
extern void nv04_fifo_disable ( struct drm_device * ) ;
extern void nv04_fifo_enable ( struct drm_device * ) ;
extern bool nv04_fifo_reassign ( struct drm_device * , bool ) ;
2009-12-13 20:07:42 +01:00
extern bool nv04_fifo_cache_pull ( struct drm_device * , bool ) ;
2009-12-11 19:24:15 +10:00
extern int nv04_fifo_channel_id ( struct drm_device * ) ;
extern int nv04_fifo_create_context ( struct nouveau_channel * ) ;
extern void nv04_fifo_destroy_context ( struct nouveau_channel * ) ;
extern int nv04_fifo_load_context ( struct nouveau_channel * ) ;
extern int nv04_fifo_unload_context ( struct drm_device * ) ;
/* nv10_fifo.c */
extern int nv10_fifo_init ( struct drm_device * ) ;
extern int nv10_fifo_channel_id ( struct drm_device * ) ;
extern int nv10_fifo_create_context ( struct nouveau_channel * ) ;
extern int nv10_fifo_load_context ( struct nouveau_channel * ) ;
extern int nv10_fifo_unload_context ( struct drm_device * ) ;
/* nv40_fifo.c */
extern int nv40_fifo_init ( struct drm_device * ) ;
extern int nv40_fifo_create_context ( struct nouveau_channel * ) ;
extern int nv40_fifo_load_context ( struct nouveau_channel * ) ;
extern int nv40_fifo_unload_context ( struct drm_device * ) ;
/* nv50_fifo.c */
extern int nv50_fifo_init ( struct drm_device * ) ;
extern void nv50_fifo_takedown ( struct drm_device * ) ;
extern int nv50_fifo_channel_id ( struct drm_device * ) ;
extern int nv50_fifo_create_context ( struct nouveau_channel * ) ;
extern void nv50_fifo_destroy_context ( struct nouveau_channel * ) ;
extern int nv50_fifo_load_context ( struct nouveau_channel * ) ;
extern int nv50_fifo_unload_context ( struct drm_device * ) ;
2010-10-22 10:26:24 +10:00
extern void nv50_fifo_tlb_flush ( struct drm_device * dev ) ;
2009-12-11 19:24:15 +10:00
2010-08-03 10:00:56 +10:00
/* nvc0_fifo.c */
extern int nvc0_fifo_init ( struct drm_device * ) ;
extern void nvc0_fifo_takedown ( struct drm_device * ) ;
extern void nvc0_fifo_disable ( struct drm_device * ) ;
extern void nvc0_fifo_enable ( struct drm_device * ) ;
extern bool nvc0_fifo_reassign ( struct drm_device * , bool ) ;
extern bool nvc0_fifo_cache_pull ( struct drm_device * , bool ) ;
extern int nvc0_fifo_channel_id ( struct drm_device * ) ;
extern int nvc0_fifo_create_context ( struct nouveau_channel * ) ;
extern void nvc0_fifo_destroy_context ( struct nouveau_channel * ) ;
extern int nvc0_fifo_load_context ( struct nouveau_channel * ) ;
extern int nvc0_fifo_unload_context ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
/* nv04_graph.c */
extern int nv04_graph_init ( struct drm_device * ) ;
extern void nv04_graph_takedown ( struct drm_device * ) ;
extern void nv04_graph_fifo_access ( struct drm_device * , bool ) ;
extern struct nouveau_channel * nv04_graph_channel ( struct drm_device * ) ;
extern int nv04_graph_create_context ( struct nouveau_channel * ) ;
extern void nv04_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nv04_graph_load_context ( struct nouveau_channel * ) ;
extern int nv04_graph_unload_context ( struct drm_device * ) ;
extern void nv04_graph_context_switch ( struct drm_device * ) ;
/* nv10_graph.c */
extern int nv10_graph_init ( struct drm_device * ) ;
extern void nv10_graph_takedown ( struct drm_device * ) ;
extern struct nouveau_channel * nv10_graph_channel ( struct drm_device * ) ;
extern int nv10_graph_create_context ( struct nouveau_channel * ) ;
extern void nv10_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nv10_graph_load_context ( struct nouveau_channel * ) ;
extern int nv10_graph_unload_context ( struct drm_device * ) ;
extern void nv10_graph_context_switch ( struct drm_device * ) ;
2009-12-16 12:12:27 +01:00
extern void nv10_graph_set_region_tiling ( struct drm_device * , int , uint32_t ,
uint32_t , uint32_t ) ;
2009-12-11 19:24:15 +10:00
/* nv20_graph.c */
extern int nv20_graph_create_context ( struct nouveau_channel * ) ;
extern void nv20_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nv20_graph_load_context ( struct nouveau_channel * ) ;
extern int nv20_graph_unload_context ( struct drm_device * ) ;
extern int nv20_graph_init ( struct drm_device * ) ;
extern void nv20_graph_takedown ( struct drm_device * ) ;
extern int nv30_graph_init ( struct drm_device * ) ;
2009-12-16 12:12:27 +01:00
extern void nv20_graph_set_region_tiling ( struct drm_device * , int , uint32_t ,
uint32_t , uint32_t ) ;
2009-12-11 19:24:15 +10:00
/* nv40_graph.c */
extern int nv40_graph_init ( struct drm_device * ) ;
extern void nv40_graph_takedown ( struct drm_device * ) ;
extern struct nouveau_channel * nv40_graph_channel ( struct drm_device * ) ;
extern int nv40_graph_create_context ( struct nouveau_channel * ) ;
extern void nv40_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nv40_graph_load_context ( struct nouveau_channel * ) ;
extern int nv40_graph_unload_context ( struct drm_device * ) ;
drm/nv40: implement ctxprog/state generation
The context programs are *very* simple compared to the ones used by
the binary driver. There's notes in nv40_grctx.c explaining most of
the things we don't implement. If we discover if/why any of it is
required further down the track, we'll handle it then.
The PGRAPH state generated for each chipset should match what NVIDIA
do almost exactly (there's a couple of exceptions). If someone has
a lot of time on their hands, they could figure out the mapping of
object/method to PGRAPH register and demagic the initial state a little,
it's not terribly important however.
At time of commit, confirmed to be working at least well enough for
accelerated X (and where tested, for 3D apps) on NV40, NV43, NV44, NV46,
NV49, NV4A, NV4B and NV4E.
A module option has been added to force the use of external firmware
blobs if it becomes required.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
2009-12-15 22:02:47 +10:00
extern void nv40_grctx_init ( struct nouveau_grctx * ) ;
2009-12-16 12:12:27 +01:00
extern void nv40_graph_set_region_tiling ( struct drm_device * , int , uint32_t ,
uint32_t , uint32_t ) ;
2009-12-11 19:24:15 +10:00
/* nv50_graph.c */
extern int nv50_graph_init ( struct drm_device * ) ;
extern void nv50_graph_takedown ( struct drm_device * ) ;
extern void nv50_graph_fifo_access ( struct drm_device * , bool ) ;
extern struct nouveau_channel * nv50_graph_channel ( struct drm_device * ) ;
extern int nv50_graph_create_context ( struct nouveau_channel * ) ;
extern void nv50_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nv50_graph_load_context ( struct nouveau_channel * ) ;
extern int nv50_graph_unload_context ( struct drm_device * ) ;
extern void nv50_graph_context_switch ( struct drm_device * ) ;
2010-02-25 00:54:02 +00:00
extern int nv50_grctx_init ( struct nouveau_grctx * ) ;
2010-10-22 10:26:24 +10:00
extern void nv50_graph_tlb_flush ( struct drm_device * dev ) ;
extern void nv86_graph_tlb_flush ( struct drm_device * dev ) ;
2009-12-11 19:24:15 +10:00
2010-08-03 10:00:56 +10:00
/* nvc0_graph.c */
extern int nvc0_graph_init ( struct drm_device * ) ;
extern void nvc0_graph_takedown ( struct drm_device * ) ;
extern void nvc0_graph_fifo_access ( struct drm_device * , bool ) ;
extern struct nouveau_channel * nvc0_graph_channel ( struct drm_device * ) ;
extern int nvc0_graph_create_context ( struct nouveau_channel * ) ;
extern void nvc0_graph_destroy_context ( struct nouveau_channel * ) ;
extern int nvc0_graph_load_context ( struct nouveau_channel * ) ;
extern int nvc0_graph_unload_context ( struct drm_device * ) ;
2010-10-19 20:06:01 +10:00
/* nv84_crypt.c */
extern int nv84_crypt_init ( struct drm_device * dev ) ;
extern void nv84_crypt_fini ( struct drm_device * dev ) ;
extern int nv84_crypt_create_context ( struct nouveau_channel * ) ;
extern void nv84_crypt_destroy_context ( struct nouveau_channel * ) ;
extern void nv84_crypt_tlb_flush ( struct drm_device * dev ) ;
2009-12-11 19:24:15 +10:00
/* nv04_instmem.c */
extern int nv04_instmem_init ( struct drm_device * ) ;
extern void nv04_instmem_takedown ( struct drm_device * ) ;
extern int nv04_instmem_suspend ( struct drm_device * ) ;
extern void nv04_instmem_resume ( struct drm_device * ) ;
extern int nv04_instmem_populate ( struct drm_device * , struct nouveau_gpuobj * ,
2010-10-15 09:15:26 +10:00
u32 * size , u32 align ) ;
2009-12-11 19:24:15 +10:00
extern void nv04_instmem_clear ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nv04_instmem_bind ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nv04_instmem_unbind ( struct drm_device * , struct nouveau_gpuobj * ) ;
2010-07-08 11:29:10 +10:00
extern void nv04_instmem_flush ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
/* nv50_instmem.c */
extern int nv50_instmem_init ( struct drm_device * ) ;
extern void nv50_instmem_takedown ( struct drm_device * ) ;
extern int nv50_instmem_suspend ( struct drm_device * ) ;
extern void nv50_instmem_resume ( struct drm_device * ) ;
extern int nv50_instmem_populate ( struct drm_device * , struct nouveau_gpuobj * ,
2010-10-15 09:15:26 +10:00
u32 * size , u32 align ) ;
2009-12-11 19:24:15 +10:00
extern void nv50_instmem_clear ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nv50_instmem_bind ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nv50_instmem_unbind ( struct drm_device * , struct nouveau_gpuobj * ) ;
2010-07-08 11:29:10 +10:00
extern void nv50_instmem_flush ( struct drm_device * ) ;
2010-07-15 11:02:54 +10:00
extern void nv84_instmem_flush ( struct drm_device * ) ;
2010-07-08 11:39:18 +10:00
extern void nv50_vm_flush ( struct drm_device * , int engine ) ;
2009-12-11 19:24:15 +10:00
2010-08-03 10:00:56 +10:00
/* nvc0_instmem.c */
extern int nvc0_instmem_init ( struct drm_device * ) ;
extern void nvc0_instmem_takedown ( struct drm_device * ) ;
extern int nvc0_instmem_suspend ( struct drm_device * ) ;
extern void nvc0_instmem_resume ( struct drm_device * ) ;
extern int nvc0_instmem_populate ( struct drm_device * , struct nouveau_gpuobj * ,
2010-10-15 09:15:26 +10:00
u32 * size , u32 align ) ;
2010-08-03 10:00:56 +10:00
extern void nvc0_instmem_clear ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nvc0_instmem_bind ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern int nvc0_instmem_unbind ( struct drm_device * , struct nouveau_gpuobj * ) ;
extern void nvc0_instmem_flush ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
/* nv04_mc.c */
extern int nv04_mc_init ( struct drm_device * ) ;
extern void nv04_mc_takedown ( struct drm_device * ) ;
/* nv40_mc.c */
extern int nv40_mc_init ( struct drm_device * ) ;
extern void nv40_mc_takedown ( struct drm_device * ) ;
/* nv50_mc.c */
extern int nv50_mc_init ( struct drm_device * ) ;
extern void nv50_mc_takedown ( struct drm_device * ) ;
/* nv04_timer.c */
extern int nv04_timer_init ( struct drm_device * ) ;
extern uint64_t nv04_timer_read ( struct drm_device * ) ;
extern void nv04_timer_takedown ( struct drm_device * ) ;
extern long nouveau_compat_ioctl ( struct file * file , unsigned int cmd ,
unsigned long arg ) ;
/* nv04_dac.c */
2010-06-28 14:35:50 +10:00
extern int nv04_dac_create ( struct drm_connector * , struct dcb_entry * ) ;
2009-12-17 18:52:44 +01:00
extern uint32_t nv17_dac_sample_load ( struct drm_encoder * encoder ) ;
2009-12-11 19:24:15 +10:00
extern int nv04_dac_output_offset ( struct drm_encoder * encoder ) ;
extern void nv04_dac_update_dacclk ( struct drm_encoder * encoder , bool enable ) ;
2010-07-04 16:14:42 +02:00
extern bool nv04_dac_in_use ( struct drm_encoder * encoder ) ;
2009-12-11 19:24:15 +10:00
/* nv04_dfp.c */
2010-06-28 14:35:50 +10:00
extern int nv04_dfp_create ( struct drm_connector * , struct dcb_entry * ) ;
2009-12-11 19:24:15 +10:00
extern int nv04_dfp_get_bound_head ( struct drm_device * dev , struct dcb_entry * dcbent ) ;
extern void nv04_dfp_bind_head ( struct drm_device * dev , struct dcb_entry * dcbent ,
int head , bool dl ) ;
extern void nv04_dfp_disable ( struct drm_device * dev , int head ) ;
extern void nv04_dfp_update_fp_control ( struct drm_encoder * encoder , int mode ) ;
/* nv04_tv.c */
extern int nv04_tv_identify ( struct drm_device * dev , int i2c_index ) ;
2010-06-28 14:35:50 +10:00
extern int nv04_tv_create ( struct drm_connector * , struct dcb_entry * ) ;
2009-12-11 19:24:15 +10:00
/* nv17_tv.c */
2010-06-28 14:35:50 +10:00
extern int nv17_tv_create ( struct drm_connector * , struct dcb_entry * ) ;
2009-12-11 19:24:15 +10:00
/* nv04_display.c */
2010-07-24 17:37:33 +02:00
extern int nv04_display_early_init ( struct drm_device * ) ;
extern void nv04_display_late_takedown ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
extern int nv04_display_create ( struct drm_device * ) ;
2010-07-24 17:37:33 +02:00
extern int nv04_display_init ( struct drm_device * ) ;
2009-12-11 19:24:15 +10:00
extern void nv04_display_destroy ( struct drm_device * ) ;
/* nv04_crtc.c */
extern int nv04_crtc_create ( struct drm_device * , int index ) ;
/* nouveau_bo.c */
extern struct ttm_bo_driver nouveau_bo_driver ;
extern int nouveau_bo_new ( struct drm_device * , struct nouveau_channel * ,
int size , int align , uint32_t flags ,
uint32_t tile_mode , uint32_t tile_flags ,
bool no_vm , bool mappable , struct nouveau_bo * * ) ;
extern int nouveau_bo_pin ( struct nouveau_bo * , uint32_t flags ) ;
extern int nouveau_bo_unpin ( struct nouveau_bo * ) ;
extern int nouveau_bo_map ( struct nouveau_bo * ) ;
extern void nouveau_bo_unmap ( struct nouveau_bo * ) ;
2010-03-18 13:07:47 +01:00
extern void nouveau_bo_placement_set ( struct nouveau_bo * , uint32_t type ,
uint32_t busy ) ;
2009-12-11 19:24:15 +10:00
extern u16 nouveau_bo_rd16 ( struct nouveau_bo * nvbo , unsigned index ) ;
extern void nouveau_bo_wr16 ( struct nouveau_bo * nvbo , unsigned index , u16 val ) ;
extern u32 nouveau_bo_rd32 ( struct nouveau_bo * nvbo , unsigned index ) ;
extern void nouveau_bo_wr32 ( struct nouveau_bo * nvbo , unsigned index , u32 val ) ;
/* nouveau_fence.c */
struct nouveau_fence ;
2010-09-22 00:58:54 +02:00
extern int nouveau_fence_init ( struct drm_device * ) ;
extern void nouveau_fence_fini ( struct drm_device * ) ;
2010-09-21 18:57:11 +02:00
extern int nouveau_fence_channel_init ( struct nouveau_channel * ) ;
extern void nouveau_fence_channel_fini ( struct nouveau_channel * ) ;
2009-12-11 19:24:15 +10:00
extern void nouveau_fence_update ( struct nouveau_channel * ) ;
extern int nouveau_fence_new ( struct nouveau_channel * , struct nouveau_fence * * ,
bool emit ) ;
extern int nouveau_fence_emit ( struct nouveau_fence * ) ;
2010-09-21 20:49:39 +02:00
extern void nouveau_fence_work ( struct nouveau_fence * fence ,
void ( * work ) ( void * priv , bool signalled ) ,
void * priv ) ;
2009-12-11 19:24:15 +10:00
struct nouveau_channel * nouveau_fence_channel ( struct nouveau_fence * ) ;
extern bool nouveau_fence_signalled ( void * obj , void * arg ) ;
extern int nouveau_fence_wait ( void * obj , void * arg , bool lazy , bool intr ) ;
2010-09-21 18:57:11 +02:00
extern int nouveau_fence_sync ( struct nouveau_fence * , struct nouveau_channel * ) ;
2009-12-11 19:24:15 +10:00
extern int nouveau_fence_flush ( void * obj , void * arg ) ;
extern void nouveau_fence_unref ( void * * obj ) ;
extern void * nouveau_fence_ref ( void * obj ) ;
/* nouveau_gem.c */
extern int nouveau_gem_new ( struct drm_device * , struct nouveau_channel * ,
int size , int align , uint32_t flags ,
uint32_t tile_mode , uint32_t tile_flags ,
bool no_vm , bool mappable , struct nouveau_bo * * ) ;
extern int nouveau_gem_object_new ( struct drm_gem_object * ) ;
extern void nouveau_gem_object_del ( struct drm_gem_object * ) ;
extern int nouveau_gem_ioctl_new ( struct drm_device * , void * ,
struct drm_file * ) ;
extern int nouveau_gem_ioctl_pushbuf ( struct drm_device * , void * ,
struct drm_file * ) ;
extern int nouveau_gem_ioctl_cpu_prep ( struct drm_device * , void * ,
struct drm_file * ) ;
extern int nouveau_gem_ioctl_cpu_fini ( struct drm_device * , void * ,
struct drm_file * ) ;
extern int nouveau_gem_ioctl_info ( struct drm_device * , void * ,
struct drm_file * ) ;
2010-07-26 09:28:25 +10:00
/* nv10_gpio.c */
int nv10_gpio_get ( struct drm_device * dev , enum dcb_gpio_tag tag ) ;
int nv10_gpio_set ( struct drm_device * dev , enum dcb_gpio_tag tag , int state ) ;
2009-12-11 19:24:15 +10:00
2010-04-07 12:57:35 +10:00
/* nv50_gpio.c */
2010-07-26 09:28:25 +10:00
int nv50_gpio_init ( struct drm_device * dev ) ;
2010-04-07 12:57:35 +10:00
int nv50_gpio_get ( struct drm_device * dev , enum dcb_gpio_tag tag ) ;
int nv50_gpio_set ( struct drm_device * dev , enum dcb_gpio_tag tag , int state ) ;
2010-07-23 11:31:08 +10:00
void nv50_gpio_irq_enable ( struct drm_device * , enum dcb_gpio_tag , bool on ) ;
2010-04-07 12:57:35 +10:00
2010-04-28 14:07:06 +10:00
/* nv50_calc. */
int nv50_calc_pll ( struct drm_device * , struct pll_lims * , int clk ,
int * N1 , int * M1 , int * N2 , int * M2 , int * P ) ;
int nv50_calc_pll2 ( struct drm_device * , struct pll_lims * ,
int clk , int * N , int * fN , int * M , int * P ) ;
2009-12-11 19:24:15 +10:00
# ifndef ioread32_native
# ifdef __BIG_ENDIAN
# define ioread16_native ioread16be
# define iowrite16_native iowrite16be
# define ioread32_native ioread32be
# define iowrite32_native iowrite32be
# else /* def __BIG_ENDIAN */
# define ioread16_native ioread16
# define iowrite16_native iowrite16
# define ioread32_native ioread32
# define iowrite32_native iowrite32
# endif /* def __BIG_ENDIAN else */
# endif /* !ioread32_native */
/* channel control reg access */
static inline u32 nvchan_rd32 ( struct nouveau_channel * chan , unsigned reg )
{
return ioread32_native ( chan - > user + reg ) ;
}
static inline void nvchan_wr32 ( struct nouveau_channel * chan ,
unsigned reg , u32 val )
{
iowrite32_native ( val , chan - > user + reg ) ;
}
/* register access */
static inline u32 nv_rd32 ( struct drm_device * dev , unsigned reg )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
return ioread32_native ( dev_priv - > mmio + reg ) ;
}
static inline void nv_wr32 ( struct drm_device * dev , unsigned reg , u32 val )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
iowrite32_native ( val , dev_priv - > mmio + reg ) ;
}
2010-08-30 16:14:51 +10:00
static inline u32 nv_mask ( struct drm_device * dev , u32 reg , u32 mask , u32 val )
2010-07-23 11:17:57 +10:00
{
u32 tmp = nv_rd32 ( dev , reg ) ;
2010-08-30 16:14:51 +10:00
nv_wr32 ( dev , reg , ( tmp & ~ mask ) | val ) ;
return tmp ;
2010-07-23 11:17:57 +10:00
}
2009-12-11 19:24:15 +10:00
static inline u8 nv_rd08 ( struct drm_device * dev , unsigned reg )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
return ioread8 ( dev_priv - > mmio + reg ) ;
}
static inline void nv_wr08 ( struct drm_device * dev , unsigned reg , u8 val )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
iowrite8 ( val , dev_priv - > mmio + reg ) ;
}
2010-09-07 17:34:44 +02:00
# define nv_wait(dev, reg, mask, val) \
2009-12-11 19:24:15 +10:00
nouveau_wait_until ( dev , 2000000000ULL , ( reg ) , ( mask ) , ( val ) )
/* PRAMIN access */
static inline u32 nv_ri32 ( struct drm_device * dev , unsigned offset )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
return ioread32_native ( dev_priv - > ramin + offset ) ;
}
static inline void nv_wi32 ( struct drm_device * dev , unsigned offset , u32 val )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
iowrite32_native ( val , dev_priv - > ramin + offset ) ;
}
/* object access */
2010-09-01 15:24:29 +10:00
extern u32 nv_ro32 ( struct nouveau_gpuobj * , u32 offset ) ;
extern void nv_wo32 ( struct nouveau_gpuobj * , u32 offset , u32 val ) ;
2009-12-11 19:24:15 +10:00
/*
* Logging
* Argument d is ( struct drm_device * ) .
*/
# define NV_PRINTK(level, d, fmt, arg...) \
printk ( level " [ " DRM_NAME " ] " DRIVER_NAME " %s: " fmt , \
pci_name ( d - > pdev ) , # # arg )
# ifndef NV_DEBUG_NOTRACE
# define NV_DEBUG(d, fmt, arg...) do { \
2009-12-13 16:53:12 +01:00
if ( drm_debug & DRM_UT_DRIVER ) { \
NV_PRINTK ( KERN_DEBUG , d , " %s:%d - " fmt , __func__ , \
__LINE__ , # # arg ) ; \
} \
} while ( 0 )
# define NV_DEBUG_KMS(d, fmt, arg...) do { \
if ( drm_debug & DRM_UT_KMS ) { \
2009-12-11 19:24:15 +10:00
NV_PRINTK ( KERN_DEBUG , d , " %s:%d - " fmt , __func__ , \
__LINE__ , # # arg ) ; \
} \
} while ( 0 )
# else
# define NV_DEBUG(d, fmt, arg...) do { \
2009-12-13 16:53:12 +01:00
if ( drm_debug & DRM_UT_DRIVER ) \
NV_PRINTK ( KERN_DEBUG , d , fmt , # # arg ) ; \
} while ( 0 )
# define NV_DEBUG_KMS(d, fmt, arg...) do { \
if ( drm_debug & DRM_UT_KMS ) \
2009-12-11 19:24:15 +10:00
NV_PRINTK ( KERN_DEBUG , d , fmt , # # arg ) ; \
} while ( 0 )
# endif
# define NV_ERROR(d, fmt, arg...) NV_PRINTK(KERN_ERR, d, fmt, ##arg)
# define NV_INFO(d, fmt, arg...) NV_PRINTK(KERN_INFO, d, fmt, ##arg)
# define NV_TRACEWARN(d, fmt, arg...) NV_PRINTK(KERN_NOTICE, d, fmt, ##arg)
# define NV_TRACE(d, fmt, arg...) NV_PRINTK(KERN_INFO, d, fmt, ##arg)
# define NV_WARN(d, fmt, arg...) NV_PRINTK(KERN_WARNING, d, fmt, ##arg)
/* nouveau_reg_debug bitmask */
enum {
NOUVEAU_REG_DEBUG_MC = 0x1 ,
NOUVEAU_REG_DEBUG_VIDEO = 0x2 ,
NOUVEAU_REG_DEBUG_FB = 0x4 ,
NOUVEAU_REG_DEBUG_EXTDEV = 0x8 ,
NOUVEAU_REG_DEBUG_CRTC = 0x10 ,
NOUVEAU_REG_DEBUG_RAMDAC = 0x20 ,
NOUVEAU_REG_DEBUG_VGACRTC = 0x40 ,
NOUVEAU_REG_DEBUG_RMVIO = 0x80 ,
NOUVEAU_REG_DEBUG_VGAATTR = 0x100 ,
NOUVEAU_REG_DEBUG_EVO = 0x200 ,
} ;
# define NV_REG_DEBUG(type, dev, fmt, arg...) do { \
if ( nouveau_reg_debug & NOUVEAU_REG_DEBUG_ # # type ) \
NV_PRINTK ( KERN_DEBUG , dev , " %s: " fmt , __func__ , # # arg ) ; \
} while ( 0 )
static inline bool
nv_two_heads ( struct drm_device * dev )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
const int impl = dev - > pci_device & 0x0ff0 ;
if ( dev_priv - > card_type > = NV_10 & & impl ! = 0x0100 & &
impl ! = 0x0150 & & impl ! = 0x01a0 & & impl ! = 0x0200 )
return true ;
return false ;
}
static inline bool
nv_gf4_disp_arch ( struct drm_device * dev )
{
return nv_two_heads ( dev ) & & ( dev - > pci_device & 0x0ff0 ) ! = 0x0110 ;
}
static inline bool
nv_two_reg_pll ( struct drm_device * dev )
{
struct drm_nouveau_private * dev_priv = dev - > dev_private ;
const int impl = dev - > pci_device & 0x0ff0 ;
if ( impl = = 0x0310 | | impl = = 0x0340 | | dev_priv - > card_type > = NV_40 )
return true ;
return false ;
}
2010-08-15 14:31:31 +02:00
static inline bool
nv_match_device ( struct drm_device * dev , unsigned device ,
unsigned sub_vendor , unsigned sub_device )
{
return dev - > pdev - > device = = device & &
dev - > pdev - > subsystem_vendor = = sub_vendor & &
dev - > pdev - > subsystem_device = = sub_device ;
}
2009-12-26 02:42:45 +01:00
# define NV_SW 0x0000506e
# define NV_SW_DMA_SEMAPHORE 0x00000060
# define NV_SW_SEMAPHORE_OFFSET 0x00000064
# define NV_SW_SEMAPHORE_ACQUIRE 0x00000068
# define NV_SW_SEMAPHORE_RELEASE 0x0000006c
2010-10-02 17:04:46 +02:00
# define NV_SW_YIELD 0x00000080
2009-12-26 02:42:45 +01:00
# define NV_SW_DMA_VBLSEM 0x0000018c
# define NV_SW_VBLSEM_OFFSET 0x00000400
# define NV_SW_VBLSEM_RELEASE_VALUE 0x00000404
# define NV_SW_VBLSEM_RELEASE 0x00000408
2009-12-11 19:24:15 +10:00
# endif /* __NOUVEAU_DRV_H__ */