[PATCH v4 5/5] drm/ofdrm: Support big-endian scanout buffers
Arnd Bergmann
arnd at arndb.de
Wed Oct 12 17:29:39 AEDT 2022
On Tue, Oct 11, 2022, at 11:38 PM, Michal Suchánek wrote:
> On Tue, Oct 11, 2022 at 10:06:59PM +0200, Arnd Bergmann wrote:
>> On Tue, Oct 11, 2022, at 1:30 PM, Thomas Zimmermann wrote:
>> > Am 11.10.22 um 09:46 schrieb Javier Martinez Canillas:
>> >>> +static bool display_get_big_endian_of(struct drm_device *dev, struct device_node *of_node)
>> >>> +{
>> >>> + bool big_endian;
>> >>> +
>> >>> +#ifdef __BIG_ENDIAN
>> >>> + big_endian = true;
>> >>> + if (of_get_property(of_node, "little-endian", NULL))
>> >>> + big_endian = false;
>> >>> +#else
>> >>> + big_endian = false;
>> >>> + if (of_get_property(of_node, "big-endian", NULL))
>> >>> + big_endian = true;
>> >>> +#endif
>> >>> +
>> >>> + return big_endian;
>> >>> +}
>> >>> +
>> >>
>> >> Ah, I see. The heuristic then is whether the build is BE or LE or if the Device
>> >> Tree has an explicit node defining the endianess. The patch looks good to me:
>> >
>> > Yes. I took this test from offb.
>>
>> Has the driver been tested with little-endian kernels though? While
>> ppc32 kernels are always BE, you can build kernels as either big-endian
>> or little-endian for most (modern) powerpc64 and arm/arm64 hardware,
>> and I don't see why that should change the defaults of the driver
>> when describing the same framebuffer hardware.
>
> The original code was added with
> commit 7f29b87a7779 ("powerpc: offb: add support for foreign endianness")
>
> The hardware is either big-endian or runtime-switchable-endian.
Are you referring to CPU hardware or framebuffer hardware here?
> It makes
> sense to assume big-endian when runnig big-endian and the DT does not
> specify endian which is likely on a historical system.
Agreed, assuming big-endian here clearly makes sense.
> It also makes sense to assume that on system with
> runtime-switchable-endian the DT specifies the framebuffer endian.
>
> If systems that only do little-endian exist or emerge later then it also
> makes sense to assume that the framebuffer matches the host if not
> specified.
>
> I don't really see a problem here.
>
> BTW is this used on arm and on what platform?
I'm not aware of any users on Arm, most likely they all use
simplefb/simpledrm or a gpu specific binding. There might be
users on sparc, but they would obviously be big-endian
as well.
> I do not see any bindings in dts.
Right, that is the real problem I see as well. I found the original
CHRP binding document at
https://www.devicetree.org/open-firmware/bindings/devices/html/lfb-1_0d.html
Unfortunately, this only specifies an 8-bit-per-pixel mode, and the
multi-byte pixel support that was added in linux-2.1.125 was
probably powermac specific without a public specification.
I think ideally we should add a binding document that describes what
the driver actually expects, but in this case I would just drop the
#ifdef check and always assume the framebuffer is big-endian unless
the "little-endian" property is set, in order to have a sensible
definition that does not depend on what OS (i.e. Linux
CONFIG_CPU_BIG_ENDIAN) you are running.
Arnd
More information about the Linuxppc-dev
mailing list