Re: gpu/drm, x86, PAT: io_mapping_create_wc and resource_size_t

Pallipadi, Venkatesh
2009-03-01T16:53:40Z

On Sun, Mar 01, 2009 at 05:54:53AM -0800, Stefan Lippers-Hollmann wrote:
> Hi
>
> On Samstag, 28. Februar 2009, Linux Kernel Mailing List wrote:
> > Gitweb: http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=4ab0d47d0ab311eb181532c1ecb6d02905685071
> > Commit: 4ab0d47d0ab311eb181532c1ecb6d02905685071
> > Parent: 6644107d57a8fa82b47e4c55da4d9d91a612f29c
> > Author: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> > AuthorDate: Tue Feb 24 17:35:12 2009 -0800
> > Committer: Ingo Molnar <mingo@elte.hu>
> > CommitDate: Wed Feb 25 13:09:51 2009 +0100
> >
> > gpu/drm, x86, PAT: io_mapping_create_wc and resource_size_t
> >
> > io_mapping_create_wc should take a resource_size_t parameter in place of
> > unsigned long. With unsigned long, there will be no way to map greater than 4GB
> > address in i386/32 bit.
> >
> > On x86, greater than 4GB addresses cannot be mapped on i386 without PAE. Return
> > error for such a case.
> >
> > Patch also adds a structure for io_mapping, that saves the base, size and
> > type on HAVE_ATOMIC_IOMAP archs, that can be used to verify the offset on
> > io_mapping_map calls.
> >
> > Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
> > Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com>
> > Cc: Dave Airlie <airlied@redhat.com>
> > Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
> > Cc: Eric Anholt <eric@anholt.net>
> > Cc: Keith Packard <keithp@keithp.com>
> > Signed-off-by: Ingo Molnar <mingo@elte.hu>
>
> This patch, as part of 2.6.29-rc6-git5, fails to build for me on i386 (it
> builds on amd64) with the attached (slimmed down) config (CONFIG_X86_PAT=y)
> and buildlog:
>
> Building modules, stage 2.
> MODPOST 809 modules
> ERROR: "pgprot_writecombine" [drivers/gpu/drm/i915/i915.ko] undefined!
> ERROR: "is_io_mapping_possible" [drivers/gpu/drm/i915/i915.ko] undefined!
> make[1]: *** [__modpost] Error 1
> make: *** [modules] Error 2
>
> This is a build regression in comparison to 2.6.29-rc6.
>

My bad. I had missed drm as module compilation. Below patch should fix it.
Can you please verify.

Thanks,
Venki

Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>

---
arch/x86/mm/iomap_32.c | 1 +
arch/x86/mm/pat.c | 2 ++
include/linux/io-mapping.h | 3 ++-
3 files changed, 5 insertions(+), 1 deletion(-)

Index: linux-2.6/arch/x86/mm/iomap_32.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/iomap_32.c 2009-03-01 08:31:12.000000000 -0800
+++ linux-2.6/arch/x86/mm/iomap_32.c 2009-03-01 08:47:20.000000000 -0800
@@ -37,6 +37,7 @@ is_io_mapping_possible(resource_size_t b
return 1;
}
#endif
+EXPORT_SYMBOL_GPL(is_io_mapping_possible);

/* Map 'pfn' using fixed map 'type' and protections 'prot'
*/
Index: linux-2.6/arch/x86/mm/pat.c
===================================================================
--- linux-2.6.orig/arch/x86/mm/pat.c 2009-03-01 08:31:00.000000000 -0800
+++ linux-2.6/arch/x86/mm/pat.c 2009-03-01 08:45:48.000000000 -0800
@@ -11,6 +11,7 @@
#include <linux/bootmem.h>
#include <linux/debugfs.h>
#include <linux/kernel.h>
+#include <linux/module.h>
#include <linux/gfp.h>
#include <linux/mm.h>
#include <linux/fs.h>
@@ -868,6 +869,7 @@ pgprot_t pgprot_writecombine(pgprot_t pr
else
return pgprot_noncached(prot);
}
+EXPORT_SYMBOL(pgprot_writecombine);

#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_X86_PAT)

Index: linux-2.6/include/linux/io-mapping.h
===================================================================
--- linux-2.6.orig/include/linux/io-mapping.h 2009-03-01 08:31:12.000000000 -0800
+++ linux-2.6/include/linux/io-mapping.h 2009-03-01 08:49:53.000000000 -0800
@@ -91,8 +91,9 @@ io_mapping_unmap_atomic(void *vaddr)
static inline void *
io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset)
{
+ resource_size_t phys_addr;
BUG_ON(offset >= mapping->size);
- resource_size_t phys_addr = mapping->base + offset;
+ phys_addr = mapping->base + offset;
return ioremap_wc(phys_addr, PAGE_SIZE);
}