* [PATCH v2] video: simplefb: add mode parsing function
@ 2013-05-27 3:53 Alexandre Courbot
2013-05-27 18:22 ` David Herrmann
2013-05-28 4:13 ` Stephen Warren
0 siblings, 2 replies; 8+ messages in thread
From: Alexandre Courbot @ 2013-05-27 3:53 UTC (permalink / raw)
To: Andrew Morton, Stephen Warren
Cc: gnurou-Re5JQEeQqe8AvxtiuMwx3w, linux-fbdev-u79uwXL29TY76Z2rM5mHXA,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, Rob Clark, Alexandre Courbot,
linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
The naming scheme of simplefb's mode is precise enough to allow building
the mode structure from it instead of using a static list of modes. This
patch introduces a function that does this. In case exotic modes that
cannot be represented from their name alone are needed, the static list
of modes is still available as a backup.
It also changes the order in which colors are declared from MSB first to
the more standard LSB first.
Signed-off-by: Alexandre Courbot <acourbot-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
Changes from v1:
- amended documentation following Stephen's suggestion
- allow parsing of bitfields larger than 9 bits
- made it clear that the parsing order of bits is changed with respect
to the original patch
Andrew, since this patch introduces a (small) change in the DT bindings,
could we try to merge it during the -rc cycle so we don't have to come
with a more complex solution in the future?
.../bindings/video/simple-framebuffer.txt | 12 +++-
drivers/video/simplefb.c | 72 +++++++++++++++++++++-
2 files changed, 80 insertions(+), 4 deletions(-)
diff --git a/Documentation/devicetree/bindings/video/simple-framebuffer.txt b/Documentation/devicetree/bindings/video/simple-framebuffer.txt
index 3ea4605..18d03e2 100644
--- a/Documentation/devicetree/bindings/video/simple-framebuffer.txt
+++ b/Documentation/devicetree/bindings/video/simple-framebuffer.txt
@@ -10,8 +10,16 @@ Required properties:
- width: The width of the framebuffer in pixels.
- height: The height of the framebuffer in pixels.
- stride: The number of bytes in each line of the framebuffer.
-- format: The format of the framebuffer surface. Valid values are:
- - r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b).
+- format: The format of the framebuffer surface. Described as a sequence of
+ channel/num-bits pairs, where each pair describes how many bits are used
+ by a given color channel. Value channels are "r" (red), "g" (green),
+ "b" (blue), "a" (alpha) and "x" (unused). Channels are listed in bit
+ order, starting from the LSB. For instance, a format named "r5g6b5"
+ describes a 16-bit format where red is encoded in the 5 less significant
+ bits, green in the 6 following ones, and blue in the 5 last:
+ BBBBBGGG GGGRRRRR
+ ^ ^
+ MSB LSB
Example:
diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb.c
index e2e9e3e..1430752 100644
--- a/drivers/video/simplefb.c
+++ b/drivers/video/simplefb.c
@@ -21,6 +21,7 @@
*/
#include <linux/errno.h>
+#include <linux/ctype.h>
#include <linux/fb.h>
#include <linux/io.h>
#include <linux/module.h>
@@ -82,8 +83,72 @@ struct simplefb_format {
struct fb_bitfield transp;
};
+static struct simplefb_format *simplefb_parse_format(struct device *dev,
+ const char *str)
+{
+ struct simplefb_format *format;
+ unsigned int offset = 0;
+ unsigned int i = 0;
+
+ format = devm_kzalloc(dev, sizeof(*format), GFP_KERNEL);
+ if (!format)
+ return ERR_PTR(-ENOMEM);
+
+ while (str[i] != 0) {
+ struct fb_bitfield *field = NULL;
+ int length = 0;
+
+ switch (str[i++]) {
+ case 'r':
+ case 'R':
+ field = &format->red;
+ break;
+ case 'g':
+ case 'G':
+ field = &format->green;
+ break;
+ case 'b':
+ case 'B':
+ field = &format->blue;
+ break;
+ case 'a':
+ case 'A':
+ field = &format->transp;
+ break;
+ case 'x':
+ case 'X':
+ break;
+ default:
+ goto error;
+ }
+
+ if (!isdigit(str[i]))
+ goto error;
+
+ while (isdigit(str[i])) {
+ length = length * 10 + (str[i++] - '0');
+ }
+
+ if (field) {
+ field->offset = offset;
+ field->length = length;
+ }
+
+ offset += length;
+ }
+
+ format->bits_per_pixel = (offset + 7) & ~0x7;
+ format->name = str;
+ return format;
+
+error:
+ dev_err(dev, "Invalid format string\n");
+ return ERR_PTR(-EINVAL);
+}
+
+/* if you use exotic modes that simplefb_parse_format cannot decode, you can
+ specify them here. */
static struct simplefb_format simplefb_formats[] = {
- { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0} },
};
struct simplefb_params {
@@ -131,7 +196,10 @@ static int simplefb_parse_dt(struct platform_device *pdev,
params->format = &simplefb_formats[i];
break;
}
- if (!params->format) {
+ if (!params->format)
+ params->format = simplefb_parse_format(&pdev->dev, format);
+
+ if (IS_ERR(params->format)) {
dev_err(&pdev->dev, "Invalid format value\n");
return -EINVAL;
}
--
1.8.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-05-27 3:53 [PATCH v2] video: simplefb: add mode parsing function Alexandre Courbot
@ 2013-05-27 18:22 ` David Herrmann
[not found] ` <CANq1E4Qa6g-zrA6o_u3w6mpVcUk8-ZPPR+edu6EXgpk-kGQULQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-05-28 4:13 ` Stephen Warren
1 sibling, 1 reply; 8+ messages in thread
From: David Herrmann @ 2013-05-27 18:22 UTC (permalink / raw)
To: Alexandre Courbot
Cc: Andrew Morton, Stephen Warren, Arnd Bergmann, Olof Johansson,
Rob Clark, linux-fbdev, devicetree-discuss, linux-arm-kernel,
linux-rpi-kernel, linux-kernel, gnurou
Hi
On Mon, May 27, 2013 at 5:53 AM, Alexandre Courbot <acourbot@nvidia.com> wrote:
> The naming scheme of simplefb's mode is precise enough to allow building
> the mode structure from it instead of using a static list of modes. This
> patch introduces a function that does this. In case exotic modes that
> cannot be represented from their name alone are needed, the static list
> of modes is still available as a backup.
>
> It also changes the order in which colors are declared from MSB first to
> the more standard LSB first.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
> Changes from v1:
> - amended documentation following Stephen's suggestion
> - allow parsing of bitfields larger than 9 bits
> - made it clear that the parsing order of bits is changed with respect
> to the original patch
>
> Andrew, since this patch introduces a (small) change in the DT bindings,
> could we try to merge it during the -rc cycle so we don't have to come
> with a more complex solution in the future?
>
> .../bindings/video/simple-framebuffer.txt | 12 +++-
> drivers/video/simplefb.c | 72 +++++++++++++++++++++-
> 2 files changed, 80 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/video/simple-framebuffer.txt b/Documentation/devicetree/bindings/video/simple-framebuffer.txt
> index 3ea4605..18d03e2 100644
> --- a/Documentation/devicetree/bindings/video/simple-framebuffer.txt
> +++ b/Documentation/devicetree/bindings/video/simple-framebuffer.txt
> @@ -10,8 +10,16 @@ Required properties:
> - width: The width of the framebuffer in pixels.
> - height: The height of the framebuffer in pixels.
> - stride: The number of bytes in each line of the framebuffer.
> -- format: The format of the framebuffer surface. Valid values are:
> - - r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b).
> +- format: The format of the framebuffer surface. Described as a sequence of
> + channel/num-bits pairs, where each pair describes how many bits are used
> + by a given color channel. Value channels are "r" (red), "g" (green),
> + "b" (blue), "a" (alpha) and "x" (unused). Channels are listed in bit
> + order, starting from the LSB. For instance, a format named "r5g6b5"
> + describes a 16-bit format where red is encoded in the 5 less significant
> + bits, green in the 6 following ones, and blue in the 5 last:
> + BBBBBGGG GGGRRRRR
> + ^ ^
> + MSB LSB
Is there a specific reason why we need arbitrary RGB formats? I have a
KMS/DRM driver based on dvbe that can provide the exact same
functionality as this fbdev driver (including an fbdev
backwards-compat layer). However, DRM does not allow arbitrary formats
but rather provides a huge list of supported formats.
If we apply this patch it will get very hard to support this with a
KMS driver. So any reason why we cannot use the DRM FOURCC constants
instead?
The dvbe proposal is available here: (also see the two following patches)
http://lkml.indiana.edu/hypermail/linux/kernel/1302.2/00274.html
it provides a simple DRM driver that uses VESA / VBE. I am currently
trying to rework it to "SimpleDRM" which can support arbitrary
firmware framebuffers.
Cheers
David
> Example:
>
> diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb.c
> index e2e9e3e..1430752 100644
> --- a/drivers/video/simplefb.c
> +++ b/drivers/video/simplefb.c
> @@ -21,6 +21,7 @@
> */
>
> #include <linux/errno.h>
> +#include <linux/ctype.h>
> #include <linux/fb.h>
> #include <linux/io.h>
> #include <linux/module.h>
> @@ -82,8 +83,72 @@ struct simplefb_format {
> struct fb_bitfield transp;
> };
>
> +static struct simplefb_format *simplefb_parse_format(struct device *dev,
> + const char *str)
> +{
> + struct simplefb_format *format;
> + unsigned int offset = 0;
> + unsigned int i = 0;
> +
> + format = devm_kzalloc(dev, sizeof(*format), GFP_KERNEL);
> + if (!format)
> + return ERR_PTR(-ENOMEM);
> +
> + while (str[i] != 0) {
> + struct fb_bitfield *field = NULL;
> + int length = 0;
> +
> + switch (str[i++]) {
> + case 'r':
> + case 'R':
> + field = &format->red;
> + break;
> + case 'g':
> + case 'G':
> + field = &format->green;
> + break;
> + case 'b':
> + case 'B':
> + field = &format->blue;
> + break;
> + case 'a':
> + case 'A':
> + field = &format->transp;
> + break;
> + case 'x':
> + case 'X':
> + break;
> + default:
> + goto error;
> + }
> +
> + if (!isdigit(str[i]))
> + goto error;
> +
> + while (isdigit(str[i])) {
> + length = length * 10 + (str[i++] - '0');
> + }
> +
> + if (field) {
> + field->offset = offset;
> + field->length = length;
> + }
> +
> + offset += length;
> + }
> +
> + format->bits_per_pixel = (offset + 7) & ~0x7;
> + format->name = str;
> + return format;
> +
> +error:
> + dev_err(dev, "Invalid format string\n");
> + return ERR_PTR(-EINVAL);
> +}
> +
> +/* if you use exotic modes that simplefb_parse_format cannot decode, you can
> + specify them here. */
> static struct simplefb_format simplefb_formats[] = {
> - { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0} },
> };
>
> struct simplefb_params {
> @@ -131,7 +196,10 @@ static int simplefb_parse_dt(struct platform_device *pdev,
> params->format = &simplefb_formats[i];
> break;
> }
> - if (!params->format) {
> + if (!params->format)
> + params->format = simplefb_parse_format(&pdev->dev, format);
> +
> + if (IS_ERR(params->format)) {
> dev_err(&pdev->dev, "Invalid format value\n");
> return -EINVAL;
> }
> --
> 1.8.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-05-27 3:53 [PATCH v2] video: simplefb: add mode parsing function Alexandre Courbot
2013-05-27 18:22 ` David Herrmann
@ 2013-05-28 4:13 ` Stephen Warren
[not found] ` <51A42ED5.2060104-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
1 sibling, 1 reply; 8+ messages in thread
From: Stephen Warren @ 2013-05-28 4:13 UTC (permalink / raw)
To: Alexandre Courbot
Cc: Andrew Morton, Arnd Bergmann, Olof Johansson, Rob Clark,
linux-fbdev, devicetree-discuss, linux-arm-kernel,
linux-rpi-kernel, linux-kernel, gnurou
On 05/26/2013 09:53 PM, Alexandre Courbot wrote:
> The naming scheme of simplefb's mode is precise enough to allow building
> the mode structure from it instead of using a static list of modes. This
> patch introduces a function that does this. In case exotic modes that
> cannot be represented from their name alone are needed, the static list
> of modes is still available as a backup.
>
> It also changes the order in which colors are declared from MSB first to
> the more standard LSB first.
>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> ---
> Changes from v1:
> - amended documentation following Stephen's suggestion
> - allow parsing of bitfields larger than 9 bits
> - made it clear that the parsing order of bits is changed with respect
> to the original patch
>
> Andrew, since this patch introduces a (small) change in the DT bindings,
> could we try to merge it during the -rc cycle so we don't have to come
> with a more complex solution in the future?
So, I think we shouldn't change the DT binding at all now. The original
driver is now merged for 3.10, and I think it's far too late to take
code that implements new features for 3.10. This means that we couldn't
merge this patch until 3.11. However, by then, we shouldn't be changing
the DT binding in incompatible ways. Olof has already published some
U-Boot binaries that use the current binding, and on IRC indicated he'd
prefer not to change the binding because of that.
As such, we should either:
a) Just add new entries into the format array that already exists in the
driver. Given David's response, this might be simplest.
b) Extend the DT binding in a 100% backwards-compatible way, which would
mean defaulting the bit-order to match the existing 1 format, and adding
a new Boolean property to indicate that the format string is specified
in the other order.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2013-06-02 5:09 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-27 3:53 [PATCH v2] video: simplefb: add mode parsing function Alexandre Courbot
2013-05-27 18:22 ` David Herrmann
[not found] ` <CANq1E4Qa6g-zrA6o_u3w6mpVcUk8-ZPPR+edu6EXgpk-kGQULQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2013-05-28 2:31 ` Alexandre Courbot
2013-05-28 4:13 ` Stephen Warren
[not found] ` <51A42ED5.2060104-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-05-28 4:57 ` Alexandre Courbot
2013-06-01 5:12 ` Olof Johansson
[not found] ` <20130601051223.GB5189-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2013-06-02 5:07 ` Stephen Warren
[not found] ` <51AAD326.4040809-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-06-02 5:09 ` Olof Johansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox