* [PATCH] agp: use scratch page on memory remove and at GATT creation V2
@ 2010-04-20 12:31 glisse
2010-04-20 13:44 ` Ville Syrjälä
2010-04-20 14:57 ` Michel Dänzer
0 siblings, 2 replies; 4+ messages in thread
From: glisse @ 2010-04-20 12:31 UTC (permalink / raw)
To: airlied; +Cc: Jerome Glisse, stable, dri-devel
From: Jerome Glisse <jglisse@redhat.com>
Convert most AGP chipset to use scratch page as default entries.
This help avoiding GPU querying 0 address and trigger computer
fault. With KMS and memory manager we bind/unbind AGP memory
constantly and it seems that some GPU are still doing AGP
traffic even after GPU report being idle with the memory segment.
Tested (radeon GPU KMS + Xorg + compiz + glxgears + quake3) on :
- SIS 1039:0001 & 1039:0003
- Intel 865 8086:2571
Compile tested for other bridges
V2 enable scratch page on uninorth
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Cc: stable <stable@kernel.org>
---
drivers/char/agp/ali-agp.c | 1 +
drivers/char/agp/amd-k7-agp.c | 9 +++++++++
drivers/char/agp/amd64-agp.c | 1 +
drivers/char/agp/ati-agp.c | 8 ++++++++
drivers/char/agp/intel-agp.c | 30 +++++++++++++++++++++++++++---
drivers/char/agp/nvidia-agp.c | 1 +
drivers/char/agp/sis-agp.c | 1 +
drivers/char/agp/uninorth-agp.c | 14 +++++++++++---
drivers/char/agp/via-agp.c | 2 ++
9 files changed, 61 insertions(+), 6 deletions(-)
diff --git a/drivers/char/agp/ali-agp.c b/drivers/char/agp/ali-agp.c
index d2ce68f..fd79351 100644
--- a/drivers/char/agp/ali-agp.c
+++ b/drivers/char/agp/ali-agp.c
@@ -204,6 +204,7 @@ static const struct agp_bridge_driver ali_generic_bridge = {
.aperture_sizes = ali_generic_sizes,
.size_type = U32_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = ali_configure,
.fetch_size = ali_fetch_size,
.cleanup = ali_cleanup,
diff --git a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c
index 73dbf40..cf4dc4c 100644
--- a/drivers/char/agp/amd-k7-agp.c
+++ b/drivers/char/agp/amd-k7-agp.c
@@ -142,6 +142,7 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
{
struct aper_size_info_lvl2 *value;
struct amd_page_map page_dir;
+ unsigned long __iomem *cur_gatt;
unsigned long addr;
int retval;
u32 temp;
@@ -178,6 +179,13 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr)); /* PCI Posting. */
}
+ for (i = 0; i < value->num_entries; i++) {
+ addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr;
+ cur_gatt = GET_GATT(addr);
+ writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr));
+ readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
+ }
+
return 0;
}
@@ -375,6 +383,7 @@ static const struct agp_bridge_driver amd_irongate_driver = {
.aperture_sizes = amd_irongate_sizes,
.size_type = LVL2_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = amd_irongate_configure,
.fetch_size = amd_irongate_fetch_size,
.cleanup = amd_irongate_cleanup,
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c
index fd50ead..73703b1 100644
--- a/drivers/char/agp/amd64-agp.c
+++ b/drivers/char/agp/amd64-agp.c
@@ -210,6 +210,7 @@ static const struct agp_bridge_driver amd_8151_driver = {
.aperture_sizes = amd_8151_sizes,
.size_type = U32_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = amd_8151_configure,
.fetch_size = amd64_fetch_size,
.cleanup = amd64_cleanup,
diff --git a/drivers/char/agp/ati-agp.c b/drivers/char/agp/ati-agp.c
index 3b2ecbe..dc30e22 100644
--- a/drivers/char/agp/ati-agp.c
+++ b/drivers/char/agp/ati-agp.c
@@ -341,6 +341,7 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge)
{
struct aper_size_info_lvl2 *value;
struct ati_page_map page_dir;
+ unsigned long __iomem *cur_gatt;
unsigned long addr;
int retval;
u32 temp;
@@ -395,6 +396,12 @@ static int ati_create_gatt_table(struct agp_bridge_data *bridge)
readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr)); /* PCI Posting. */
}
+ for (i = 0; i < value->num_entries; i++) {
+ addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr;
+ cur_gatt = GET_GATT(addr);
+ writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr));
+ }
+
return 0;
}
@@ -415,6 +422,7 @@ static const struct agp_bridge_driver ati_generic_bridge = {
.aperture_sizes = ati_generic_sizes,
.size_type = LVL2_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = ati_configure,
.fetch_size = ati_fetch_size,
.cleanup = ati_cleanup,
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index b78d5c3..aa4c9bd 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -943,7 +943,7 @@ static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
{
int page_order;
struct aper_size_info_fixed *size;
- int num_entries;
+ int num_entries, i;
u32 temp;
size = agp_bridge->current_size;
@@ -968,6 +968,11 @@ static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
agp_bridge->gatt_bus_addr = temp;
+ for (i = 0; i < num_entries; i++) {
+ writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
+ }
+ readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
+
return 0;
}
@@ -1385,7 +1390,7 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
{
int page_order;
struct aper_size_info_fixed *size;
- int num_entries;
+ int num_entries, i;
u32 temp, temp2;
int gtt_map_size = 256 * 1024;
@@ -1423,6 +1428,11 @@ static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
agp_bridge->gatt_bus_addr = temp;
+ for (i = 0; i < num_entries; i++) {
+ writel(agp_bridge->scratch_page, intel_private.gtt+i);
+ }
+ readl(intel_private.gtt+i-1);
+
return 0;
}
@@ -1493,7 +1503,7 @@ static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
{
int page_order;
struct aper_size_info_fixed *size;
- int num_entries;
+ int num_entries, i;
u32 temp;
int gtt_offset, gtt_size;
@@ -1531,6 +1541,11 @@ static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
agp_bridge->gatt_bus_addr = temp;
+ for (i = 0; i < num_entries; i++) {
+ writel(agp_bridge->scratch_page, intel_private.gtt+i);
+ }
+ readl(intel_private.gtt+i-1);
+
return 0;
}
@@ -1983,6 +1998,7 @@ static const struct agp_bridge_driver intel_generic_driver = {
.aperture_sizes = intel_generic_sizes,
.size_type = U16_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_configure,
.fetch_size = intel_fetch_size,
.cleanup = intel_cleanup,
@@ -2036,6 +2052,7 @@ static const struct agp_bridge_driver intel_815_driver = {
.aperture_sizes = intel_815_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 2,
+ .needs_scratch_page = true,
.configure = intel_815_configure,
.fetch_size = intel_815_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2090,6 +2107,7 @@ static const struct agp_bridge_driver intel_820_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_820_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_820_cleanup,
@@ -2116,6 +2134,7 @@ static const struct agp_bridge_driver intel_830mp_driver = {
.aperture_sizes = intel_830mp_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 4,
+ .needs_scratch_page = true,
.configure = intel_830mp_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2142,6 +2161,7 @@ static const struct agp_bridge_driver intel_840_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_840_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2168,6 +2188,7 @@ static const struct agp_bridge_driver intel_845_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_845_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2195,6 +2216,7 @@ static const struct agp_bridge_driver intel_850_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_850_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2221,6 +2243,7 @@ static const struct agp_bridge_driver intel_860_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_860_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
@@ -2315,6 +2338,7 @@ static const struct agp_bridge_driver intel_7505_driver = {
.aperture_sizes = intel_8xx_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = intel_7505_configure,
.fetch_size = intel_8xx_fetch_size,
.cleanup = intel_8xx_cleanup,
diff --git a/drivers/char/agp/nvidia-agp.c b/drivers/char/agp/nvidia-agp.c
index 7e36d2b..ae92cac 100644
--- a/drivers/char/agp/nvidia-agp.c
+++ b/drivers/char/agp/nvidia-agp.c
@@ -311,6 +311,7 @@ static const struct agp_bridge_driver nvidia_driver = {
.aperture_sizes = nvidia_generic_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 5,
+ .needs_scratch_page = true,
.configure = nvidia_configure,
.fetch_size = nvidia_fetch_size,
.cleanup = nvidia_cleanup,
diff --git a/drivers/char/agp/sis-agp.c b/drivers/char/agp/sis-agp.c
index 6c3837a..b53d5f4 100644
--- a/drivers/char/agp/sis-agp.c
+++ b/drivers/char/agp/sis-agp.c
@@ -125,6 +125,7 @@ static struct agp_bridge_driver sis_driver = {
.aperture_sizes = sis_generic_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 7,
+ .needs_scratch_page = true,
.configure = sis_configure,
.fetch_size = sis_fetch_size,
.cleanup = sis_cleanup,
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c
index d89da4a..f01a8df 100644
--- a/drivers/char/agp/uninorth-agp.c
+++ b/drivers/char/agp/uninorth-agp.c
@@ -27,6 +27,7 @@
*/
static int uninorth_rev;
static int is_u3;
+static u32 scratch_value;
#define DEFAULT_APERTURE_SIZE 256
#define DEFAULT_APERTURE_STRING "256"
@@ -213,8 +214,9 @@ int uninorth_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
return 0;
gp = (u32 *) &agp_bridge->gatt_table[pg_start];
- for (i = 0; i < mem->page_count; ++i)
- gp[i] = 0;
+ for (i = 0; i < mem->page_count; ++i) {
+ gp[i] = scratch_value;
+ }
mb();
uninorth_tlbflush(mem);
@@ -420,8 +422,13 @@ static int uninorth_create_gatt_table(struct agp_bridge_data *bridge)
bridge->gatt_bus_addr = virt_to_phys(table);
+ if (is_u3)
+ scratch_value = (page_to_phys(agp_bridge->scratch_page_page) >> PAGE_SHIFT) | 0x80000000UL;
+ else
+ scratch_value = cpu_to_le32((page_to_phys(agp_bridge->scratch_page_page) & 0xFFFFF000UL) |
+ 0x1UL);
for (i = 0; i < num_entries; i++)
- bridge->gatt_table[i] = 0;
+ bridge->gatt_table[i] = scratch_value;
return 0;
@@ -518,6 +525,7 @@ const struct agp_bridge_driver uninorth_agp_driver = {
.agp_destroy_pages = agp_generic_destroy_pages,
.agp_type_to_mask_type = agp_generic_type_to_mask_type,
.cant_use_aperture = true,
+ .needs_scratch_page = true,
};
const struct agp_bridge_driver u3_agp_driver = {
diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c
index d3bd243..df67e80 100644
--- a/drivers/char/agp/via-agp.c
+++ b/drivers/char/agp/via-agp.c
@@ -175,6 +175,7 @@ static const struct agp_bridge_driver via_agp3_driver = {
.aperture_sizes = agp3_generic_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 10,
+ .needs_scratch_page = true,
.configure = via_configure_agp3,
.fetch_size = via_fetch_size_agp3,
.cleanup = via_cleanup_agp3,
@@ -201,6 +202,7 @@ static const struct agp_bridge_driver via_driver = {
.aperture_sizes = via_generic_sizes,
.size_type = U8_APER_SIZE,
.num_aperture_sizes = 9,
+ .needs_scratch_page = true,
.configure = via_configure,
.fetch_size = via_fetch_size,
.cleanup = via_cleanup,
--
1.7.0.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [PATCH] agp: use scratch page on memory remove and at GATT creation V2
2010-04-20 12:31 [PATCH] agp: use scratch page on memory remove and at GATT creation V2 glisse
@ 2010-04-20 13:44 ` Ville Syrjälä
2010-04-20 14:40 ` Jerome Glisse
2010-04-20 14:57 ` Michel Dänzer
1 sibling, 1 reply; 4+ messages in thread
From: Ville Syrjälä @ 2010-04-20 13:44 UTC (permalink / raw)
To: glisse; +Cc: Jerome Glisse, stable, dri-devel
On Tue, Apr 20, 2010 at 02:31:52PM +0200, glisse@freedesktop.org wrote:
> From: Jerome Glisse <jglisse@redhat.com>
>
> Convert most AGP chipset to use scratch page as default entries.
> This help avoiding GPU querying 0 address and trigger computer
> fault. With KMS and memory manager we bind/unbind AGP memory
> constantly and it seems that some GPU are still doing AGP
> traffic even after GPU report being idle with the memory segment.
>
> Tested (radeon GPU KMS + Xorg + compiz + glxgears + quake3) on :
> - SIS 1039:0001 & 1039:0003
> - Intel 865 8086:2571
>
> Compile tested for other bridges
>
> V2 enable scratch page on uninorth
>
> Signed-off-by: Jerome Glisse <jglisse@redhat.com>
<snip>
> diff --git a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c
> index 73dbf40..cf4dc4c 100644
> --- a/drivers/char/agp/amd-k7-agp.c
> +++ b/drivers/char/agp/amd-k7-agp.c
> @@ -178,6 +179,13 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
> readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr)); /* PCI Posting. */
> }
>
> + for (i = 0; i < value->num_entries; i++) {
> + addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr;
> + cur_gatt = GET_GATT(addr);
> + writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr));
> + readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
> + }
Isn't it enough to do a single PCI posting flush after writing all the
entries?
--
Ville Syrjälä
syrjala@sci.fi
http://www.sci.fi/~syrjala/
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [PATCH] agp: use scratch page on memory remove and at GATT creation V2
2010-04-20 13:44 ` Ville Syrjälä
@ 2010-04-20 14:40 ` Jerome Glisse
0 siblings, 0 replies; 4+ messages in thread
From: Jerome Glisse @ 2010-04-20 14:40 UTC (permalink / raw)
To: glisse, airlied, stable, dri-devel
On Tue, Apr 20, 2010 at 04:44:54PM +0300, Ville Syrjälä wrote:
> On Tue, Apr 20, 2010 at 02:31:52PM +0200, glisse@freedesktop.org wrote:
> > From: Jerome Glisse <jglisse@redhat.com>
> >
> > Convert most AGP chipset to use scratch page as default entries.
> > This help avoiding GPU querying 0 address and trigger computer
> > fault. With KMS and memory manager we bind/unbind AGP memory
> > constantly and it seems that some GPU are still doing AGP
> > traffic even after GPU report being idle with the memory segment.
> >
> > Tested (radeon GPU KMS + Xorg + compiz + glxgears + quake3) on :
> > - SIS 1039:0001 & 1039:0003
> > - Intel 865 8086:2571
> >
> > Compile tested for other bridges
> >
> > V2 enable scratch page on uninorth
> >
> > Signed-off-by: Jerome Glisse <jglisse@redhat.com>
> <snip>
> > diff --git a/drivers/char/agp/amd-k7-agp.c b/drivers/char/agp/amd-k7-agp.c
> > index 73dbf40..cf4dc4c 100644
> > --- a/drivers/char/agp/amd-k7-agp.c
> > +++ b/drivers/char/agp/amd-k7-agp.c
> > @@ -178,6 +179,13 @@ static int amd_create_gatt_table(struct agp_bridge_data *bridge)
> > readl(page_dir.remapped+GET_PAGE_DIR_OFF(addr)); /* PCI Posting. */
> > }
> >
> > + for (i = 0; i < value->num_entries; i++) {
> > + addr = (i * PAGE_SIZE) + agp_bridge->gart_bus_addr;
> > + cur_gatt = GET_GATT(addr);
> > + writel(agp_bridge->scratch_page, cur_gatt+GET_GATT_OFF(addr));
> > + readl(cur_gatt+GET_GATT_OFF(addr)); /* PCI Posting. */
> > + }
>
> Isn't it enough to do a single PCI posting flush after writing all the
> entries?
>
Yes it should be enough but i cut & paste code of each AGP driver for
consistency.
Cheers,
Jerome
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] agp: use scratch page on memory remove and at GATT creation V2
2010-04-20 12:31 [PATCH] agp: use scratch page on memory remove and at GATT creation V2 glisse
2010-04-20 13:44 ` Ville Syrjälä
@ 2010-04-20 14:57 ` Michel Dänzer
1 sibling, 0 replies; 4+ messages in thread
From: Michel Dänzer @ 2010-04-20 14:57 UTC (permalink / raw)
To: glisse; +Cc: Jerome Glisse, stable, dri-devel
On Die, 2010-04-20 at 14:31 +0200, glisse@freedesktop.org wrote:
> From: Jerome Glisse <jglisse@redhat.com>
>
> Convert most AGP chipset to use scratch page as default entries.
> This help avoiding GPU querying 0 address and trigger computer
> fault. With KMS and memory manager we bind/unbind AGP memory
> constantly and it seems that some GPU are still doing AGP
> traffic even after GPU report being idle with the memory segment.
>
> Tested (radeon GPU KMS + Xorg + compiz + glxgears + quake3) on :
> - SIS 1039:0001 & 1039:0003
> - Intel 865 8086:2571
>
> Compile tested for other bridges
>
> V2 enable scratch page on uninorth
>
> Signed-off-by: Jerome Glisse <jglisse@redhat.com>
> Cc: stable <stable@kernel.org>
[...]
> diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c
> index d89da4a..f01a8df 100644
> --- a/drivers/char/agp/uninorth-agp.c
> +++ b/drivers/char/agp/uninorth-agp.c
> @@ -27,6 +27,7 @@
> */
> static int uninorth_rev;
> static int is_u3;
> +static u32 scratch_value;
>
> #define DEFAULT_APERTURE_SIZE 256
> #define DEFAULT_APERTURE_STRING "256"
> @@ -213,8 +214,9 @@ int uninorth_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
> return 0;
>
> gp = (u32 *) &agp_bridge->gatt_table[pg_start];
> - for (i = 0; i < mem->page_count; ++i)
> - gp[i] = 0;
> + for (i = 0; i < mem->page_count; ++i) {
> + gp[i] = scratch_value;
> + }
> mb();
> uninorth_tlbflush(mem);
>
> @@ -420,8 +422,13 @@ static int uninorth_create_gatt_table(struct agp_bridge_data *bridge)
>
> bridge->gatt_bus_addr = virt_to_phys(table);
>
> + if (is_u3)
> + scratch_value = (page_to_phys(agp_bridge->scratch_page_page) >> PAGE_SHIFT) | 0x80000000UL;
> + else
> + scratch_value = cpu_to_le32((page_to_phys(agp_bridge->scratch_page_page) & 0xFFFFF000UL) |
> + 0x1UL);
> for (i = 0; i < num_entries; i++)
> - bridge->gatt_table[i] = 0;
> + bridge->gatt_table[i] = scratch_value;
>
> return 0;
>
> @@ -518,6 +525,7 @@ const struct agp_bridge_driver uninorth_agp_driver = {
> .agp_destroy_pages = agp_generic_destroy_pages,
> .agp_type_to_mask_type = agp_generic_type_to_mask_type,
> .cant_use_aperture = true,
> + .needs_scratch_page = true,
> };
>
> const struct agp_bridge_driver u3_agp_driver = {
The uninorth driver also needs the change below, or no memory can be
bound anymore. With that, it's working on my PowerBook.
diff --git a/drivers/char/agp/uninorth-agp.c b/drivers/char/agp/uninorth-agp.c
index f01a8df..9b26341 100644
--- a/drivers/char/agp/uninorth-agp.c
+++ b/drivers/char/agp/uninorth-agp.c
@@ -172,7 +172,7 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start, int ty
gp = (u32 *) &agp_bridge->gatt_table[pg_start];
for (i = 0; i < mem->page_count; ++i) {
- if (gp[i]) {
+ if (gp[i] != scratch_value) {
dev_info(&agp_bridge->dev->dev,
"uninorth_insert_memory: entry 0x%x occupied (%x)\n",
i, gp[i]);
--
Earthling Michel Dänzer | http://www.vmware.com
Libre software enthusiast | Debian, X and DRI developer
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-04-20 14:57 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-20 12:31 [PATCH] agp: use scratch page on memory remove and at GATT creation V2 glisse
2010-04-20 13:44 ` Ville Syrjälä
2010-04-20 14:40 ` Jerome Glisse
2010-04-20 14:57 ` Michel Dänzer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.