Commit 6ad8540c authored by Dave Jones's avatar Dave Jones Committed by Dave Jones

[AGPGART] Store agp revision in agp_bridge struct.

There are a few places we do spec revision compliance checks, this cset
generalises that function, and removes some duplicated functionality.
parent 9b917d38
...@@ -139,6 +139,8 @@ struct agp_bridge_data { ...@@ -139,6 +139,8 @@ struct agp_bridge_data {
int max_memory_agp; /* in number of pages */ int max_memory_agp; /* in number of pages */
int aperture_size_idx; int aperture_size_idx;
int capndx; int capndx;
char major_version;
char minor_version;
}; };
#define OUTREG64(mmap, addr, val) __raw_writeq((val), (mmap)+(addr)) #define OUTREG64(mmap, addr, val) __raw_writeq((val), (mmap)+(addr))
...@@ -388,8 +390,9 @@ void agp_free_key(int key); ...@@ -388,8 +390,9 @@ void agp_free_key(int key);
int agp_num_entries(void); int agp_num_entries(void);
u32 agp_collect_device_status(u32 mode, u32 command); u32 agp_collect_device_status(u32 mode, u32 command);
void agp_device_command(u32 command, int agp_v3); void agp_device_command(u32 command, int agp_v3);
int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor); int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode);
void global_cache_flush(void); void global_cache_flush(void);
void get_agp_version(struct agp_bridge_data *bridge);
/* Standard agp registers */ /* Standard agp registers */
#define AGPSTAT 0x4 #define AGPSTAT 0x4
......
...@@ -315,13 +315,13 @@ static void agp_3_0_nonisochronous_node_enable(struct agp_bridge_data *bridge, ...@@ -315,13 +315,13 @@ static void agp_3_0_nonisochronous_node_enable(struct agp_bridge_data *bridge,
* Fully configure and enable an AGP 3.0 host bridge and all the devices * Fully configure and enable an AGP 3.0 host bridge and all the devices
* lying behind it. * lying behind it.
*/ */
int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor) int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode)
{ {
struct pci_dev *td = bridge->dev, *dev; struct pci_dev *td = bridge->dev, *dev;
u8 mcapndx; u8 mcapndx;
u32 isoch, arqsz, cal_cycle, tmp, rate; u32 isoch, arqsz, cal_cycle, tmp, rate;
u32 tstatus, tcmd, mcmd, mstatus, ncapid; u32 tstatus, tcmd, mcmd, mstatus, ncapid;
u32 mmajor, mminor; u32 mmajor;
u16 mpstat; u16 mpstat;
struct agp_3_0_dev *dev_list, *cur; struct agp_3_0_dev *dev_list, *cur;
struct list_head *head, *pos; struct list_head *head, *pos;
...@@ -416,8 +416,6 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor) ...@@ -416,8 +416,6 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
} }
mmajor = (ncapid >> AGP_MAJOR_VERSION_SHIFT) & 0xf; mmajor = (ncapid >> AGP_MAJOR_VERSION_SHIFT) & 0xf;
mminor = (ncapid >> AGP_MINOR_VERSION_SHIFT) & 0xf;
if(mmajor < 3) { if(mmajor < 3) {
printk(KERN_ERR PFX "woah! AGP 2.0 device " printk(KERN_ERR PFX "woah! AGP 2.0 device "
"found on the secondary bus of an AGP 3.0 " "found on the secondary bus of an AGP 3.0 "
......
...@@ -446,22 +446,37 @@ void agp_device_command(u32 command, int agp_v3) ...@@ -446,22 +446,37 @@ void agp_device_command(u32 command, int agp_v3)
EXPORT_SYMBOL(agp_device_command); EXPORT_SYMBOL(agp_device_command);
void agp_generic_enable(u32 mode) void get_agp_version(struct agp_bridge_data *bridge)
{ {
u32 command, ncapid, major, minor; u32 ncapid;
/* Exit early if already set by errata workarounds. */
if (agp_bridge->major_version != 0)
return;
pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx, &ncapid); pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx, &ncapid);
major = (ncapid >> 20) & 0xf; agp_bridge->major_version = (ncapid >> AGP_MAJOR_VERSION_SHIFT) & 0xf;
minor = (ncapid >> 16) & 0xf; agp_bridge->minor_version = (ncapid >> AGP_MINOR_VERSION_SHIFT) & 0xf;
printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n",major, minor); }
EXPORT_SYMBOL(get_agp_version);
void agp_generic_enable(u32 mode)
{
u32 command;
get_agp_version(agp_bridge);
printk(KERN_INFO PFX "Found an AGP %d.%d compliant device.\n",
agp_bridge->major_version, agp_bridge->minor_version);
if(major >= 3) { if(agp_bridge->major_version >= 3) {
u32 agp_3_0; u32 agp_3_0;
pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + 0x4, &agp_3_0); pci_read_config_dword(agp_bridge->dev, agp_bridge->capndx + 0x4, &agp_3_0);
/* Check to see if we are operating in 3.0 mode */ /* Check to see if we are operating in 3.0 mode */
if((agp_3_0 >> 3) & 0x1) { if((agp_3_0 >> 3) & 0x1) {
agp_3_0_node_enable(agp_bridge, mode, minor); agp_3_0_node_enable(agp_bridge, mode);
return; return;
} else { } else {
printk (KERN_INFO PFX "not in AGP 3.0 mode, falling back to 2.x\n"); printk (KERN_INFO PFX "not in AGP 3.0 mode, falling back to 2.x\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment