MAX_FB: maximum number of fbdevs

Geert Uytterhoeven (geert@linux-m68k.org)
Mon, 6 Dec 1999 09:08:56 +0100 (CET)


Because of historical reasons[*], the minor numbering for special device nodes
for frame buffer devices contains gaps:

0 = /dev/fb0 First frame buffer
32 = /dev/fb1 Second frame buffer
64 = /dev/fb2 Third frame buffer
...

This limits the maximum number of active frame buffer devices to 8 (FB_MAX):

#define FB_MODES_SHIFT 5 /* 32 modes per framebuffer */
#define FB_NUM_MINORS 256 /* 256 Minors */
#define FB_MAX (FB_NUM_MINORS / (1 << FB_MODES_SHIFT))
#define GET_FB_IDX(node) (MINOR(node) >> FB_MODES_SHIFT)

However, people are already working on frame buffer device drivers for machines
with 16 and more heads. So I'd like to raise FB_MAX to at least 32 for now.

To solve this problem, I see two possible solutions:

1. Remove the gaps and number the device nodes naturally:

0 = /dev/fb0 First frame buffer
1 = /dev/fb1 Second frame buffer
2 = /dev/fb2 Third frame buffer
...

The macros FB_MODES_SHIFT, FB_NUM_MINORS and GET_FB_IDX can be removed.

We can allocate minors 0-31 for the first 32 frame buffer devices, and
keep 32-255 reserved for future expansion.

Advantages:
- Most logical numbering.
- Minors 32-255 are reserved for future expansion.
- Tighter code.
- I already have an (untested) patch :-)

Disadvantages:
- Not 100% backwards compatible: requires recreating special device nodes
/dev/fb* other than /dev/fb0.

2. Fill the gaps with device nodes for frame buffer devices 9 and up, by
cleverly changing the macros to shuffle the bits:

#define FB_MAX 32
#define GET_FB_IDX(node) \
((MINOR(node) >> FB_MODES_SHIFT) | \
((MINOR(node) & ((1 << FB_MODES_SHIFT)-1)) << (8-FB_MODES_SHIFT)))

Advantages:
- 100% backwards compatible for /dev/fb0 through /dev/fb7.
- Only <linux/fb.h> and Documentation/devices.t{ex,xt} have to be
changed.

Disadvantages:
- Ugly bit shuffling causes larger generated code sizes.
- Ugly to reserve minors for future expansion.

Since this matters only for the rare people who use more than one frame buffer
device at the same time (/dev/fb0 is not affected), I vote for the first
solution, which is cleaner. If we ever want to change the minor numbering, we
better do it as soon as possible anyway.

What do you think?

Gr{oetje,eeting}s,

[*] Originally the minors for ((minor & 31) != 0) were used to store
preprogrammed video modes. One could then switch to a preprogrammed video
mode by touch'ing the corresponding special device node, or launch X in a
different video mode by setting FRAMEBUFFER=/dev/fb0<my_favorite_mode>.
Since this imposed an arbitrary limitation on the number of preprogrammed
modes in the kernel and the same thing could be done from user space as
well (using fbset), we decided to drop this feature.

--
Geert Uytterhoeven -- Linux/{m68k~Amiga,PPC~CHRP} -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/