From owner-svn-src-projects@FreeBSD.ORG Tue Mar 30 19:06:54 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A83D1106568D; Tue, 30 Mar 2010 19:06:54 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 970C58FC1B; Tue, 30 Mar 2010 19:06:54 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o2UJ6sxS067060; Tue, 30 Mar 2010 19:06:54 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2UJ6snJ067055; Tue, 30 Mar 2010 19:06:54 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201003301906.o2UJ6snJ067055@svn.freebsd.org> From: Nathan Whitehorn Date: Tue, 30 Mar 2010 19:06:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r205899 - projects/ppc64/sys/boot/powerpc/ps3 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 30 Mar 2010 19:06:54 -0000 Author: nwhitehorn Date: Tue Mar 30 19:06:54 2010 New Revision: 205899 URL: http://svn.freebsd.org/changeset/base/205899 Log: Bring up the MMU and set up the framebuffer. Now I can make a chunk of my screen red, and printf() is soon to follow. Much easier than debugging by rebooting, which it turns out isn't even reliable! Modified: projects/ppc64/sys/boot/powerpc/ps3/lv1call.S projects/ppc64/sys/boot/powerpc/ps3/lv1call.h projects/ppc64/sys/boot/powerpc/ps3/main.c projects/ppc64/sys/boot/powerpc/ps3/ps3mmu.c Modified: projects/ppc64/sys/boot/powerpc/ps3/lv1call.S ============================================================================== --- projects/ppc64/sys/boot/powerpc/ps3/lv1call.S Tue Mar 30 19:06:37 2010 (r205898) +++ projects/ppc64/sys/boot/powerpc/ps3/lv1call.S Tue Mar 30 19:06:54 2010 (r205899) @@ -2,61 +2,94 @@ #define hc .long 0x44000022 -.global lv1_get_logical_pu_id -lv1_get_logical_pu_id: +#define LD64_IM(r, highest, higher, high, low) \ + lis r,highest; \ + addi r,r,higher; \ + sldi r,r,32; \ + addis r,r,high; \ + addi r,r,low; + +.global lv1_get_physmem +lv1_get_physmem: mflr %r0 stw %r0,4(%r1) + stw %r3,-8(%r1) /* Address for maxmem */ - stw %r3,-4(%r1) - li %r11,69 + li %r11,69 /* Get PU ID */ + hc + std %r4,-16(%r1) + + li %r11,74 /* Get LPAR ID */ + hc + std %r4,-24(%r1) + + ld %r3,-24(%r1) + LD64_IM(%r4,0x0000,0x0000,0x6269,0x0000 /* "bi" */) + LD64_IM(%r5,0x7075,0x0000,0x0000,0x0000 /* "pu" */) + ld %r6,-16(%r1) + LD64_IM(%r7,0x726d,0x5f73,0x697a,0x6500 /* "rm_size" */) + li %r11,91 hc extsw %r3,%r3 - lwz %r5,-4(%r1) + + lwz %r5,-8(%r1) std %r4,0(%r5) - + lwz %r0,4(%r1) mtlr %r0 blr - -.global lv1_get_logical_partition_id -lv1_get_logical_partition_id: + +.global lv1_setup_address_space +lv1_setup_address_space: mflr %r0 stw %r0,4(%r1) stw %r3,-4(%r1) - li %r11,74 + stw %r4,-8(%r1) + + li %r3,18 /* PT size: log2(256 KB) */ + li %r4,2 /* Two page sizes */ + li %r5,24 /* Page sizes: (24 << 56) | (16 << 48) */ + sldi %r5,%r5,24 + li %r6,16 + sldi %r6,%r6,16 + or %r5,%r5,%r6 + sldi %r5,%r5,32 + + li %r11,2 /* lv1_construct_virtual_address_space */ + hc + + lwz %r6,-4(%r1) + lwz %r7,-8(%r1) + std %r4,0(%r6) + std %r5,0(%r7) + + /* AS_ID in r4 */ + mr %r3,%r4 + li %r11,7 /* lv1_select_virtual_address_space */ hc extsw %r3,%r3 - lwz %r5,-4(%r1) - std %r4,0(%r5) - + lwz %r0,4(%r1) mtlr %r0 blr -.global lv1_insert_htab_entry -lv1_insert_htab_entry: +.global lv1_insert_pte +lv1_insert_pte: mflr %r0 stw %r0,4(%r1) - /* Zero high-order bits of arguments */ + mr %r11,%r4 /* Save R4 */ + clrldi %r3,%r3,32 - clrldi %r4,%r4,32 - clrldi %r5,%r5,32 - clrldi %r6,%r6,32 - clrldi %r7,%r7,32 - clrldi %r8,%r8,32 - clrldi %r9,%r9,32 - clrldi %r10,%r10,32 - /* Move high 32 bits of args 3 and 4 into position */ - sldi %r5,%r5,32 - or %r5,%r5,%r6 - sldi %r6,%r7,32 - or %r6,%r6,%r8 - /* Shift remaining args in */ - mr %r7,%r9 - mr %r8,%r10 + clrldi %r7,%r5,32 + sldi %r4,%r3,3 /* Convert ptegidx into base PTE slot */ + li %r3,0 /* Current address space */ + ld %r5,0(%r11) + ld %r6,8(%r11) + li %r8,0 /* No other flags */ + li %r11,158 hc extsw %r3,%r3 @@ -65,62 +98,85 @@ lv1_insert_htab_entry: mtlr %r0 blr -.global lv1_construct_virtual_address_space -lv1_construct_virtual_address_space: +.global lv1_panic +lv1_panic: mflr %r0 stw %r0,4(%r1) - stwu %r1,-16(%r1) - stw %r7,8(%r1) - stw %r8,12(%r1) - - clrldi %r3,%r3,32 - clrldi %r4,%r4,32 - clrldi %r5,%r5,32 - clrldi %r6,%r6,32 - sldi %r5,%r5,32 - or %r5,%r5,%r6 - li %r11,2 + li %r11,255 hc extsw %r3,%r3 - lwz %r7,8(%r1) - lwz %r8,12(%r1) - std %r4,0(%r7) - std %r5,0(%r8) - lwz %r1,0(%r1) + lwz %r0,4(%r1) + mtlr %r0 + blr + +.global lv1_gpu_open +lv1_gpu_open: + mflr %r0 + stw %r0,4(%r1) + + li %r11,210 + hc + extsw %r3,%r3 lwz %r0,4(%r1) mtlr %r0 blr -.global lv1_select_virtual_address_space -lv1_select_virtual_address_space: +.global lv1_gpu_context_attribute +lv1_gpu_context_attribute: mflr %r0 stw %r0,4(%r1) - clrldi %r3,%r3,32 - clrldi %r4,%r4,32 + li %r11,225 + hc + extsw %r3,%r3 + + lwz %r0,4(%r1) + mtlr %r0 + blr + +.global lv1_gpu_context_allocate +lv1_gpu_context_allocate: + mflr %r0 + stw %r0,4(%r1) + stw %r7,-4(%r1) + sldi %r3,%r3,32 - or %r3,%r3,%r4 + clrldi %r4,%r4,32 + ori %r3,%r3,%r4 + clrldi %r4,%r5,32 + clrldi %r5,%r6,32 - li %r11,7 + li %r11,217 hc extsw %r3,%r3 + + lwz %r7,-4(%r1) + std %r4,0(%r7) + lwz %r0,4(%r1) mtlr %r0 blr - -.global lv1_panic -lv1_panic: + +.global lv1_gpu_memory_allocate +lv1_gpu_memory_allocate: mflr %r0 stw %r0,4(%r1) + stw %r8,-4(%r1) + stw %r9,-8(%r1) - li %r11,255 + li %r11,214 hc extsw %r3,%r3 + lwz %r8,-4(%r1) + lwz %r9,-8(%r1) + std %r4,0(%r8) + std %r5,0(%r9) + lwz %r0,4(%r1) mtlr %r0 blr - + Modified: projects/ppc64/sys/boot/powerpc/ps3/lv1call.h ============================================================================== --- projects/ppc64/sys/boot/powerpc/ps3/lv1call.h Tue Mar 30 19:06:37 2010 (r205898) +++ projects/ppc64/sys/boot/powerpc/ps3/lv1call.h Tue Mar 30 19:06:54 2010 (r205899) @@ -26,15 +26,24 @@ #ifndef _PS3_LV1CALL_H #define _PS3_LV1CALL_H -int lv1_get_logical_pu_id(uint64_t *puid); -int lv1_get_logical_partition_id(uint64_t *puid); -int lv1_insert_htab_entry(register_t htab_id, register_t ptegidx, - uint64_t pte_hi, uint64_t pte_lo, register_t lockflags, - register_t flags); -int lv1_construct_virtual_address_space(int htab_size, int npgsizes, - uint64_t page_sizes, uint64_t *as_id, uint64_t *ptsize); -int lv1_select_virtual_address_space(uint64_t as); +#include + +int lv1_get_physmem(uint64_t *maxmem); +int lv1_setup_address_space(uint64_t *as_id, uint64_t *ptsize); +int lv1_insert_pte(u_int ptegidx, struct lpte *pte, int lockflags); int lv1_panic(int reboot); +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET 0x0100 +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC 0x0101 +#define L1GPU_DISPLAY_SYNC_HSYNC 1 +#define L1GPU_DISPLAY_SYNC_VSYNC 2 +#define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP 0x0102 + +int lv1_gpu_open(int); +int lv1_gpu_context_attribute(int context, int op, int, int, int, int); +int lv1_gpu_memory_allocate(int size, int, int, int, int, uint64_t *handle, + uint64_t *paddr); +int lv1_gpu_context_allocate(uint64_t handle, int, uint64_t *context); + #endif Modified: projects/ppc64/sys/boot/powerpc/ps3/main.c ============================================================================== --- projects/ppc64/sys/boot/powerpc/ps3/main.c Tue Mar 30 19:06:37 2010 (r205898) +++ projects/ppc64/sys/boot/powerpc/ps3/main.c Tue Mar 30 19:06:54 2010 (r205899) @@ -30,25 +30,52 @@ __FBSDID("$FreeBSD: head/sys/boot/powerp #include "bootstrap.h" #include "lv1call.h" - int mambocall(int, ...); - __asm(".text; .globl mambocall; mambocall: .long 0x000EAEB0; blr"); - #define mambo_print(a) mambocall(0,a,strlen(a)); - struct arch_switch archsw; int ps3mmu_init(int maxmem); +uint64_t fb_paddr = 0; +uint32_t *fb_vaddr; + int -main(void) +fb_init(void) { - int maxmem = 16*1024*1024; - uint64_t puid, lpar_id; + uint64_t fbhandle, fbcontext; + + lv1_gpu_open(0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, + 0,0,0,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET, + 0,0,1,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, + 0,L1GPU_DISPLAY_SYNC_VSYNC,0,0); + lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, + 1,L1GPU_DISPLAY_SYNC_VSYNC,0,0); + lv1_gpu_memory_allocate(16*1024*1024, 0, 0, 0, 0, &fbhandle, &fb_paddr); + lv1_gpu_context_allocate(fbhandle, 0, &fbcontext); + + lv1_gpu_context_attribute(fbcontext, + L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0); + lv1_gpu_context_attribute(fbcontext, + L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0); +} - lv1_get_logical_pu_id(&puid); - lv1_get_logical_partition_id(&lpar_id); +int +main(void) +{ + int i = 0; + uint64_t maxmem = 0; + lv1_get_physmem(&maxmem); + + fb_init(); ps3mmu_init(maxmem); - mambo_print("Hello world\n"); + + /* Turn the top of the screen red */ + for (i = 0; i < 81920; i++) + fb_vaddr[i] = 0x00ff0000; + + while (1) {} return (0); } Modified: projects/ppc64/sys/boot/powerpc/ps3/ps3mmu.c ============================================================================== --- projects/ppc64/sys/boot/powerpc/ps3/ps3mmu.c Tue Mar 30 19:06:37 2010 (r205898) +++ projects/ppc64/sys/boot/powerpc/ps3/ps3mmu.c Tue Mar 30 19:06:54 2010 (r205899) @@ -43,7 +43,10 @@ __FBSDID("$FreeBSD: head/sys/boot/powerp register_t pteg_count, pteg_mask; uint64_t as_id; -void +extern uint64_t fb_paddr; +extern uint32_t *fb_vaddr; + +int ps3mmu_map(uint64_t va, uint64_t pa) { struct lpte pt; @@ -57,7 +60,7 @@ ps3mmu_map(uint64_t va, uint64_t pa) vsid = 0; } else { pt.pte_hi = 0; - pt.pte_lo = LPTE_I | LPTE_G; + pt.pte_lo = LPTE_I | LPTE_G | LPTE_M | LPTE_NOEXEC; shift = ADDR_PIDX_SHFT; vsid = 1; } @@ -70,8 +73,7 @@ ps3mmu_map(uint64_t va, uint64_t pa) pt.pte_hi |= LPTE_LOCKED | LPTE_VALID; ptegidx &= pteg_mask; - lv1_insert_htab_entry(0, ptegidx * 8, pt.pte_hi, pt.pte_lo, - LPTE_LOCKED, 0); + return (lv1_insert_pte(ptegidx, &pt, LPTE_LOCKED)); } int @@ -80,21 +82,22 @@ ps3mmu_init(int maxmem) uint64_t ptsize; int i; - lv1_construct_virtual_address_space(18 /* log2 256 KB */, 2, - (24ULL << 56) | (16ULL << 48), &as_id, &ptsize); + i = lv1_setup_address_space(&as_id, &ptsize); pteg_count = ptsize / sizeof(struct lpteg); pteg_mask = pteg_count - 1; - lv1_select_virtual_address_space(as_id); - for (i = 0; i < maxmem; i += 16*1024*1024) ps3mmu_map(i,i); + for (i = 0; i < 16*1024*1024; i += 4096) + ps3mmu_map(0x10000000 + i, fb_paddr + i); + fb_vaddr = (uint32_t *)0x10000000; + __asm __volatile ("slbia; slbmte %0, %1; slbmte %2,%3" :: "r"((0 << SLBV_VSID_SHIFT) | SLBV_L), "r"(0 | SLBE_VALID), "r"(1 << SLBV_VSID_SHIFT), - "r"((0xf << SLBE_ESID_SHIFT) | SLBE_VALID | 1)); + "r"((1 << SLBE_ESID_SHIFT) | SLBE_VALID | 1)); - mtmsr(mfmsr() | PSL_IR | PSL_DR); + mtmsr(mfmsr() | PSL_IR | PSL_DR | PSL_RI | PSL_ME); }