diff options
Diffstat (limited to 'sys/powerpc/include')
-rw-r--r-- | sys/powerpc/include/hid.h | 1 | ||||
-rw-r--r-- | sys/powerpc/include/md_var.h | 2 | ||||
-rw-r--r-- | sys/powerpc/include/sf_buf.h | 43 | ||||
-rw-r--r-- | sys/powerpc/include/spr.h | 42 | ||||
-rw-r--r-- | sys/powerpc/include/vmparam.h | 7 |
5 files changed, 68 insertions, 27 deletions
diff --git a/sys/powerpc/include/hid.h b/sys/powerpc/include/hid.h index d9fd6fe..52e5e62 100644 --- a/sys/powerpc/include/hid.h +++ b/sys/powerpc/include/hid.h @@ -47,6 +47,7 @@ #define HID0_SLEEP 0x00200000 /* Enable sleep mode */ #define HID0_DPM 0x00100000 /* Enable Dynamic power management */ #define HID0_RISEG 0x00080000 /* Read I-SEG */ +#define HID0_TG 0x00040000 /* Timebase Granularity (OEA64) */ #define HID0_BHTCLR 0x00040000 /* Clear branch history table (7450) */ #define HID0_EIEC 0x00040000 /* Enable internal error checking */ #define HID0_XAEN 0x00020000 /* Enable eXtended Addressing (7450) */ diff --git a/sys/powerpc/include/md_var.h b/sys/powerpc/include/md_var.h index c554f5f..709e4a9 100644 --- a/sys/powerpc/include/md_var.h +++ b/sys/powerpc/include/md_var.h @@ -46,6 +46,8 @@ extern u_long ns_per_tick; extern int powerpc_pow_enabled; extern int cacheline_size; +extern int ppc64; +extern int hw_direct_map; void __syncicache(void *, int); diff --git a/sys/powerpc/include/sf_buf.h b/sys/powerpc/include/sf_buf.h index 162f5a6..7ddb981 100644 --- a/sys/powerpc/include/sf_buf.h +++ b/sys/powerpc/include/sf_buf.h @@ -32,33 +32,9 @@ #include <vm/vm.h> #include <vm/vm_param.h> #include <vm/vm_page.h> +#include <machine/md_var.h> #include <sys/queue.h> -#if defined(AIM) -/* - * On this machine, the only purpose for which sf_buf is used is to implement - * an opaque pointer required by the machine-independent parts of the kernel. - * That pointer references the vm_page that is "mapped" by the sf_buf. The - * actual mapping is provided by the direct virtual-to-physical mapping. - */ -struct sf_buf; - -static __inline vm_offset_t -sf_buf_kva(struct sf_buf *sf) -{ - - return (VM_PAGE_TO_PHYS((vm_page_t)sf)); -} - -static __inline vm_page_t -sf_buf_page(struct sf_buf *sf) -{ - - return ((vm_page_t)sf); -} - -#elif defined(E500) - struct vm_page; struct sf_buf { @@ -69,9 +45,22 @@ struct sf_buf { int ref_count; /* usage of this mapping */ }; +/* + * On 32-bit OEA, the only purpose for which sf_buf is used is to implement + * an opaque pointer required by the machine-independent parts of the kernel. + * That pointer references the vm_page that is "mapped" by the sf_buf. The + * actual mapping is provided by the direct virtual-to-physical mapping. + * + * On OEA64 and Book-E, we need to do something a little more complicated. Use + * the runtime-detected hw_direct_map to pick between the two cases. Our + * friends in vm_machdep.c will do the same to ensure nothing gets confused. + */ + static __inline vm_offset_t sf_buf_kva(struct sf_buf *sf) { + if (hw_direct_map) + return (VM_PAGE_TO_PHYS((vm_page_t)sf)); return (sf->kva); } @@ -79,10 +68,10 @@ sf_buf_kva(struct sf_buf *sf) static __inline struct vm_page * sf_buf_page(struct sf_buf *sf) { + if (hw_direct_map) + return ((vm_page_t)sf); return (sf->m); } -#endif - #endif /* !_MACHINE_SF_BUF_H_ */ diff --git a/sys/powerpc/include/spr.h b/sys/powerpc/include/spr.h index 826c2fa..eb07208 100644 --- a/sys/powerpc/include/spr.h +++ b/sys/powerpc/include/spr.h @@ -43,6 +43,44 @@ ( { register_t val; \ __asm __volatile("mfspr %0,%1" : "=r"(val) : "K"(reg)); \ val; } ) + +/* The following routines allow manipulation of the full 64-bit width + * of SPRs on 64 bit CPUs in bridge mode */ + +#define mtspr64(reg,valhi,vallo,scratch) \ + __asm __volatile(" \ + mfmsr %0; \ + insrdi %0,1,1,0; \ + mtmsrd %0; \ + isync; \ + \ + sld %1,%1,%4; \ + or %1,%1,%2; \ + mtspr %3,%1; \ + srd %1,%1,%4; \ + \ + clrldi %0,%0,1; \ + mtmsrd %0; \ + isync;" \ + : "=r"(scratch), "=r"(valhi) : "r"(vallo), "K"(reg), "r"(32)) + +#define mfspr64upper(reg,scratch) \ + ( { register_t val; \ + __asm __volatile(" \ + mfmsr %0; \ + insrdi %0,1,1,0; \ + mtmsrd %0; \ + isync; \ + \ + mfspr %1,%2; \ + srd %1,%1,%3; \ + \ + clrldi %0,%0,1; \ + mtmsrd %0; \ + isync;" \ + : "=r"(scratch), "=r"(val) : "K"(reg), "r"(32)); \ + val; } ) + #endif /* _LOCORE */ /* @@ -112,7 +150,11 @@ #define IBM401E2 0x0025 #define IBM401F2 0x0026 #define IBM401G2 0x0027 +#define IBM970 0x0039 +#define IBM970FX 0x003c #define IBMPOWER3 0x0041 +#define IBM970MP 0x0044 +#define IBM970GX 0x0045 #define MPC860 0x0050 #define MPC8240 0x0081 #define IBM405GP 0x4011 diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h index 489159d..5af62eb 100644 --- a/sys/powerpc/include/vmparam.h +++ b/sys/powerpc/include/vmparam.h @@ -106,6 +106,13 @@ */ #define UMA_MD_SMALL_ALLOC +/* + * On 64-bit systems in bridge mode, we have no direct map, so we fake + * the small_alloc() calls. But we need the VM to be in a reasonable + * state first. + */ +#define UMA_MD_SMALL_ALLOC_NEEDS_VM + #else /* |