* [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: linux-arm-kernel
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
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
2013-05-28 2:31 ` Alexandre Courbot
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: linux-arm-kernel
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 18:22 ` David Herrmann
@ 2013-05-28 2:31 ` Alexandre Courbot
0 siblings, 0 replies; 8+ messages in thread
From: Alexandre Courbot @ 2013-05-28 2:31 UTC (permalink / raw)
To: linux-arm-kernel
Hi David,
On Tue, May 28, 2013 at 3:22 AM, David Herrmann <dh.herrmann@gmail.com> wrote:
> 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?
I don't see any. Maybe Stephen can confirm.
> 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.
Ok. I am personally fine with using FOURCC codes for describing video
modes. Maybe we can just drop this patch if it gets in your way.
Alex.
^ 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
2013-05-28 4:57 ` Alexandre Courbot
2013-06-01 5:12 ` Olof Johansson
1 sibling, 2 replies; 8+ messages in thread
From: Stephen Warren @ 2013-05-28 4:13 UTC (permalink / raw)
To: linux-arm-kernel
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
* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-05-28 4:13 ` Stephen Warren
@ 2013-05-28 4:57 ` Alexandre Courbot
2013-06-01 5:12 ` Olof Johansson
1 sibling, 0 replies; 8+ messages in thread
From: Alexandre Courbot @ 2013-05-28 4:57 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, May 28, 2013 at 1:13 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
> 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.
a) is definitely simpler, so let's do that and drop this patch. Sorry
about the noise.
Alex.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-05-28 4:13 ` Stephen Warren
2013-05-28 4:57 ` Alexandre Courbot
@ 2013-06-01 5:12 ` Olof Johansson
2013-06-02 5:07 ` Stephen Warren
1 sibling, 1 reply; 8+ messages in thread
From: Olof Johansson @ 2013-06-01 5:12 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, May 27, 2013 at 10:13:09PM -0600, Stephen Warren wrote:
> 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.
I think so too. Is this even needed? Do we have any users of the newer formats
or is it just someone trying to feature-creep this driver to make the "simple"
part of the name inaccurate? :)
> 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.
Or just add a new property that has higher priority for the newer format
strings, and make the driver use that if it exists, otherwise fall back.
-Olof
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-06-01 5:12 ` Olof Johansson
@ 2013-06-02 5:07 ` Stephen Warren
2013-06-02 5:09 ` Olof Johansson
0 siblings, 1 reply; 8+ messages in thread
From: Stephen Warren @ 2013-06-02 5:07 UTC (permalink / raw)
To: linux-arm-kernel
On 05/31/2013 11:12 PM, Olof Johansson wrote:
> On Mon, May 27, 2013 at 10:13:09PM -0600, Stephen Warren wrote:
>> 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.
...
>> 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.
>
> I think so too. Is this even needed? Do we have any users of the newer formats
> or is it just someone trying to feature-creep this driver to make the "simple"
> part of the name inaccurate? :)
Alex is working on board support for a new NVIDIA board, where IIRC the
bootloader sets up some 32-bit ARGB format for the panel.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v2] video: simplefb: add mode parsing function
2013-06-02 5:07 ` Stephen Warren
@ 2013-06-02 5:09 ` Olof Johansson
0 siblings, 0 replies; 8+ messages in thread
From: Olof Johansson @ 2013-06-02 5:09 UTC (permalink / raw)
To: linux-arm-kernel
On Sat, Jun 1, 2013 at 10:07 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 05/31/2013 11:12 PM, Olof Johansson wrote:
>> On Mon, May 27, 2013 at 10:13:09PM -0600, Stephen Warren wrote:
>>> 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.
> ...
>>> 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.
>>
>> I think so too. Is this even needed? Do we have any users of the newer formats
>> or is it just someone trying to feature-creep this driver to make the "simple"
>> part of the name inaccurate? :)
>
> Alex is working on board support for a new NVIDIA board, where IIRC the
> bootloader sets up some 32-bit ARGB format for the panel.
Ah, ok. Let's just implement that one format too then. :)
-Olof
^ 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
2013-05-28 2:31 ` Alexandre Courbot
2013-05-28 4:13 ` Stephen Warren
2013-05-28 4:57 ` Alexandre Courbot
2013-06-01 5:12 ` Olof Johansson
2013-06-02 5:07 ` Stephen Warren
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;
as well as URLs for NNTP newsgroup(s).