Hello Sirs: The following patch is based on 2.6.31 mainline kernel for the system hang issue caused by 3D scaling + ACPI. The modified header files includes 1. via_3d_reg.h 2. via_drv.h 3. via_verifier.h 4. via_drm.h
Signed-off-by: Bruce Chang<brucech...@via.com.tw> diff -ruN old/drivers/gpu/drm/via/via_3d_reg.h new/drivers/gpu/drm/via/via_3d_reg.h --- old/drivers/gpu/drm/via/via_3d_reg.h 2009-07-14 16:42:05.000000000 +0800 +++ new/drivers/gpu/drm/via/via_3d_reg.h 2009-07-14 16:45:28.000000000 +0800 @@ -1647,4 +1647,7 @@ #define VIA_VIDEO_HEADER6 0xFE050000 #define VIA_VIDEO_HEADER7 0xFE060000 #define VIA_VIDEOMASK 0xFFFF0000 +#define HALCYON_HEADER3 0xF4000000 +#define HALCYON_HEADER4 0xF6000000 +#define HALCYON_HEADER_MASK 0xFE000000 #endif diff -ruN old/drivers/gpu/drm/via/via_drv.h new/drivers/gpu/drm/via/via_drv.h --- old/drivers/gpu/drm/via/via_drv.h 2009-07-14 16:42:05.000000000 +0800 +++ new/drivers/gpu/drm/via/via_drv.h 2009-07-14 16:45:28.000000000 +0800 @@ -62,6 +62,7 @@ drm_local_map_t *sarea; drm_local_map_t *fb; drm_local_map_t *mmio; + enum drm_agp_type agptype; unsigned long agpAddr; wait_queue_head_t decoder_queue[VIA_NR_XVMC_LOCKS]; char *dma_ptr; @@ -94,7 +95,13 @@ unsigned long vram_offset; unsigned long agp_offset; drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES]; + struct drm_local_map video_agp_address_map[3]; + enum { + CR_FOR_RINGBUFFER, + CR_FOR_VIDEO + } cr_status; uint32_t dma_diff; + int initialize; } drm_via_private_t; enum via_family { @@ -120,6 +127,8 @@ 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_get_drm_info(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); 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 ); @@ -154,4 +163,7 @@ extern void via_dmablit_handler(struct drm_device *dev, int engine, int from_irq); extern void via_init_dmablit(struct drm_device *dev); +extern int via_drm_resume(struct pci_dev *dev); +extern int via_drm_suspend(struct pci_dev *dev, pm_message_t state); + #endif diff -ruN old/drivers/gpu/drm/via/via_verifier.h new/drivers/gpu/drm/via/via_verifier.h --- old/drivers/gpu/drm/via/via_verifier.h 2009-07-14 16:42:05.000000000 +0800 +++ new/drivers/gpu/drm/via/via_verifier.h 2009-07-14 16:45:28.000000000 +0800 @@ -25,7 +25,7 @@ #ifndef _VIA_VERIFIER_H_ #define _VIA_VERIFIER_H_ - +#include "via_3d_reg.h" typedef enum { no_sequence = 0, z_address, @@ -59,4 +59,26 @@ extern int via_parse_command_stream(struct drm_device *dev, const uint32_t *buf, unsigned int size); +static inline int is_agp_header(unsigned int data) +{ + if (data == HALCYON_HEADER2) + return 1; + else if ((data & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5) + ; + else if ((data & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6) + ; + else if (data & HALCYON_HEADER_MASK) { + switch (data & HALCYON_HEADER_MASK) { + case HALCYON_HEADER3: + case HALCYON_HEADER4: + case HALCYON_HEADER1: + return 1; + default: + return 0; + } + } else + return 0; + + return 1; +} #endif diff -ruN old/include/drm/via_drm.h new/include/drm/via_drm.h --- old/include/drm/via_drm.h 2009-07-14 16:42:05.000000000 +0800 +++ new/include/drm/via_drm.h 2009-07-14 16:44:22.000000000 +0800 @@ -24,8 +24,6 @@ #ifndef _VIA_DRM_H_ #define _VIA_DRM_H_ -#include <linux/types.h> - /* WARNING: These defines must be the same as what the Xserver uses. * if you change them, you must change the defines in the Xserver. */ @@ -53,6 +51,12 @@ #define VIA_LOG_MIN_TEX_REGION_SIZE 16 #endif +struct drm_via_info { + unsigned long AgpHandle; + unsigned long AgpSize; + unsigned long RegHandle; + unsigned long RegSize; +} ; #define VIA_UPLOAD_TEX0IMAGE 0x1 /* handled clientside */ #define VIA_UPLOAD_TEX1IMAGE 0x2 /* handled clientside */ #define VIA_UPLOAD_CTX 0x4 @@ -69,7 +73,7 @@ #define DRM_VIA_FB_INIT 0x03 #define DRM_VIA_MAP_INIT 0x04 #define DRM_VIA_DEC_FUTEX 0x05 -#define NOT_USED +#define DRM_VIA_GET_INFO 0x06 #define DRM_VIA_DMA_INIT 0x07 #define DRM_VIA_CMDBUFFER 0x08 #define DRM_VIA_FLUSH 0x09 @@ -79,6 +83,9 @@ #define DRM_VIA_WAIT_IRQ 0x0d #define DRM_VIA_DMA_BLIT 0x0e #define DRM_VIA_BLIT_SYNC 0x0f +#define DRM_VIA_AUTH_MAGIC 0x11 +#define DRM_VIA_FLUSH_VIDEO 0x12 +#define DRM_VIA_INIT_JUDGE 0x16 #define DRM_IOCTL_VIA_ALLOCMEM DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_ALLOCMEM, drm_via_mem_t) #define DRM_IOCTL_VIA_FREEMEM DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_FREEMEM, drm_via_mem_t) @@ -86,6 +93,8 @@ #define DRM_IOCTL_VIA_FB_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_FB_INIT, drm_via_fb_t) #define DRM_IOCTL_VIA_MAP_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_MAP_INIT, drm_via_init_t) #define DRM_IOCTL_VIA_DEC_FUTEX DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_DEC_FUTEX, drm_via_futex_t) +#define DRM_IOCTL_VIA_GET_INFO DRM_IOR(DRM_COMMAND_BASE + \ + DRM_VIA_GET_INFO, struct drm_via_info) #define DRM_IOCTL_VIA_DMA_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_DMA_INIT, drm_via_dma_init_t) #define DRM_IOCTL_VIA_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_CMDBUFFER, drm_via_cmdbuffer_t) #define DRM_IOCTL_VIA_FLUSH DRM_IO( DRM_COMMAND_BASE + DRM_VIA_FLUSH) @@ -93,8 +102,14 @@ #define DRM_IOCTL_VIA_CMDBUF_SIZE DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_CMDBUF_SIZE, \ drm_via_cmdbuf_size_t) #define DRM_IOCTL_VIA_WAIT_IRQ DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_WAIT_IRQ, drm_via_irqwait_t) +#define DRM_IOCTL_VIA_FLUSH_VIDEO DRM_IOW(DRM_COMMAND_BASE + \ + DRM_VIA_FLUSH_VIDEO, struct drm_via_video_agp_cmd) #define DRM_IOCTL_VIA_DMA_BLIT DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_DMA_BLIT, drm_via_dmablit_t) #define DRM_IOCTL_VIA_BLIT_SYNC DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_BLIT_SYNC, drm_via_blitsync_t) +#define DRM_IOCTL_VIA_AUTH_MAGIC DRM_IOW(DRM_COMMAND_BASE + \ + DRM_VIA_AUTH_MAGIC, drm_auth_t) +#define DRM_IOCTL_VIA_INIT_JUDGE DRM_IOR(DRM_COMMAND_BASE + \ + DRM_VIA_INIT_JUDGE, int) /* Indices into buf.Setup where various bits of state are mirrored per * context and per buffer. These can be fired at the card as a unit, @@ -114,21 +129,28 @@ #define VIA_MEM_SYSTEM 2 #define VIA_MEM_MIXED 3 #define VIA_MEM_UNKNOWN 4 +#define VIA_MEM_VIDEO_SAVE 2 /*For video memory need to be saved in ACPI */ + +enum drm_agp_type { + AGP_RING_BUFFER, + AGP_DOUBLE_BUFFER, + DISABLED +}; typedef struct { - __u32 offset; - __u32 size; + uint32_t offset; + uint32_t size; } drm_via_agp_t; typedef struct { - __u32 offset; - __u32 size; + uint32_t offset; + uint32_t size; } drm_via_fb_t; typedef struct { - __u32 context; - __u32 type; - __u32 size; + uint32_t context; + uint32_t type; + uint32_t size; unsigned long index; unsigned long offset; } drm_via_mem_t; @@ -143,6 +165,8 @@ unsigned long fb_offset; unsigned long mmio_offset; unsigned long agpAddr; + unsigned long agp_offset; + enum drm_agp_type agp_type; } drm_via_init_t; typedef struct _drm_via_futex { @@ -150,9 +174,9 @@ VIA_FUTEX_WAIT = 0x00, VIA_FUTEX_WAKE = 0X01 } func; - __u32 ms; - __u32 lock; - __u32 val; + uint32_t ms; + uint32_t lock; + uint32_t val; } drm_via_futex_t; typedef struct _drm_via_dma_init { @@ -213,7 +237,7 @@ VIA_CMDBUF_LAG = 0x02 } func; int wait; - __u32 size; + uint32_t size; } drm_via_cmdbuf_size_t; typedef enum { @@ -238,8 +262,8 @@ struct drm_via_wait_irq_request { unsigned irq; via_irq_seq_type_t type; - __u32 sequence; - __u32 signal; + uint32_t sequence; + uint32_t signal; }; typedef union drm_via_irqwait { @@ -247,8 +271,14 @@ struct drm_wait_vblank_reply reply; } drm_via_irqwait_t; +struct drm_via_video_agp_cmd { + u32 offset; + u32 cmd_size; + u32 buffer_size; +} ; + typedef struct drm_via_blitsync { - __u32 sync_handle; + uint32_t sync_handle; unsigned engine; } drm_via_blitsync_t; @@ -259,19 +289,28 @@ */ typedef struct drm_via_dmablit { - __u32 num_lines; - __u32 line_length; + uint32_t num_lines; + uint32_t line_length; - __u32 fb_addr; - __u32 fb_stride; + uint32_t fb_addr; + uint32_t fb_stride; unsigned char *mem_addr; - __u32 mem_stride; + uint32_t mem_stride; - __u32 flags; + uint32_t flags; int to_fb; drm_via_blitsync_t sync; } drm_via_dmablit_t; +struct drm_via_video_save_head { + void *pvideomem; + void *psystemmem; + int size; + /* token used to identify this video memory */ + unsigned long token; + void *next; +} ; +extern struct drm_via_video_save_head *via_video_save_head; #endif /* _VIA_DRM_H_ */ Thanks and Best Regards ================================================= Bruce C. Chang(張祖明) VIA Technologies, Inc. Address: 1F, 531, Chung-Cheng Road, Hsin-Tien, 231 Taipei Tel: +886-2-22185452 Ext 7323 Mobile: +886-968343824 Fax: +886-2-22186282 Skype: Bruce.C.Chang Email: brucech...@via.com.tw ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july -- _______________________________________________ Dri-devel mailing list Dri-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/dri-devel