aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Whitehorn <nwhitehorn@FreeBSD.org>2011-12-18 16:53:21 +0000
committerNathan Whitehorn <nwhitehorn@FreeBSD.org>2011-12-18 16:53:21 +0000
commit263b790117fe175573ade8ed170a32d3a0c005f4 (patch)
treee2d647fbf69abcefa5262cfb60e39af68a9ebe6a
parent795c0232aa9c67a4a9b3381e9f2f30699e163ddb (diff)
downloadsrc-263b790117fe175573ade8ed170a32d3a0c005f4.tar.gz
src-263b790117fe175573ade8ed170a32d3a0c005f4.zip
Support infrastructure for X11 on PS3.
Submitted by: geoffrey dot levand at mail dot ru MFC after: 1 week
Notes
Notes: svn path=/head/; revision=228689
-rw-r--r--sys/powerpc/ps3/ps3-hvcall.S26
-rw-r--r--sys/powerpc/ps3/ps3-hvcall.h3
-rw-r--r--sys/powerpc/ps3/ps3-hvcall.master3
-rw-r--r--sys/powerpc/ps3/ps3_syscons.c25
4 files changed, 49 insertions, 8 deletions
diff --git a/sys/powerpc/ps3/ps3-hvcall.S b/sys/powerpc/ps3/ps3-hvcall.S
index 135c60161802..6a992648f7f4 100644
--- a/sys/powerpc/ps3/ps3-hvcall.S
+++ b/sys/powerpc/ps3/ps3-hvcall.S
@@ -1081,13 +1081,25 @@ ASENTRY(lv1_gpu_memory_free)
ASENTRY(lv1_gpu_context_allocate)
mflr %r0
std %r0,16(%r1)
- stdu %r1,-56(%r1)
+ stdu %r1,-88(%r1)
std %r5,48(%r1)
+ std %r6,56(%r1)
+ std %r7,64(%r1)
+ std %r8,72(%r1)
+ std %r9,80(%r1)
li %r11,217
hc
extsw %r3,%r3
ld %r11,48(%r1)
std %r4,0(%r11)
+ ld %r11,56(%r1)
+ std %r5,0(%r11)
+ ld %r11,64(%r1)
+ std %r6,0(%r11)
+ ld %r11,72(%r1)
+ std %r7,0(%r11)
+ ld %r11,80(%r1)
+ std %r8,0(%r11)
ld %r1,0(%r1)
ld %r0,16(%r1)
mtlr %r0
@@ -1144,6 +1156,18 @@ ASENTRY(lv1_gpu_context_intr)
mtlr %r0
blr
+ASENTRY(lv1_gpu_attribute)
+ mflr %r0
+ std %r0,16(%r1)
+ stdu %r1,-48(%r1)
+ li %r11,228
+ hc
+ extsw %r3,%r3
+ ld %r1,0(%r1)
+ ld %r0,16(%r1)
+ mtlr %r0
+ blr
+
ASENTRY(lv1_get_rtc)
mflr %r0
std %r0,16(%r1)
diff --git a/sys/powerpc/ps3/ps3-hvcall.h b/sys/powerpc/ps3/ps3-hvcall.h
index 0875a621015b..c2e45d2baafc 100644
--- a/sys/powerpc/ps3/ps3-hvcall.h
+++ b/sys/powerpc/ps3/ps3-hvcall.h
@@ -124,11 +124,12 @@ int lv1_gpu_device_map(uint64_t dev, uint64_t *lpar_addr, uint64_t *lpar_size);
int lv1_gpu_device_unmap(uint64_t dev);
int lv1_gpu_memory_allocate(uint64_t ddr_size, uint64_t zero1, uint64_t zero2, uint64_t zero3, uint64_t zero4, uint64_t *handle, uint64_t *ddr_lpar);
int lv1_gpu_memory_free(uint64_t handle);
-int lv1_gpu_context_allocate(uint64_t handle, uint64_t , uint64_t *zero);
+int lv1_gpu_context_allocate(uint64_t handle, uint64_t flags, uint64_t *chandle, uint64_t *lpar_dma_control, uint64_t *lpar_driver_info, uint64_t *lpar_reports, uint64_t *lpar_reports_size);
int lv1_gpu_context_free(uint64_t chandle);
int lv1_gpu_context_iomap(uint64_t changle, uint64_t gpu_ioif, uint64_t xdr_lpar, uint64_t fbsize, uint64_t ioflags);
int lv1_gpu_context_attribute(uint64_t chandle, uint64_t op, uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4);
int lv1_gpu_context_intr(uint64_t chandle, uint64_t *v1);
+int lv1_gpu_attribute(uint64_t p1, uint64_t p2, uint64_t p3, uint64_t p4, uint64_t p5);
int lv1_get_rtc(uint64_t *rtc_val, uint64_t *timebase);
int lv1_storage_read(uint64_t dev, uint64_t region, uint64_t sector, uint64_t nsectors, uint64_t flags, uint64_t buf, uint64_t *dma_tag);
int lv1_storage_write(uint64_t dev, uint64_t region, uint64_t sector, uint64_t nsectors, uint64_t flags, uint64_t buf, uint64_t *dma_tag);
diff --git a/sys/powerpc/ps3/ps3-hvcall.master b/sys/powerpc/ps3/ps3-hvcall.master
index a9abe9455a68..d4b7a0a5990d 100644
--- a/sys/powerpc/ps3/ps3-hvcall.master
+++ b/sys/powerpc/ps3/ps3-hvcall.master
@@ -125,11 +125,12 @@ HVCALL 212 lv1_gpu_device_map dev lpar_addr,lpar_size
HVCALL 213 lv1_gpu_device_unmap dev
HVCALL 214 lv1_gpu_memory_allocate ddr_size,zero1,zero2,zero3,zero4 handle,ddr_lpar
HVCALL 216 lv1_gpu_memory_free handle
-HVCALL 217 lv1_gpu_context_allocate handle, zero chandle,lpar_dma_control,lpar_driver_info,lpar_reports,lpar_reports_size
+HVCALL 217 lv1_gpu_context_allocate handle,flags chandle,lpar_dma_control,lpar_driver_info,lpar_reports,lpar_reports_size
HVCALL 218 lv1_gpu_context_free chandle
HVCALL 221 lv1_gpu_context_iomap changle,gpu_ioif,xdr_lpar,fbsize,ioflags
HVCALL 225 lv1_gpu_context_attribute chandle,op,p1,p2,p3,p4
HVCALL 227 lv1_gpu_context_intr chandle v1
+HVCALL 228 lv1_gpu_attribute p1,p2,p3,p4,p5
HVCALL 232 lv1_get_rtc UNUSED rtc_val,timebase
HVCALL 245 lv1_storage_read dev,region,sector,nsectors,flags,buf dma_tag
HVCALL 246 lv1_storage_write dev,region,sector,nsectors,flags,buf dma_tag
diff --git a/sys/powerpc/ps3/ps3_syscons.c b/sys/powerpc/ps3/ps3_syscons.c
index e0e9cc82ea8b..c53c275b118e 100644
--- a/sys/powerpc/ps3/ps3_syscons.c
+++ b/sys/powerpc/ps3/ps3_syscons.c
@@ -121,6 +121,13 @@ struct ps3fb_softc {
u_char *sc_font;
int sc_font_height;
+
+ uint64_t sc_fbhandle;
+ uint64_t sc_fbcontext;
+ uint64_t sc_dma_control;
+ uint64_t sc_driver_info;
+ uint64_t sc_reports;
+ uint64_t sc_reports_size;
};
static video_switch_t ps3fbvidsw = {
@@ -276,8 +283,10 @@ ps3fb_configure(int flags)
void
ps3fb_remap(void)
{
+ struct ps3fb_softc *sc;
vm_offset_t va, fb_paddr;
- uint64_t fbhandle, fbcontext;
+
+ sc = &ps3fb_softc;
lv1_gpu_close();
lv1_gpu_open(0);
@@ -290,12 +299,13 @@ ps3fb_remap(void)
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(PS3FB_SIZE, 0, 0, 0, 0, &fbhandle, &fb_paddr);
- lv1_gpu_context_allocate(fbhandle, 0, &fbcontext);
+ lv1_gpu_memory_allocate(PS3FB_SIZE, 0, 0, 0, 0, &sc->sc_fbhandle, &fb_paddr);
+ lv1_gpu_context_allocate(sc->sc_fbhandle, 0, &sc->sc_fbcontext, &sc->sc_dma_control,
+ &sc->sc_driver_info, &sc->sc_reports, &sc->sc_reports_size);
- lv1_gpu_context_attribute(fbcontext,
+ lv1_gpu_context_attribute(sc->sc_fbcontext,
L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0);
- lv1_gpu_context_attribute(fbcontext,
+ lv1_gpu_context_attribute(sc->sc_fbcontext,
L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0);
for (va = 0; va < PS3FB_SIZE; va += PAGE_SIZE)
@@ -405,6 +415,11 @@ ps3fb_set_mode(video_adapter_t *adp, int mode)
ps3fb_blank_display(&sc->sc_va, V_DISPLAY_ON);
+ lv1_gpu_context_attribute(sc->sc_fbcontext,
+ L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0);
+ lv1_gpu_context_attribute(sc->sc_fbcontext,
+ L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0);
+
return (0);
}