5e015d0ba8484e0b002eda18b136ddefe2e12736
* Copyright (c) 1992 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
* %sccs.include.redist.c%
* from: $Hdr: fb.c,v 4.300 91/06/27 20:43:06 root Rel41 $ SONY
* @(#)fb.c 7.1 (Berkeley) %G%
#include "../include/fix_machine_type.h"
#include "../include/pte.h"
#include "../include/cpu.h"
#include "../iop/framebuf.h"
#include "../iop/fbreg.h"
#include "../iodev/ioptohb.h"
#include "../hbdev/hbvar.h"
#define ipc_phys(x) (caddr_t)((int)(x))
#define ipc_log(x) (caddr_t)((int)(x) | 0x80000000)
#define iop_driver hb_driver
#define iop_device hb_device
#include "../iop/iopvar.h"
#include "../ipc/newsipc.h"
#define ipc_phys(x) K0_TT0(x)
#define ipc_log(x) TT0_K0(x)
#define ipc_phys(x) (caddr_t)((int)(x) & ~0x80000000)
#define ipc_log(x) (caddr_t)((int)(x) | 0x80000000)
static int port_fb
, port_fb_iop
;
int fbprobe(), fbattach();
struct iop_device
*fbinfo
[NFB
];
struct iop_driver fbdriver
=
{ fbprobe
, 0, fbattach
, 0, 0, "fb", fbinfo
, "fbc", 0, 0 };
{ fbprobe
, 0, fbattach
, 0, "fb", fbinfo
};
static struct fb_softc fb_softc
[NFB
];
static struct fbreg fbreg
[NFB
];
static struct fbreg
*last_fb
;
static char *devname
[] = {
static void fblock(), fbunlock(), fbreset();
#include "../mrx/h/ipc.h"
# define FB_ADDR &IPC_ARG(&ipc_block, ARG_CPU, 4)
# define FB_ADDR &IPC_ARG(&ipc_block, ARG_CPU0, 4)
typedef struct fbreg
*fbregp
;
wakeup((caddr_t
)&fb_waiting
);
while (*(volatile fbregp
*)FB_ADDR
) {
sleep((caddr_t
)&fb_waiting
, FBPRI
);
*(volatile fbregp
*)FB_ADDR
=
(volatile fbregp
)ipc_phys(MACH_UNCACHED_TO_CACHED(fbp
));
(volatile fbregp
)ipc_phys(fbp
);
register struct fbreg
*fbp
;
msg_send(port_fb_iop
, port_fb
, fbp
, sizeof(*fbp
), MSG_INDIRECT
);
sleep((caddr_t
)fbreg
, FBPRI
);
msg_recv(arg
, NULL
, NULL
, NULL
, 0);
clean_dcache((caddr_t
)last_fb
, sizeof(struct fbreg
));
} else if (fbstate
& FB_DELAY
) {
} else if (fbstate
& FB_DELAY2
) {
fbstate
&= ~(FB_BUSY
|FB_DELAY2
);
if (fbstate
& FB_WANTED
) {
wakeup((caddr_t
)&fbstate
);
#endif /* USE_RAW_INTR */
register int unit
= ii
->ii_unit
;
register struct fb_softc
*fb
= &fb_softc
[unit
];
#if defined(IPC_MRX) && defined(mips)
register struct fbreg
*fbp
=
(struct fbreg
*)MACH_CACHED_TO_UNCACHED(&fbreg
[unit
]);
register struct fbreg
*fbp
= &fbreg
[unit
];
register_hb_intr2(rop_xint
, ii
->ii_unit
, ii
->ii_intr
);
register_ipcintr(4, Xfb_intr
);
port_fb_iop
= object_query("framebuf");
port_fb
= port_create("@port_fb", fbcint
, -1);
fbp
->fb_command
= FB_CPROBE
;
if ((fb
->fbs_device
= fbp
->fb_data
) == -1)
register int unit
= ii
->ii_unit
;
register struct fb_softc
*fb
= &fb_softc
[unit
];
#if defined(IPC_MRX) && defined(mips)
register struct fbreg
*fbp
=
(struct fbreg
*)MACH_CACHED_TO_UNCACHED(&fbreg
[unit
]);
register struct fbreg
*fbp
= &fbreg
[unit
];
fbp
->fb_command
= FB_CATTACH
;
fbp
->fb_device
= fb
->fbs_device
;
fb
->fbs_type
= fbp
->fb_scrtype
;
(fb
->fbs_type
.type
< sizeof(devname
)/sizeof(*devname
))
? devname
[fb
->fbs_type
.type
] : "UNKNOWN");
printf(" (%d x %d %d plane)\n",
fb
->fbs_type
.visiblerect
.extent
.x
,
fb
->fbs_type
.visiblerect
.extent
.y
,
register int unit
= FBUNIT(dev
);
register struct fb_softc
*fb
= &fb_softc
[unit
];
register struct iop_device
*ii
;
#if defined(IPC_MRX) && defined(mips)
register struct fbreg
*fbp
=
(struct fbreg
*)MACH_CACHED_TO_UNCACHED(&fbreg
[unit
]);
register struct fbreg
*fbp
= &fbreg
[unit
];
if (unit
>= NFB
|| (ii
= fbinfo
[unit
]) == 0 || ii
->ii_alive
== 0)
if (fb
->fbs_flag
&& !FBVIDEO(dev
))
if (fb
->fbs_state
== 0) {
fbp
->fb_device
= fb
->fbs_device
;
fb
->fbs_state
|= FBVIDEO(dev
) ? VIDEO_USED
: FB_USED
;
register int unit
= FBUNIT(dev
);
register struct fb_softc
*fb
= &fb_softc
[unit
];
register struct iop_device
*ii
;
#if defined(IPC_MRX) && defined(mips)
register struct fbreg
*fbp
=
(struct fbreg
*)MACH_CACHED_TO_UNCACHED(&fbreg
[unit
]);
register struct fbreg
*fbp
= &fbreg
[unit
];
if (unit
>= NFB
|| (ii
= fbinfo
[unit
]) == 0 || ii
->ii_alive
== 0)
fb
->fbs_state
&= ~(FBVIDEO(dev
) ? VIDEO_USED
: FB_USED
);
if (fb
->fbs_state
== 0) {
fbp
->fb_device
= fb
->fbs_device
;
fbioctl(dev
, cmd
, data
, flag
)
register int unit
= FBUNIT(dev
);
register struct fb_softc
*fb
= &fb_softc
[unit
];
register struct iop_device
*ii
;
#if defined(IPC_MRX) && defined(mips)
register struct fbreg
*fbp
=
(struct fbreg
*)MACH_CACHED_TO_UNCACHED(&fbreg
[unit
]);
register struct fbreg
*fbp
= &fbreg
[unit
];
if (unit
>= NFB
|| (ii
= fbinfo
[unit
]) == 0 || ii
->ii_alive
== 0)
fbp
->fb_device
= fb
->fbs_device
;
fbp
->fb_command
= FB_CAUTODIM
;
fbp
->fb_data
= *((int *)data
);
fbp
->fb_command
= FB_CSETDIM
;
fbp
->fb_data
= *((int*)data
);
fbp
->fb_command
= FB_CGETDIM
;
*((int*)data
) = fbp
->fb_data
;
error
= fbbitblt(fbp
, (sBitblt
*)data
);
error
= fbnbitblt(fbp
, (lBitblt
*)data
, UIO_USERSPACE
);
error
= fbbatchbitblt(fbp
, (sBatchBitblt
*)data
, UIO_USERSPACE
);
error
= fbnbatchbitblt(fbp
, (lBatchBitblt
*)data
, UIO_USERSPACE
);
error
= fbtilebitblt(fbp
, (sTileBitblt
*)data
);
error
= fbntilebitblt(fbp
, (lTileBitblt
*)data
);
error
= fbbitblt3(fbp
, (sBitblt3
*)data
);
error
= fbnbitblt3(fbp
, (lBitblt3
*)data
);
error
= fbpolyline(fbp
, (sPrimLine
*)data
, 0);
error
= fbnpolyline(fbp
, (lPrimLine
*)data
, 0, UIO_USERSPACE
);
error
= fbpolyline(fbp
, (sPrimLine
*)data
, 1);
error
= fbnpolyline(fbp
, (lPrimLine
*)data
, 1, UIO_USERSPACE
);
error
= fbpolymarker(fbp
, (sPrimMarker
*)data
);
error
= fbnpolymarker(fbp
, (lPrimMarker
*)data
, UIO_USERSPACE
);
error
= fbrectangle(fbp
, (sPrimRect
*)data
);
error
= fbnrectangle(fbp
, (lPrimRect
*)data
);
error
= fbfillscan(fbp
, (sPrimFill
*)data
);
error
= fbnfillscan(fbp
, (lPrimFill
*)data
, UIO_USERSPACE
);
error
= fbtext(fbp
, (sPrimText
*)data
);
error
= fbntext(fbp
, (lPrimText
*)data
);
error
= fbpolydot(fbp
, (sPrimDot
*)data
);
error
= fbnpolydot(fbp
, (lPrimDot
*)data
, UIO_USERSPACE
);
fbgetscrtype(fbp
, (sScrType
*)data
);
fbp
->fb_command
= FB_CGETSCRTYPE
;
*((lScrType
*)data
) = fbp
->fb_scrtype
;
fbsetpalette(fbp
, (sPalette
*)data
);
error
= fbnsetpalette(fbp
, (lPalette
*)data
);
fbgetpalette(fbp
, (sPalette
*)data
);
error
= fbngetpalette(fbp
, (lPalette
*)data
);
fbsetcursor(fbp
, (sCursor
*)data
);
fbnsetcursor(fbp
, (lCursor
*)data
);
fbp
->fb_command
= FB_CSETCURSOR
;
fbp
->fb_cursor
= *((lCursor2
*)data
);
fbp
->fb_command
= FB_CUNSETCURSOR
;
fbp
->fb_command
= FB_CUNSETCURSOR
;
fbp
->fb_command
= FB_CSHOWCURSOR
;
fbp
->fb_command
= FB_CSHOWCURSOR
;
fbp
->fb_command
= FB_CHIDECURSOR
;
fbp
->fb_command
= FB_CHIDECURSOR
;
fbsetxy(fbp
, (sPoint
*)data
);
fbp
->fb_command
= FB_CSETXY
;
fbp
->fb_point
= *((lPoint
*)data
);
case FBIOCNSETPALETTEMODE
:
fbp
->fb_command
= FB_CSETPMODE
;
fbp
->fb_data
= *((int*)data
);
case FBIOCNGETPALETTEMODE
:
fbp
->fb_command
= FB_CGETPMODE
;
*((int*)data
) = fbp
->fb_data
;
fbp
->fb_command
= FB_CSETVIDEO
;
fbp
->fb_videoctl
= *((lVideoCtl
*)data
);
fbp
->fb_command
= FB_CGETVIDEO
;
fbp
->fb_videostatus
.request
= VIDEO_STATUS
;
*((lVideoStatus
*)data
) = fbp
->fb_videostatus
;
fbp
->fb_command
= FB_CIOCTL
;
fbp
->fb_fbioctl
= *((lFbIoctl
*)data
);
*((lFbIoctl
*)data
) = fbp
->fb_fbioctl
;
if (fbp
->fb_result
== FB_RERROR
)
register int unit
= FBUNIT(dev
);
register struct fb_softc
*fb
= &fb_softc
[unit
];
register struct iop_device
*ii
;
register struct fbreg
*fbp
= &fbreg
[unit
];
if (unit
>= NFB
|| (ii
= fbinfo
[unit
]) == 0 || ii
->ii_alive
== 0)
fbp
->fb_device
= fb
->fbs_device
;
fbp
->fb_command
= FB_CGETPAGE
;
if (fbp
->fb_result
== FB_RERROR
)
fbunlock(fbp
->fb_result
);
while (fbstate
& FB_BUSY
) {
sleep((caddr_t
)&fbstate
, FBPRI
);
if (fbstate
& FB_WANTED
) {
wakeup((caddr_t
)&fbstate
);
if (fbstate
& FB_WANTED
) {
wakeup((caddr_t
)&fbstate
);
if (error
|| (fbstate
& FB_DELAY
) == 0) {
fbstate
&= ~(FB_BUSY
| FB_WAIT
| FB_DELAY
);
if (fbstate
& FB_WANTED
) {
wakeup((caddr_t
)&fbstate
);
if (fbstate
& FB_DELAY
) {
fbp
->fb_command
= FB_COPEN
;
if (fbp
->fb_result
!= FB_ROK
) {
fbp
->fb_command
= FB_CUNSETCURSOR
;
fbp
->fb_command
= FB_CUNSETCURSOR
;
fbp
->fb_command
= FB_CCLOSE
;