[GIT PULL 6/6] Broadcom drivers changes for 4.14
Arnd Bergmann
arnd at arndb.de
Sat Aug 19 13:34:26 PDT 2017
On Sat, Aug 19, 2017 at 12:35 AM, Florian Fainelli <f.fainelli at gmail.com> wrote:
> On 08/18/2017 02:58 PM, Arnd Bergmann wrote:
>> On Thu, Aug 17, 2017 at 8:37 PM, Florian Fainelli <f.fainelli at gmail.com> wrote:
>>> The following changes since commit 5771a8c08880cdca3bfb4a3fc6d309d6bba20877:
>>>
>>> Linux v4.13-rc1 (2017-07-15 15:22:10 -0700)
>>>
>>> are available in the git repository at:
>>>
>>> http://github.com/Broadcom/stblinux.git tags/arm-soc/for-4.14/drivers
>>>
>>> for you to fetch changes up to 7f95522be533c27a918fe388ae5d733344660ef2:
>>>
>>> soc bcm: brcmstb: Add support for S2/S3/S5 suspend states (MIPS) (2017-07-28 16:57:03 -0700)
>>>
>>> ----------------------------------------------------------------
>>> This pull request contains Broadcom ARM/ARM64 SoC drivers changes for 4.14,
>>> please pull the following:
>>>
>>> - Markus adds support for the Broadcom STB DDR PHY frontend which supports
>>> dynamic firmware loading and offers the ability to respond with DRAM refresh
>>> rates. He also adds a proper documentation binding document for that peripheral
>>>
>>
>> I had not seen this driver before, but now I looked at it and have two small
>> comments:
>>
>> - I'd rather see this added to drivers/memory than drivers/soc. The distinction
>> is not always clear, but I think that's where most of the DDR memory interface
>> drivers are at the moment.
>
> This driver does not control the SoC's memory interface though it does
> talk to the frontend processor built into the DDR controller to first
> load its firmware and then query it to get the DDR refresh rates. If you
> feel like drivers/memory/broadcom/ is more appropriate I suppose we
> could relocate the driver there.
Yes, I still think it makes sense to put it there, although it's not the only
possible choice. drivers/memory is a very broad category that groups
all kinds of things that are related to memory interfaces.
>> - In a function called __write_firmware, I stumbled over this small
>> hunk and similar functions elsewhere in the driver:
>>
>> + /* Now copy it. */
>> + if (is_big_endian) {
>> + for (i = 0; i < size; i++)
>> + writel_relaxed(be32_to_cpu(fw[i]), mem + i);
>> + } else {
>> + for (i = 0; i < size; i++)
>> + writel_relaxed(fw[i], mem + i);
>> + }
>>
>> This looks wrong to me, as the behavior is different between
>> little-endian and big-endian kernels: the former will byteswap
>> big-endian fw images but not little-endian images, while the
>> latter will byte-swap both.
>>
>> What is the expected behavior here?
>
> So the is_big_endian flag actually refers to the endianess of the DPFE
> CPU/firmware image here, so if I read this code correctly, we have the
> following happening
>
> LE kernel + BE DPFE: swapping from BE to LE during file read but not I/O
> write (KO because resulting DPFE image is LE)
> LE kernel + LE DPFE: no-swapping (OK)
>
> BE kernel + BE DPFE: swapping to LE during I/O write not file read (KO,
> because resulting DPFE image is LE)
> BE kernel + LE DPFE: swapping to LE during I/O write not file read (OK)
>
> Markus, does that sound like what is happening?
I suspect it would be better to never swap while copying the image from
memory to I/O and always use memcpy_toio there, which performs
a byte stream copy. The information you then need really is not what
the endianess of the DPFE CPU is, but rather if it was stored as
byte-reversed in the file.
Arnd
More information about the linux-arm-kernel
mailing list