mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-16 14:02:10 +00:00
agp: add chipset flushing support to AGP interface
This bumps the AGP interface to 0.103. Certain Intel chipsets contains a global write buffer, and this can require flushing from the drm or X.org to make sure all data has hit RAM before initiating a GPU transfer, due to a lack of coherency with the integrated graphics device and this buffer. This just adds generic support to the AGP interfaces, a follow-on patch will add support to the Intel driver to use this interface. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
9ef9dc69d4
commit
a13af4b4d8
@ -117,7 +117,8 @@ struct agp_bridge_driver {
|
|||||||
void (*free_by_type)(struct agp_memory *);
|
void (*free_by_type)(struct agp_memory *);
|
||||||
void *(*agp_alloc_page)(struct agp_bridge_data *);
|
void *(*agp_alloc_page)(struct agp_bridge_data *);
|
||||||
void (*agp_destroy_page)(void *, int flags);
|
void (*agp_destroy_page)(void *, int flags);
|
||||||
int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
|
int (*agp_type_to_mask_type) (struct agp_bridge_data *, int);
|
||||||
|
void (*chipset_flush)(struct agp_bridge_data *);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct agp_bridge_data {
|
struct agp_bridge_data {
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
* fix some real stupidity. It's only by chance we can bump
|
* fix some real stupidity. It's only by chance we can bump
|
||||||
* past 0.99 at all due to some boolean logic error. */
|
* past 0.99 at all due to some boolean logic error. */
|
||||||
#define AGPGART_VERSION_MAJOR 0
|
#define AGPGART_VERSION_MAJOR 0
|
||||||
#define AGPGART_VERSION_MINOR 102
|
#define AGPGART_VERSION_MINOR 103
|
||||||
static const struct agp_version agp_current_version =
|
static const struct agp_version agp_current_version =
|
||||||
{
|
{
|
||||||
.major = AGPGART_VERSION_MAJOR,
|
.major = AGPGART_VERSION_MAJOR,
|
||||||
|
@ -273,6 +273,10 @@ long compat_agp_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||||||
case AGPIOC_UNBIND32:
|
case AGPIOC_UNBIND32:
|
||||||
ret_val = compat_agpioc_unbind_wrap(curr_priv, (void __user *) arg);
|
ret_val = compat_agpioc_unbind_wrap(curr_priv, (void __user *) arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AGPIOC_CHIPSET_FLUSH32:
|
||||||
|
ret_val = agpioc_chipset_flush_wrap(curr_priv);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ioctl_out:
|
ioctl_out:
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#define AGPIOC_DEALLOCATE32 _IOW (AGPIOC_BASE, 7, compat_int_t)
|
#define AGPIOC_DEALLOCATE32 _IOW (AGPIOC_BASE, 7, compat_int_t)
|
||||||
#define AGPIOC_BIND32 _IOW (AGPIOC_BASE, 8, compat_uptr_t)
|
#define AGPIOC_BIND32 _IOW (AGPIOC_BASE, 8, compat_uptr_t)
|
||||||
#define AGPIOC_UNBIND32 _IOW (AGPIOC_BASE, 9, compat_uptr_t)
|
#define AGPIOC_UNBIND32 _IOW (AGPIOC_BASE, 9, compat_uptr_t)
|
||||||
|
#define AGPIOC_CHIPSET_FLUSH32 _IO (AGPIOC_BASE, 10)
|
||||||
|
|
||||||
struct agp_info32 {
|
struct agp_info32 {
|
||||||
struct agp_version version; /* version of the driver */
|
struct agp_version version; /* version of the driver */
|
||||||
@ -101,5 +102,6 @@ void agp_free_memory_wrap(struct agp_memory *memory);
|
|||||||
struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type);
|
struct agp_memory *agp_allocate_memory_wrap(size_t pg_count, u32 type);
|
||||||
struct agp_memory *agp_find_mem_by_key(int key);
|
struct agp_memory *agp_find_mem_by_key(int key);
|
||||||
struct agp_client *agp_find_client_by_pid(pid_t id);
|
struct agp_client *agp_find_client_by_pid(pid_t id);
|
||||||
|
int agpioc_chipset_flush_wrap(struct agp_file_private *priv);
|
||||||
|
|
||||||
#endif /* _AGP_COMPAT_H */
|
#endif /* _AGP_COMPAT_H */
|
||||||
|
@ -960,6 +960,13 @@ static int agpioc_unbind_wrap(struct agp_file_private *priv, void __user *arg)
|
|||||||
return agp_unbind_memory(memory);
|
return agp_unbind_memory(memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int agpioc_chipset_flush_wrap(struct agp_file_private *priv)
|
||||||
|
{
|
||||||
|
DBG("");
|
||||||
|
agp_flush_chipset(agp_bridge);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int agp_ioctl(struct inode *inode, struct file *file,
|
static int agp_ioctl(struct inode *inode, struct file *file,
|
||||||
unsigned int cmd, unsigned long arg)
|
unsigned int cmd, unsigned long arg)
|
||||||
{
|
{
|
||||||
@ -1033,6 +1040,10 @@ static int agp_ioctl(struct inode *inode, struct file *file,
|
|||||||
case AGPIOC_UNBIND:
|
case AGPIOC_UNBIND:
|
||||||
ret_val = agpioc_unbind_wrap(curr_priv, (void __user *) arg);
|
ret_val = agpioc_unbind_wrap(curr_priv, (void __user *) arg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AGPIOC_CHIPSET_FLUSH:
|
||||||
|
ret_val = agpioc_chipset_flush_wrap(curr_priv);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ioctl_out:
|
ioctl_out:
|
||||||
|
@ -80,6 +80,13 @@ static int agp_get_key(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void agp_flush_chipset(struct agp_bridge_data *bridge)
|
||||||
|
{
|
||||||
|
if (bridge->driver->chipset_flush)
|
||||||
|
bridge->driver->chipset_flush(bridge);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(agp_flush_chipset);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use kmalloc if possible for the page list. Otherwise fall back to
|
* Use kmalloc if possible for the page list. Otherwise fall back to
|
||||||
* vmalloc. This speeds things up and also saves memory for small AGP
|
* vmalloc. This speeds things up and also saves memory for small AGP
|
||||||
|
@ -109,6 +109,7 @@ extern int agp_unbind_memory(struct agp_memory *);
|
|||||||
extern void agp_enable(struct agp_bridge_data *, u32);
|
extern void agp_enable(struct agp_bridge_data *, u32);
|
||||||
extern struct agp_bridge_data *agp_backend_acquire(struct pci_dev *);
|
extern struct agp_bridge_data *agp_backend_acquire(struct pci_dev *);
|
||||||
extern void agp_backend_release(struct agp_bridge_data *);
|
extern void agp_backend_release(struct agp_bridge_data *);
|
||||||
|
extern void agp_flush_chipset(struct agp_bridge_data *);
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _AGP_BACKEND_H */
|
#endif /* _AGP_BACKEND_H */
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#define AGPIOC_DEALLOCATE _IOW (AGPIOC_BASE, 7, int)
|
#define AGPIOC_DEALLOCATE _IOW (AGPIOC_BASE, 7, int)
|
||||||
#define AGPIOC_BIND _IOW (AGPIOC_BASE, 8, struct agp_bind*)
|
#define AGPIOC_BIND _IOW (AGPIOC_BASE, 8, struct agp_bind*)
|
||||||
#define AGPIOC_UNBIND _IOW (AGPIOC_BASE, 9, struct agp_unbind*)
|
#define AGPIOC_UNBIND _IOW (AGPIOC_BASE, 9, struct agp_unbind*)
|
||||||
|
#define AGPIOC_CHIPSET_FLUSH _IO (AGPIOC_BASE, 10)
|
||||||
|
|
||||||
#define AGP_DEVICE "/dev/agpgart"
|
#define AGP_DEVICE "/dev/agpgart"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user