Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~keithp/linux
[pandora-kernel.git] / arch / sparc / kernel / setup_64.c
index 26d1141..3c5bb78 100644 (file)
@@ -275,24 +275,34 @@ void __init sun4v_patch(void)
 static void __init popc_patch(void)
 {
        struct popc_3insn_patch_entry *p3;
+       struct popc_6insn_patch_entry *p6;
 
        p3 = &__popc_3insn_patch;
        while (p3 < &__popc_3insn_patch_end) {
-               unsigned long addr = p3->addr;
+               unsigned long i, addr = p3->addr;
 
-               *(unsigned int *) (addr +  0) = p3->insns[0];
-               wmb();
-               __asm__ __volatile__("flush     %0" : : "r" (addr +  0));
+               for (i = 0; i < 3; i++) {
+                       *(unsigned int *) (addr +  (i * 4)) = p3->insns[i];
+                       wmb();
+                       __asm__ __volatile__("flush     %0"
+                                            : : "r" (addr +  (i * 4)));
+               }
 
-               *(unsigned int *) (addr +  4) = p3->insns[1];
-               wmb();
-               __asm__ __volatile__("flush     %0" : : "r" (addr +  4));
+               p3++;
+       }
 
-               *(unsigned int *) (addr +  8) = p3->insns[2];
-               wmb();
-               __asm__ __volatile__("flush     %0" : : "r" (addr +  4));
+       p6 = &__popc_6insn_patch;
+       while (p6 < &__popc_6insn_patch_end) {
+               unsigned long i, addr = p6->addr;
 
-               p3++;
+               for (i = 0; i < 6; i++) {
+                       *(unsigned int *) (addr +  (i * 4)) = p6->insns[i];
+                       wmb();
+                       __asm__ __volatile__("flush     %0"
+                                            : : "r" (addr +  (i * 4)));
+               }
+
+               p6++;
        }
 }
 
@@ -430,8 +440,14 @@ static void __init init_sparc64_elf_hwcap(void)
                        cap |= AV_SPARC_VIS;
                if (tlb_type == cheetah || tlb_type == cheetah_plus)
                        cap |= AV_SPARC_VIS | AV_SPARC_VIS2;
-               if (tlb_type == cheetah_plus)
-                       cap |= AV_SPARC_POPC;
+               if (tlb_type == cheetah_plus) {
+                       unsigned long impl, ver;
+
+                       __asm__ __volatile__("rdpr %%ver, %0" : "=r" (ver));
+                       impl = ((ver >> 32) & 0xffff);
+                       if (impl == PANTHER_IMPL)
+                               cap |= AV_SPARC_POPC;
+               }
                if (tlb_type == hypervisor) {
                        if (sun4v_chip_type == SUN4V_CHIP_NIAGARA1)
                                cap |= AV_SPARC_ASI_BLK_INIT;