X-Authentication-Warning: cassiopeia.home: geert owned process doing -bs
Date: Sat, 11 Oct 1997 20:29:05 +0200 (MET DST)
From: Geert Uytterhoeven <Geert.Uytterhoeven@cs.kuleuven.ac.be>
To: Linux/m68k <linux-m68k@phil.uni-sb.de>
Subject: L68K: Graphics MMIO
Sender: owner-linux-m68k@phil.uni-sb.de
X-Mime-Autoconverted: from 8bit to quoted-printable by faui45.informatik.uni-erlangen.de id UAA14137


This is a first attempt in making the MMIO (memory mapped I/O) registers of
graphics accelerators available to user space (e.g. the X server) in a clean
way. Cyberfb.c already had a kludge to provide a similar thing by always
announcing 16 MB of frame buffer memory.

Note that this will break the accelerated CV64 X server (as far as it still
worked).

Other things:

  - The cache mode comments where no longer in sync with the actual code.
    No-caching, serialized is the correct mode for frame buffers and mmio,
    isn't it?

  - What to do with the caching on non-m68k? I thought the frame buffer code
    was already architecture clean, but this doesn't seem to be the case...

Caveat: untested due to the lack of any graphics board.

Disclaimer: ideas by Jes Sørensen :-)

--- linux-2.1.57/include/linux/fb.h.orig	Fri Oct  3 22:46:06 1997
+++ linux-2.1.57/include/linux/fb.h	Sat Oct 11 15:43:58 1997
@@ -49,7 +49,9 @@
 	__u16 ypanstep;			/* zero if no hardware panning  */
 	__u16 ywrapstep;		/* zero if no hardware ywrap    */
 	__u32 line_length;		/* length of a line in bytes    */
-	__u16 reserved[9];		/* Reserved for future compatibility */
+	char *mmio_start;		/* Start of Memory Mapped I/O   */
+	__u32 mmio_len;			/* Length of Memory Mapped I/O  */
+	__u16 reserved[5];		/* Reserved for future compatibility */
 };
 
 struct fb_bitfield {
--- linux-2.1.57/drivers/char/fbmem.c.orig	Fri Oct  3 22:46:05 1997
+++ linux-2.1.57/drivers/char/fbmem.c	Sat Oct 11 20:01:53 1997
@@ -312,20 +312,38 @@
 {
 	struct fb_ops *fb = registered_fb[GET_FB_IDX(file->f_dentry->d_inode->i_rdev)]->fbops;
 	struct fb_fix_screeninfo fix;
+	char *start;
+	unsigned long len;
 
 	if (! fb)
 		return -ENODEV;
 	fb->fb_get_fix(&fix, PROC_CONSOLE());
-	if ((vma->vm_end - vma->vm_start + vma->vm_offset) > fix.smem_len)
+	if (vma->vm_offset < fix.smem_len) {
+		/* frame buffer memory */
+		start = fix.smem_start;
+		len = fix.smem_len;
+	} else {
+		/* memory mapped io */
+		start = fix.mmio_start;
+		len = fix.mmio_len;
+		vma->vm_offset -= fix.smem_len;
+	}
+	if ((vma->vm_end - vma->vm_start + vma->vm_offset) > len)
 		return -EINVAL;
-	vma->vm_offset += __pa(fix.smem_start);
+	vma->vm_offset += __pa(start);
 	if (vma->vm_offset & ~PAGE_MASK)
 		return -ENXIO;
+#ifdef __mc68000__
+	if (CPU_IS_020_OR_030)
+		pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE030;
 	if (CPU_IS_040_OR_060) {
 		pgprot_val(vma->vm_page_prot) &= _CACHEMASK040;
-		/* Use write-through cache mode */
+		/* Use no-cache mode, serialized */
 		pgprot_val(vma->vm_page_prot) |= _PAGE_NOCACHE_S;
 	}
+#else
+#warning What do we have to do here??
+#endif
 	if (remap_page_range(vma->vm_start, vma->vm_offset,
 			     vma->vm_end - vma->vm_start, vma->vm_page_prot))
 		return -EAGAIN;
--- linux-2.1.57/drivers/video/cyberfb.c.orig	Fri Oct  3 22:44:18 1997
+++ linux-2.1.57/drivers/video/cyberfb.c	Sat Oct 11 20:16:35 1997
@@ -337,8 +337,6 @@
 
 	memset ((char*)CyberMem, 0, CYBER8_WIDTH * CYBER8_HEIGHT);
 
-	CyberRegs = (char*) (CyberMem + 0x00c00000);
-
 	/* Disable hardware cursor */
 	*(CyberRegs + S3_CRTC_ADR)  = S3_REG_LOCK2;
 	*(CyberRegs + S3_CRTC_DATA) = 0xa0;
@@ -393,11 +391,9 @@
 
 	strcpy(fix->id, Cyber_fb_name);
 	fix->smem_start = (caddr_t)CyberMem;
-#if 0
 	fix->smem_len = CyberSize;
-#else
-	fix->smem_len = 0x01000000;
-#endif
+	fix->mmio_start = (caddr_t)CyberRegs;
+	fix->mmio_len = 0x10000;
 
 	fix->type = FB_TYPE_PACKED_PIXELS;
 	fix->type_aux = 0;
@@ -1005,6 +1001,7 @@
 	/* This includes the video memory as well as the S3 register set */
 	CyberMem = kernel_map (board_addr + 0x01400000, 0x01000000,
 			       KERNELMAP_NOCACHE_SER, &mem_start);
+	CyberRegs = (char*) (CyberMem + 0x00c00000);
 
 	fbhw = &Cyber_switch;
 
--- linux-2.1.57/drivers/video/retz3fb.c.orig	Fri Oct  3 22:46:06 1997
+++ linux-2.1.57/drivers/video/retz3fb.c	Sat Oct 11 20:25:04 1997
@@ -874,6 +874,8 @@
 	strcpy(fix->id, retz3_fb_name);
 	fix->smem_start = (char *)z3_fbmem;
 	fix->smem_len = z3_size;
+	fix->mmio_start = (char *)z3_regs;
+	fix->mmio_len = 0x00c00000;
 
 	fix->type = FB_TYPE_PACKED_PIXELS;
 	fix->type_aux = 0;

Greetings,

						Geert

--
Geert Uytterhoeven                     Geert.Uytterhoeven@cs.kuleuven.ac.be
Wavelets, Linux/{m68k~Amiga,PPC~CHRP}  http://www.cs.kuleuven.ac.be/~geert/
Department of Computer Science -- Katholieke Universiteit Leuven -- Belgium

