Re: How to describe internal flash (ROM) in the microcontroller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On Wed, May 03, 2017 at 12:17:38PM +0200, Freddie Chopin wrote:
> Hi!
> 
> On Mon, 2017-05-01 at 14:38 +1000, David Gibson wrote:
> > There are existing CPU bindings which include additional properties
> > giving lists or bitmasks of optional features.  For example the PAPR
> > standard requires this for guest device trees on POWER.  It also
> > requires that there be a 'cpu-version' property which gives the
> > "logical PVR" which the OS is supposed to look at in most cases
> > instead of the physically discoverable PVR register contents.  This
> > has applications for CPUs put into compatibility modes for
> > virtualization, so the use case isn't a perfect match, but the ideas
> > may be adaptable.
> > 
> > What *is* a really good rule of thumb is don't invent a new way of
> > encoding this information if you can possibly avoid it.  I don't know
> > if the few cases of DT being used on x86 have something similar, but
> > if they do I'd expect it to use the same bitmask as the cpuid
> > instruction returns.  In your case, if there are existing (read only)
> > registers that give the information you need, you could mirror their
> > value into the device tree
> 
> I've just browsed the manual for ARMv7-M architecture and there are 3
> read-only registers which have that info, but with a small twist (;
> 
> If the core has single-precision FPU, MVFR0-MVFR2 register values are
> 0x10110021, 0x11000011 and 0x00000000. This would be ARM Cortex-M4 with
> FPv4-SP-D16 or ARM Cortex-M7 with FPv5-SP-D16. If the core has double-
> precision FPU, the values of these registers are 0x10110221, 0x12000011
> and 0x00000040. This is a case for ARM Cortex-M7 with FPv5-D16. The
> slight twist is when the core has no FPU at all, as in that case the
> manual says these registers are not implemented at all, but I haven't
> checked yet whether any attempt to read them causes a fault or just
> returns zeroes.

That's ok - you can encode "register not present" by simply leaving
the property out, or leaving it empty (these are different and
distinguishable options).

> Could you point me to the binding which describes the properties you
> mentioned? I couldn't find 'cpu-version' in the device-tree-rebasing
> repository...

That should be in the LoPAPR spec, which you can get from

https://members.openpowerfoundation.org/document/dl/469

> Maybe - after all - it would be easier and more readable to have FPU as
> a subnode of the CPU? Sth like:
> 
> cpus {
> 	cpu@0 {
> 		compatible = "arm,cortex-m4";
> 
> 		fpu@0 {
> 			compatible = "arm,fpv4-sp-d16";
> 		};
> 	};
> };
> 
> In this case it's pretty easy to extend that with an optional 'status =
> "okay";' / 'status = "disabled";' for the cases where the user doesn't
> want FPU to be "globally enabled" (useful when only one thread uses
> FPU, so there's no point in saving its context).

Urgh..

So, if this was a completely new binding for a completely new CPU, I'd
say that sounds like an excellent way of doing it.  But it's not.

There are lots and lots of existing ARM bindings out there for lots of
ARM CPUs, mostly higher end ones, many of which I presume include an
FPU, but which won't have this new proposed node.  This is pretty much
what I mean when I say "don't invent new ways of encoding things".

I think this is an argument for using "empty property" rather than
"missing property" for encoding a missing FPU.  That way your DT
client code has these options:

    no property => unknown FPU state => this DT is not suitable
    empty property => no FPU
    properties present => FPU present, tells you which type

In the first case you can at least error out sensibly    

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Device Tree]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Photos]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]

  Powered by Linux