Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 30 Mar 2010 19:06:54 +0000 (UTC)
From:      Nathan Whitehorn <nwhitehorn@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r205899 - projects/ppc64/sys/boot/powerpc/ps3
Message-ID:  <201003301906.o2UJ6snJ067055@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003301906.o2UJ6snJ067055>