From: Jon Smirl <jonsmirl@gmail.com>
To: "Antonino A. Daplas" <adaplas@gmail.com>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>,
Linux Frame Buffer Device Development
<linux-fbdev-devel@lists.sourceforge.net>
Subject: Re: mono, gray and index configs
Date: Thu, 11 Aug 2005 15:14:21 -0400 [thread overview]
Message-ID: <9e47339105081112142c67e1a8@mail.gmail.com> (raw)
In-Reply-To: <42FB8C29.4070503@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 970 bytes --]
Here's a new version that actually lets me set all possible scanout
configs on radeonfb. I can even set I4 but I don't think the code is
correct for it yet everywhere in radeonfb. The core code in the patch
should be ok. My further changes should be restricted to the radeonfb
code. For example, I haven't added the logic to radeonfb to "round up"
to the next config.
You get two new sysfs attributes:
configs - optional, but really nice to have, list of all configs
supported by the driver
config - current config the hardware is set to.
example syntax...
[root@jonsmirl fb0]# cat configs
I4
I8
A1R5G5B5
R5G6B5
R8G8B8
A8R8G8B8
A4R4G4B4
A8I8
A2R10G10B10
Offsets are computed from the field widths. So if a card sets BGR vs
RGB and you cat its config you will see RGB or BGR in the config
string. M is used for a grayscale field.
So give the patch a try and start expanding it to handle other cards.
--
Jon Smirl
jonsmirl@gmail.com
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: snap.diff --]
[-- Type: text/x-diff; name="snap.diff", Size: 18091 bytes --]
diff --git a/drivers/video/aty/radeon_accel.c b/drivers/video/aty/radeon_accel.c
--- a/drivers/video/aty/radeon_accel.c
+++ b/drivers/video/aty/radeon_accel.c
@@ -48,7 +48,7 @@ static void radeonfb_prim_fillrect(struc
rinfo->dp_gui_master_cntl /* contains, like GMC_DST_32BPP */
| GMC_BRUSH_SOLID_COLOR
| ROP3_P);
- if (radeon_get_dstbpp(rinfo->depth) != DST_8BPP)
+ if ((rinfo->format == PIX_WIDTH_I4) || (rinfo->format == PIX_WIDTH_I8) || (rinfo->format == PIX_WIDTH_A8I8))
OUTREG(DP_BRUSH_FRGD_CLR, rinfo->pseudo_palette[region->color]);
else
OUTREG(DP_BRUSH_FRGD_CLR, region->color);
@@ -252,8 +252,6 @@ void radeonfb_engine_reset(struct radeon
void radeonfb_engine_init (struct radeonfb_info *rinfo)
{
- unsigned long temp;
-
/* disable 3D engine */
OUTREG(RB3D_CNTL, 0);
@@ -287,8 +285,7 @@ void radeonfb_engine_init (struct radeon
OUTREG(DEFAULT_SC_BOTTOM_RIGHT, (DEFAULT_SC_RIGHT_MAX |
DEFAULT_SC_BOTTOM_MAX));
- temp = radeon_get_dstbpp(rinfo->depth);
- rinfo->dp_gui_master_cntl = ((temp << 8) | GMC_CLR_CMP_CNTL_DIS);
+ rinfo->dp_gui_master_cntl = ((rinfo->format << 8) | GMC_CLR_CMP_CNTL_DIS);
radeon_fifo_wait (1);
OUTREG(DP_GUI_MASTER_CNTL, (rinfo->dp_gui_master_cntl |
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c
--- a/drivers/video/aty/radeon_base.c
+++ b/drivers/video/aty/radeon_base.c
@@ -722,99 +722,124 @@ static int radeonfb_check_var (struct fb
{
struct radeonfb_info *rinfo = info->par;
struct fb_var_screeninfo v;
- int nom, den;
+ int nom = 0, den = 0;
unsigned int pitch;
if (radeon_match_mode(rinfo, &v, var))
return -EINVAL;
+ v.red.offset = v.green.offset = v.blue.offset = 0;
+ v.red.length = v.blue.length = 0;
+ v.transp.offset = v.transp.length = 0;
+
switch (v.bits_per_pixel) {
- case 0 ... 8:
- v.bits_per_pixel = 8;
+ case 4:
+ nom = 1;
+ den = 2;
+ v.red.length = v.green.length = v.blue.length = 4;
+ rinfo->format = PIX_WIDTH_I4;
+ break;
+ case 8:
+ nom = den = 1;
+ v.red.length = v.green.length = v.blue.length = 8;
+ rinfo->format = PIX_WIDTH_I8;
+ break;
+ case 16:
+ nom = 2;
+ den = 1;
+ switch (v.green.length) {
+ case 4:
+ v.transp.offset = 12;
+ v.red.offset = 8;
+ v.green.offset = v.red.length = v.blue.length = v.transp.length = 4;
+ rinfo->format = PIX_WIDTH_A4R4B4G4;
break;
- case 9 ... 16:
- v.bits_per_pixel = 16;
+ case 5:
+ v.red.offset = 10;
+ v.green.offset = 5;
+ v.transp.offset = 15;
+ v.red.length = v.blue.length = 5;
+ v.transp.length = 1;
+ rinfo->format = PIX_WIDTH_A1R5G5B5;
break;
- case 17 ... 24:
-#if 0 /* Doesn't seem to work */
- v.bits_per_pixel = 24;
+ case 6:
+ v.red.offset = 11;
+ v.green.offset = 5;
+ v.red.length = 5;
+ v.blue.length = 5;
+ rinfo->format = PIX_WIDTH_R5G6B5;
break;
-#endif
- return -EINVAL;
- case 25 ... 32:
- v.bits_per_pixel = 32;
+ case 0:
+ case 8:
+ v.transp.offset = 8;
+ v.red.length = v.green.length = v.blue.length = 8;
+ v.transp.length = 8;
+ rinfo->format = PIX_WIDTH_A8I8;
break;
default:
- return -EINVAL;
- }
-
- switch (var_to_depth(&v)) {
- case 8:
- nom = den = 1;
- v.red.offset = v.green.offset = v.blue.offset = 0;
- v.red.length = v.green.length = v.blue.length = 8;
- v.transp.offset = v.transp.length = 0;
- break;
- case 15:
- nom = 2;
- den = 1;
- v.red.offset = 10;
- v.green.offset = 5;
- v.blue.offset = 0;
- v.red.length = v.green.length = v.blue.length = 5;
- v.transp.offset = v.transp.length = 0;
+ goto err;
+ }
+ break;
+ case 24:
+ nom = 3;
+ den = 1;
+ v.red.offset = 16;
+ v.green.offset = 8;
+ v.blue.offset = 0;
+ v.red.length = v.blue.length = v.green.length = 8;
+ rinfo->format = PIX_WIDTH_R8B8G8;
+ break;
+ case 32:
+ nom = 4;
+ den = 1;
+ switch (v.green.length) {
+ case 10:
+ v.red.offset = 20;
+ v.green.offset = 10;
+ v.transp.offset = 30;
+ v.blue.length = v.red.length = 10;
+ v.transp.length = 2;
+ rinfo->format = PIX_WIDTH_A2R10G10B10;
break;
- case 16:
- nom = 2;
- den = 1;
- v.red.offset = 11;
- v.green.offset = 5;
- v.blue.offset = 0;
- v.red.length = 5;
- v.green.length = 6;
- v.blue.length = 5;
- v.transp.offset = v.transp.length = 0;
- break;
- case 24:
- nom = 4;
- den = 1;
- v.red.offset = 16;
- v.green.offset = 8;
- v.blue.offset = 0;
- v.red.length = v.blue.length = v.green.length = 8;
- v.transp.offset = v.transp.length = 0;
- break;
- case 32:
- nom = 4;
- den = 1;
- v.red.offset = 16;
- v.green.offset = 8;
- v.blue.offset = 0;
- v.red.length = v.blue.length = v.green.length = 8;
- v.transp.offset = 24;
- v.transp.length = 8;
- break;
- default:
- printk ("radeonfb: mode %dx%dx%d rejected, color depth invalid\n",
- var->xres, var->yres, var->bits_per_pixel);
- return -EINVAL;
- }
+ case 0:
+ case 8:
+ v.red.offset = 16;
+ v.green.offset = 8;
+ v.transp.offset = 24;
+ v.blue.length = v.red.length = 8;
+ v.transp.length = 8;
+ rinfo->format = PIX_WIDTH_A8R8G8B8;
+ break;
+ default:
+ goto err;
+ }
+ break;
+ default:
+err:
+ printk ("radeonfb: mode %dx%dx%d rejected, color depth invalid\n",
+ var->xres, var->yres, var->bits_per_pixel);
+ return -EINVAL;
+ }
if (v.yres_virtual < v.yres)
v.yres_virtual = v.yres;
if (v.xres_virtual < v.xres)
v.xres_virtual = v.xres;
-
/* XXX I'm adjusting xres_virtual to the pitch, that may help XFree
* with some panels, though I don't quite like this solution
*/
- if (rinfo->info->flags & FBINFO_HWACCEL_DISABLED) {
+ if (rinfo->info->flags & FBINFO_HWACCEL_DISABLED) {
v.xres_virtual = v.xres_virtual & ~7ul;
} else {
- pitch = ((v.xres_virtual * ((v.bits_per_pixel + 1) / 8) + 0x3f)
- & ~(0x3f)) >> 6;
- v.xres_virtual = (pitch << 6) / ((v.bits_per_pixel + 1) / 8);
+ if (v.bits_per_pixel < 8) {
+ pitch = ((v.xres_virtual * (v.bits_per_pixel / 2) + 0x3f) & ~(0x3f)) >> 6;
+ v.xres_virtual = (pitch << 6) * 2;
+ } else {
+ pitch = ((v.xres_virtual * ((v.bits_per_pixel + 1) / 8) + 0x3f)
+ & ~(0x3f)) >> 6;
+ v.xres_virtual = (pitch << 6) / ((v.bits_per_pixel + 1) / 8);
+ }
}
if (((v.xres_virtual * v.yres_virtual * nom) / den) > rinfo->mapped_vram)
@@ -824,21 +849,20 @@ static int radeonfb_check_var (struct fb
v.xres = v.xres_virtual;
if (v.xoffset < 0)
- v.xoffset = 0;
- if (v.yoffset < 0)
- v.yoffset = 0;
-
- if (v.xoffset > v.xres_virtual - v.xres)
- v.xoffset = v.xres_virtual - v.xres - 1;
-
- if (v.yoffset > v.yres_virtual - v.yres)
- v.yoffset = v.yres_virtual - v.yres - 1;
-
- v.red.msb_right = v.green.msb_right = v.blue.msb_right =
- v.transp.offset = v.transp.length =
- v.transp.msb_right = 0;
-
- memcpy(var, &v, sizeof(v));
+ v.xoffset = 0;
+ if (v.yoffset < 0)
+ v.yoffset = 0;
+
+ if (v.xoffset > v.xres_virtual - v.xres)
+ v.xoffset = v.xres_virtual - v.xres - 1;
+
+ if (v.yoffset > v.yres_virtual - v.yres)
+ v.yoffset = v.yres_virtual - v.yres - 1;
+
+ v.red.msb_right = v.green.msb_right = v.blue.msb_right =
+ v.transp.msb_right = 0;
+
+ memcpy(var, &v, sizeof(v));
return 0;
}
@@ -1554,7 +1578,7 @@ static int radeonfb_set_par(struct fb_in
int nopllcalc = 0;
int hsync_start, hsync_fudge, bytpp, hsync_wid, vsync_wid;
int primary_mon = PRIMARY_MONITOR(rinfo);
- int depth = var_to_depth(mode);
+ int depth = mode->bits_per_pixel;
int use_rmx = 0;
newmode = kmalloc(sizeof(struct radeon_regs), GFP_KERNEL);
@@ -1630,7 +1654,7 @@ static int radeonfb_set_par(struct fb_in
cSync = mode->sync & FB_SYNC_COMP_HIGH_ACT ? (1 << 4) : 0;
- format = radeon_get_dstbpp(depth);
+ format = rinfo->format;
bytpp = mode->bits_per_pixel >> 3;
if ((primary_mon == MT_DFP) || (primary_mon == MT_LCD))
@@ -1676,11 +1700,19 @@ static int radeonfb_set_par(struct fb_in
if (!(info->flags & FBINFO_HWACCEL_DISABLED)) {
/* We first calculate the engine pitch */
- rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
+ if (mode->bits_per_pixel < 8) {
+ rinfo->pitch = ((mode->xres_virtual / 2 + 0x3f)
& ~(0x3f)) >> 6;
- /* Then, re-multiply it to get the CRTC pitch */
- newmode->crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
+ /* Then, re-multiply it to get the CRTC pitch */
+ newmode->crtc_pitch = (rinfo->pitch << 3) * 2;
+ } else {
+ rinfo->pitch = ((mode->xres_virtual * ((mode->bits_per_pixel + 1) / 8) + 0x3f)
+ & ~(0x3f)) >> 6;
+
+ /* Then, re-multiply it to get the CRTC pitch */
+ newmode->crtc_pitch = (rinfo->pitch << 3) / ((mode->bits_per_pixel + 1) / 8);
+ }
} else
newmode->crtc_pitch = (mode->xres_virtual >> 3);
@@ -1859,6 +1891,10 @@ static int radeonfb_set_par(struct fb_in
return 0;
}
+char *radeonfb_getconfigs(struct fb_info *info)
+{
+ return "I4\nI8\nA1R5G5B5\nR5G6B5\nR8G8B8\nA8R8G8B8\nA4R4G4B4\nA8I8\nA2R10G10B10\n";
+}
static struct fb_ops radeonfb_ops = {
.owner = THIS_MODULE,
@@ -1873,6 +1909,7 @@ static struct fb_ops radeonfb_ops = {
.fb_fillrect = radeonfb_fillrect,
.fb_copyarea = radeonfb_copyarea,
.fb_imageblit = radeonfb_imageblit,
+ .fb_get_configs = radeonfb_getconfigs,
};
diff --git a/drivers/video/aty/radeonfb.h b/drivers/video/aty/radeonfb.h
--- a/drivers/video/aty/radeonfb.h
+++ b/drivers/video/aty/radeonfb.h
@@ -328,6 +328,7 @@ struct radeonfb_info {
u32 dp_gui_master_cntl;
struct pll_info pll;
+ unsigned int format; /* format of the scanout buffer */
int mtrr_hdl;
@@ -511,29 +512,6 @@ static inline int round_div(int num, int
return (num + (den / 2)) / den;
}
-static inline int var_to_depth(const struct fb_var_screeninfo *var)
-{
- if (var->bits_per_pixel != 16)
- return var->bits_per_pixel;
- return (var->green.length == 5) ? 15 : 16;
-}
-
-static inline u32 radeon_get_dstbpp(u16 depth)
-{
- switch (depth) {
- case 8:
- return DST_8BPP;
- case 15:
- return DST_15BPP;
- case 16:
- return DST_16BPP;
- case 32:
- return DST_32BPP;
- default:
- return 0;
- }
-}
-
/*
* 2D Engine helper routines
*/
diff --git a/drivers/video/fbsysfs.c b/drivers/video/fbsysfs.c
--- a/drivers/video/fbsysfs.c
+++ b/drivers/video/fbsysfs.c
@@ -15,6 +15,7 @@
* are converted to use it a sysfsification will open OOPSable races.
*/
+#include <linux/ctype.h>
#include <linux/kernel.h>
#include <linux/fb.h>
#include <linux/console.h>
@@ -190,6 +191,127 @@ static ssize_t show_modes(struct class_d
return i;
}
+static ssize_t store_config(struct class_device *class_device, const char * buf,
+ size_t count)
+{
+ struct fb_info *fb_info =
+ (struct fb_info *)class_get_devdata(class_device);
+ int err;
+ char c, *y;
+ const char *x = buf;
+ unsigned int field = 0, bpp = 0;
+ struct fb_var_screeninfo var;
+
+ var = fb_info->var;
+ while (x < buf + count) {
+ x++;
+ field = simple_strtoul(x, &y, 10);
+ x = y;
+ bpp += field;
+ }
+ if (!bpp)
+ return -EINVAL;
+ var.bits_per_pixel = bpp;
+
+ x = buf;
+ while (x < buf + count) {
+ c = *x++;
+ field = simple_strtoul(x, &y, 10);
+ x = y;
+ bpp -= field;
+ switch (toupper(c)) {
+ case 'A':
+ var.transp.length = field;
+ var.transp.offset = bpp;
+ break;
+ case 'M':
+ var.grayscale = 1;
+ /* fall through */
+ case 'I':
+ var.red.length = var.green.length = var.blue.length = field;
+ var.red.offset = var.green.offset = var.blue.offset = 0;
+ break;
+ case 'R':
+ var.red.length = field;
+ var.red.offset = bpp;
+ break;
+ case 'G':
+ var.green.length = field;
+ var.green.offset = bpp;
+ break;
+ case 'B':
+ var.blue.length = field;
+ var.blue.offset = bpp;
+ break;
+ }
+ }
+ if ((err = activate(fb_info, &var)))
+ return err;
+
+ return count;
+}
+
+static ssize_t show_config(struct class_device *class_device, char *buf)
+{
+ struct fb_info *fb_info =
+ (struct fb_info *)class_get_devdata(class_device);
+ int i, off, count;
+ char field[4][10];
+
+ count = off = 0;
+ buf[0] = '\n';
+
+ for (i = 0; i < 4; i++) {
+ field[i][0] = '\0';
+ if ((off == 0) && ((fb_info->var.red.offset == 0) &&
+ (fb_info->var.blue.offset == 0) && (fb_info->var.green.offset == 0))) {
+ snprintf(&field[i][0], sizeof(field[0]), "I%d", fb_info->var.red.length);
+ off += fb_info->var.red.length;
+ continue;
+ }
+ if ((fb_info->var.red.offset == off) && (fb_info->var.red.length != 0)) {
+ snprintf(&field[i][0], sizeof(field[0]), "R%d", fb_info->var.red.length);
+ off += fb_info->var.red.length;
+ continue;
+ }
+ if ((fb_info->var.green.offset == off) && (fb_info->var.green.length != 0)) {
+ snprintf(&field[i][0], sizeof(field[0]), "G%d", fb_info->var.green.length);
+ off += fb_info->var.green.length;
+ continue;
+ }
+ if ((fb_info->var.blue.offset == off) && (fb_info->var.blue.length != 0)) {
+ snprintf(&field[i][0], sizeof(field[0]), "B%d", fb_info->var.blue.length);
+ off += fb_info->var.blue.length;
+ continue;
+ }
+ if ((fb_info->var.transp.offset == off) && (fb_info->var.transp.length != 0)) {
+ snprintf(&field[i][0], sizeof(field[0]), "A%d", fb_info->var.transp.length);
+ off += fb_info->var.transp.length;
+ continue;
+ }
+ }
+ for (i = 3; i >= 0; i--)
+ if (field[i][0] != '\0')
+ count += snprintf(&buf[count], PAGE_SIZE - count, "%s", &field[i][0]);
+
+ if (count)
+ count += snprintf(&buf[count], PAGE_SIZE - count, "\n");
+ return count;
+}
+
+static ssize_t show_configs(struct class_device *class_device, char *buf)
+{
+ struct fb_info *fb_info =
+ (struct fb_info *)class_get_devdata(class_device);
+ int count = 0;
+
+ if (fb_info->fbops->fb_get_configs) {
+ strncpy(buf, fb_info->fbops->fb_get_configs(fb_info), PAGE_SIZE);
+ count = strlen(buf);
+ }
+ return count;
+}
+
static ssize_t store_bpp(struct class_device *class_device, const char * buf,
size_t count)
{
@@ -355,32 +477,6 @@ static ssize_t show_blank(struct class_d
return 0;
}
-static ssize_t store_console(struct class_device *class_device,
- const char * buf, size_t count)
-{
-// struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
- return 0;
-}
-
-static ssize_t show_console(struct class_device *class_device, char *buf)
-{
-// struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
- return 0;
-}
-
-static ssize_t store_cursor(struct class_device *class_device,
- const char * buf, size_t count)
-{
-// struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
- return 0;
-}
-
-static ssize_t show_cursor(struct class_device *class_device, char *buf)
-{
-// struct fb_info *fb_info = (struct fb_info *)class_get_devdata(class_device);
- return 0;
-}
-
static ssize_t store_pan(struct class_device *class_device, const char * buf,
size_t count)
{
@@ -425,10 +521,10 @@ static struct class_device_attribute cla
__ATTR(bits_per_pixel, S_IRUGO|S_IWUSR, show_bpp, store_bpp),
__ATTR(blank, S_IRUGO|S_IWUSR, show_blank, store_blank),
__ATTR(color_map, S_IRUGO|S_IWUSR, show_cmap, store_cmap),
- __ATTR(console, S_IRUGO|S_IWUSR, show_console, store_console),
- __ATTR(cursor, S_IRUGO|S_IWUSR, show_cursor, store_cursor),
__ATTR(mode, S_IRUGO|S_IWUSR, show_mode, store_mode),
__ATTR(modes, S_IRUGO|S_IWUSR, show_modes, store_modes),
+ __ATTR(config, S_IRUGO|S_IWUSR, show_config, store_config),
+ __ATTR(configs, S_IRUGO|S_IWUSR, show_configs, NULL),
__ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan),
__ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual),
__ATTR(name, S_IRUGO, show_name, NULL),
diff --git a/include/linux/fb.h b/include/linux/fb.h
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -598,6 +598,10 @@ struct fb_ops {
/* perform fb specific mmap */
int (*fb_mmap)(struct fb_info *info, struct file *file, struct vm_area_struct *vma);
+
+ /* Get allowable configs */
+ char * (*fb_get_configs) (struct fb_info *info);
+
};
#ifdef CONFIG_FB_TILEBLITTING
diff --git a/include/video/radeon.h b/include/video/radeon.h
--- a/include/video/radeon.h
+++ b/include/video/radeon.h
@@ -800,6 +800,18 @@
#define DST_X_LEFT_TO_RIGHT_S 0x80000000
+/* CRTC_PIC_WIDTH constants */
+#define PIX_WIDTH_I4 0x00000001
+#define PIX_WIDTH_I8 0x00000002
+#define PIX_WIDTH_A1R5G5B5 0x00000003
+#define PIX_WIDTH_R5G6B5 0x00000004
+#define PIX_WIDTH_R8B8G8 0x00000005
+#define PIX_WIDTH_A8R8G8B8 0x00000006
+#define PIX_WIDTH_A4R4B4G4 0x00000007
+#define PIX_WIDTH_A8I8 0x00000008
+#define PIX_WIDTH_A2R10G10B10 0x00000009
+
+
/* DP_DATATYPE bit constants */
#define DST_8BPP 0x00000002
#define DST_15BPP 0x00000003
next prev parent reply other threads:[~2005-08-11 19:14 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-11 3:21 mono, gray and index configs Jon Smirl
2005-08-11 5:36 ` Antonino A. Daplas
2005-08-11 8:22 ` Geert Uytterhoeven
2005-08-11 11:08 ` Antonino Daplas
2005-08-11 11:49 ` Geert Uytterhoeven
2005-08-11 17:34 ` Antonino A. Daplas
2005-08-11 19:14 ` Jon Smirl [this message]
2005-08-20 1:13 ` Jon Smirl
2005-08-20 2:56 ` Antonino A. Daplas
2005-08-20 3:09 ` Jon Smirl
2005-08-22 10:17 ` Geert Uytterhoeven
2005-08-22 13:30 ` Richard Smith
2005-08-22 14:06 ` Geert Uytterhoeven
2005-08-22 14:36 ` Richard Smith
2005-08-22 15:47 ` Antonino A. Daplas
2005-08-22 17:19 ` Geert Uytterhoeven
2005-08-22 19:00 ` Richard Smith
2005-08-22 19:44 ` Richard Smith
2005-08-22 15:57 ` Jon Smirl
2005-08-12 7:24 ` Geert Uytterhoeven
2005-08-12 10:28 ` Antonino A. Daplas
2005-08-11 8:20 ` Geert Uytterhoeven
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9e47339105081112142c67e1a8@mail.gmail.com \
--to=jonsmirl@gmail.com \
--cc=adaplas@gmail.com \
--cc=geert@linux-m68k.org \
--cc=linux-fbdev-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).