svn commit: r205899 - projects/ppc64/sys/boot/powerpc/ps3
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Tue Mar 30 19:06:54 UTC 2010
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 <machine/pte.h>
+
+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);
}
More information about the svn-src-projects
mailing list