]> err.no Git - linux-2.6/blobdiff - arch/powerpc/platforms/ps3/spu.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[linux-2.6] / arch / powerpc / platforms / ps3 / spu.c
index d135cef9ed6a91d97eba9a0500213cb8d460df86..ccae3d446b98e575ffa656f58195ecf21a3877e8 100644 (file)
@@ -186,14 +186,24 @@ static void spu_unmap(struct spu *spu)
        iounmap(spu_pdata(spu)->shadow);
 }
 
+/**
+ * setup_areas - Map the spu regions into the address space.
+ *
+ * The current HV requires the spu shadow regs to be mapped with the
+ * PTE page protection bits set as read-only (PP=3).  This implementation
+ * uses the low level __ioremap() to bypass the page protection settings
+ * inforced by ioremap_flags() to get the needed PTE bits set for the
+ * shadow regs.
+ */
+
 static int __init setup_areas(struct spu *spu)
 {
        struct table {char* name; unsigned long addr; unsigned long size;};
+       static const unsigned long shadow_flags = _PAGE_NO_CACHE | 3;
 
-       spu_pdata(spu)->shadow = ioremap_flags(spu_pdata(spu)->shadow_addr,
-                                              sizeof(struct spe_shadow),
-                                              pgprot_val(PAGE_READONLY) |
-                                              _PAGE_NO_CACHE);
+       spu_pdata(spu)->shadow = __ioremap(spu_pdata(spu)->shadow_addr,
+                                          sizeof(struct spe_shadow),
+                                          shadow_flags);
        if (!spu_pdata(spu)->shadow) {
                pr_debug("%s:%d: ioremap shadow failed\n", __func__, __LINE__);
                goto fail_ioremap;