From: Andy Yan <andy.yan@rock-chips.com> Date: 2016-02-02 09:58:46
This driver parse the reboot commands like "reboot loader"
and "reboot recovery" to get a boot mode described in the
device tree , then call the corresponding write interfae
to store the boot mode in some place like special register
or ram , which can be read by the bootloader after system
reboot.
This is commonly done on Android based devices, in order to
reboot the device into fastboot or recovery mode.
Changes in v3:
- descirbe all reboot mode as properity instead of subnode
- add mask value for some platform which only use some bits of the register
to store boot mode magic value
- add rk3036 support
Changes in v2:
- move to dir drivers/power/reset/
- make syscon-reboot-mode a generic driver
- make this node as a subnode of PMU
- make this node as a subnode of pmugrf
Changes in v1:
- fix the embarrassed compile warning
- correct the maskrom magic number
- check for the normal reboot
- correct the maskrom magic number
- use macro defined in rockchip_boot-mode.h for reboot-mode DT node
Andy Yan (4):
dt-bindings: power: reset: add document for reboot-mode driver
power: reset: add reboot mode driver
ARM: dts: rockchip: add syscon-reboot-mode node
ARM64: dts: rockchip: add syscon-reboot-mode DT node
.../bindings/power/reset/reboot-mode.txt | 26 +++++
.../bindings/power/reset/syscon-reboot-mode.txt | 36 +++++++
arch/arm/boot/dts/rk3036.dtsi | 10 +-
arch/arm/boot/dts/rk3288.dtsi | 11 +++
arch/arm/boot/dts/rk3xxx.dtsi | 13 ++-
arch/arm64/boot/dts/rockchip/rk3368.dtsi | 14 ++-
drivers/power/reset/Kconfig | 16 ++++
drivers/power/reset/Makefile | 2 +
drivers/power/reset/reboot-mode.c | 105 +++++++++++++++++++++
drivers/power/reset/reboot-mode.h | 6 ++
drivers/power/reset/syscon-reboot-mode.c | 64 +++++++++++++
include/dt-bindings/soc/rockchip_boot-mode.h | 30 ++++++
12 files changed, 330 insertions(+), 3 deletions(-)
create mode 100644 Documentation/devicetree/bindings/power/reset/reboot-mode.txt
create mode 100644 Documentation/devicetree/bindings/power/reset/syscon-reboot-mode.txt
create mode 100644 drivers/power/reset/reboot-mode.c
create mode 100644 drivers/power/reset/reboot-mode.h
create mode 100644 drivers/power/reset/syscon-reboot-mode.c
create mode 100644 include/dt-bindings/soc/rockchip_boot-mode.h
--
1.9.1
@@ -0,0 +1,26 @@+Generic reboot mode core map driver++This driver get reboot mode arguments and call the write+interface to stores the magic value in special register+or ram . Then the bootloader can read it and take different+action according the argument stored.++All mode properties are vendor specific, it is a indication to tell+the bootloder what to do when the system reboot, and should be named+as mode-xxx = <magic> (xxx is mode name).++- mode-normal: Normal reboot mode, system reboot with command "reboot".+- mode-recovery: Android Recovery mode, it is a mode to format the device or update a new image.+- mode-fastboot: Android fastboot mode, it's a mode to re-flash partitions on the device.+- mode-loader: A bootloader mode, it's a mode used to download image on Rockchip platform,+ usually used in development.+- mode-maskrom: It's a mode to download bootloader on Rockchip platform.++Example:+ reboot-mode {+ mode-normal = <BOOT_NORMAL>;+ mode-recovery = <BOOT_RECOVERY>;+ mode-fastboot = <BOOT_FASTBOOT>;+ mode-loader = <BOOT_LOADER>;+ mode-maskrom = <BOOT_MASKROM>;+ }
@@ -0,0 +1,36 @@+SYSCON reboot mode driver++This driver get reboot mode magic value form reboot-mode driver+and stores it in a SYSCON mapped register. Then the bootloader+can read it and take different action according to the magic+value stored.++This DT node should be represented as a sub-node of a "syscon", "simple-mfd"+node.++Required properties:+- compatible: should be "syscon-reboot-mode"+- offset: offset in the register map for the storage register (in bytes)++Optional properity:+- mask: the mask bits of the mode magic value, default set to 0xffffffff if missing.++The rest of the properties should follow the generic reboot-mode discription+found in reboot-mode.txt++Example:+ pmu: pmu@20004000 {+ compatible = "rockchip,rk3066-pmu", "syscon", "simple-mfd";+ reg = <0x20004000 0x100>;++ reboot-mode {+ compatible = "syscon-reboot-mode";+ offset = <0x40>;+ mode-normal = <BOOT_NORMAL>;+ mode-recovery = <BOOT_RECOVERY>;+ mode-fastboot = <BOOT_FASTBOOT>;+ mode-loader = <BOOT_LOADER>;+ mode-maskrom = <BOOT_MASKROM>;++ };+ };
@@ -0,0 +1,26 @@+Generic reboot mode core map driver++This driver get reboot mode arguments and call the write+interface to stores the magic value in special register+or ram . Then the bootloader can read it and take different+action according the argument stored.++All mode properties are vendor specific, it is a indication to tell+the bootloder what to do when the system reboot, and should be named+as mode-xxx = <magic> (xxx is mode name).++- mode-normal: Normal reboot mode, system reboot with command "reboot".+- mode-recovery: Android Recovery mode, it is a mode to format the device or update a new image.+- mode-fastboot: Android fastboot mode, it's a mode to re-flash partitions on the device.
@@ -0,0 +1,26 @@+Generic reboot mode core map driver++This driver get reboot mode arguments and call the write+interface to stores the magic value in special register+or ram . Then the bootloader can read it and take different+action according the argument stored.++All mode properties are vendor specific, it is a indication to tell
The values should be vendor specific. The property names should not. We
can allow vendor specific ones, but we need to have a common set.
+the bootloder what to do when the system reboot, and should be named
+as mode-xxx = <magic> (xxx is mode name).
+
+- mode-normal: Normal reboot mode, system reboot with command "reboot".
+- mode-recovery: Android Recovery mode, it is a mode to format the device or update a new image.
+- mode-fastboot: Android fastboot mode, it's a mode to re-flash partitions on the device.
+- mode-loader: A bootloader mode, it's a mode used to download image on Rockchip platform,
+ usually used in development.
+- mode-maskrom: It's a mode to download bootloader on Rockchip platform.
+
+Example:
+ reboot-mode {
+ mode-normal = <BOOT_NORMAL>;
+ mode-recovery = <BOOT_RECOVERY>;
+ mode-fastboot = <BOOT_FASTBOOT>;
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
@@ -0,0 +1,36 @@+SYSCON reboot mode driver++This driver get reboot mode magic value form reboot-mode driver+and stores it in a SYSCON mapped register. Then the bootloader+can read it and take different action according to the magic+value stored.++This DT node should be represented as a sub-node of a "syscon", "simple-mfd"+node.
Whether or not it is a simple-mfd or not depends on the syscon node.
+
+Required properties:
+- compatible: should be "syscon-reboot-mode"
+- offset: offset in the register map for the storage register (in bytes)
+
+Optional properity:
+- mask: the mask bits of the mode magic value, default set to 0xffffffff if missing.
+
+The rest of the properties should follow the generic reboot-mode discription
+found in reboot-mode.txt
+
+Example:
+ pmu: pmu@20004000 {
+ compatible = "rockchip,rk3066-pmu", "syscon", "simple-mfd";
+ reg = <0x20004000 0x100>;
+
+ reboot-mode {
+ compatible = "syscon-reboot-mode";
+ offset = <0x40>;
+ mode-normal = <BOOT_NORMAL>;
+ mode-recovery = <BOOT_RECOVERY>;
+ mode-fastboot = <BOOT_FASTBOOT>;
+ mode-loader = <BOOT_LOADER>;
+ mode-maskrom = <BOOT_MASKROM>;
+
+ };
+ };
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
@@ -0,0 +1,26 @@+Generic reboot mode core map driver++This driver get reboot mode arguments and call the write+interface to stores the magic value in special register+or ram . Then the bootloader can read it and take different+action according the argument stored.++All mode properties are vendor specific, it is a indication to tell
The values should be vendor specific. The property names should not. We
can allow vendor specific ones, but we need to have a common set.
quoted
+the bootloder what to do when the system reboot, and should be named
+as mode-xxx = <magic> (xxx is mode name).
+
+- mode-normal: Normal reboot mode, system reboot with command "reboot".
+- mode-recovery: Android Recovery mode, it is a mode to format the device or update a new image.
+- mode-fastboot: Android fastboot mode, it's a mode to re-flash partitions on the device.
+- mode-loader: A bootloader mode, it's a mode used to download image on Rockchip platform,
+ usually used in development.
+- mode-maskrom: It's a mode to download bootloader on Rockchip platform.
+
+Example:
+ reboot-mode {
+ mode-normal = <BOOT_NORMAL>;
+ mode-recovery = <BOOT_RECOVERY>;
+ mode-fastboot = <BOOT_FASTBOOT>;
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
Wait. This is a bit confusing. The utility of adding a property name
and using that name be the reboot command parsed for made sense
(compared to earlier versions which had command strings) as it made
the dts more terse. But it sounds here like you're suggesting we
should have some logic in the driver that translates "reboot fastboot"
to mode-bootloader or vice versa.
quoted
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
Hrm. So how what reboot command do you expect to trigger that?
Though I do like the vendor specific prefix here, as it clarifies how
universal the command is (and its easy add standard commands if they
become more established and remap things in the future).
quoted
+ mode-maskrom = <BOOT_MASKROM>;
I think this should be "mode-rom-download".
I think one of the difficult things here is that there's no real
standards for all bios/bootloader modes. So they are somewhat
firmware/bootloader/device specific, and thus we need something that
is flexible enough to allow lots of different modes to be easily
specified. That said, this does expose a userspace interface (though
one could argue kernel ABI doesn't cross reboots :) so we should try
to have some consistency so the same userspace can work on various
devices.
I do think the "bootloader" and "recovery" arguments are somewhat
defacto standards, well established on most android devices.
I think here the concern is rockchip probably has some userspace that
is already using "reboot maskrom" or "reboot loader" for their own
uses. And its a bit of a pain to ask that userspace to be reworked to
use "reboot rom-download" or "reboot rockchip,rom-download" depending
on how we try to deal with these. (Granted, non-upstream interfaces
aren't official, so that is their risk somewhat, but we avoid being
smug about that :)
Another part of the issue is there isn't really a way to probe for
reboot cmd capability here. As much as I'd rather not complicate
things, one couldn't easily extend existing userspace to work with
current kernels as well as future kernels, since the reboot with an
invalid command won't fail. The machine still resets. So you can't try
one and fallback to the other.
Maybe there needs to be a sysfs entry with the list of the supported commands?
thanks
-john
@@ -0,0 +1,26 @@+Generic reboot mode core map driver++This driver get reboot mode arguments and call the write+interface to stores the magic value in special register+or ram . Then the bootloader can read it and take different+action according the argument stored.++All mode properties are vendor specific, it is a indication to tell
The values should be vendor specific. The property names should not. We
can allow vendor specific ones, but we need to have a common set.
quoted
+the bootloder what to do when the system reboot, and should be named
+as mode-xxx = <magic> (xxx is mode name).
+
+- mode-normal: Normal reboot mode, system reboot with command "reboot".
+- mode-recovery: Android Recovery mode, it is a mode to format the device or update a new image.
+- mode-fastboot: Android fastboot mode, it's a mode to re-flash partitions on the device.
+- mode-loader: A bootloader mode, it's a mode used to download image on Rockchip platform,
+ usually used in development.
+- mode-maskrom: It's a mode to download bootloader on Rockchip platform.
+
+Example:
+ reboot-mode {
+ mode-normal = <BOOT_NORMAL>;
+ mode-recovery = <BOOT_RECOVERY>;
+ mode-fastboot = <BOOT_FASTBOOT>;
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
Wait. This is a bit confusing. The utility of adding a property name
and using that name be the reboot command parsed for made sense
(compared to earlier versions which had command strings) as it made
the dts more terse. But it sounds here like you're suggesting we
should have some logic in the driver that translates "reboot fastboot"
to mode-bootloader or vice versa.
I said early on the DT names and kernel-userspace names should not
necessarily be linked. They can be, but we shouldn't require that.
My concern with mode-bootloader is what if you can boot into multiple
bootloader modes. Say USB mass storage is one option. "bootloader" is
not real specific.
quoted
quoted
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
Hrm. So how what reboot command do you expect to trigger that?
Whatever your OS has defined to map to that.
We could just decide the kernel will strip <vendor> and 'mode-' and
match commands against what remains.
Though I do like the vendor specific prefix here, as it clarifies how
universal the command is (and its easy add standard commands if they
become more established and remap things in the future).
quoted
quoted
+ mode-maskrom = <BOOT_MASKROM>;
I think this should be "mode-rom-download".
I think one of the difficult things here is that there's no real
standards for all bios/bootloader modes. So they are somewhat
firmware/bootloader/device specific, and thus we need something that
is flexible enough to allow lots of different modes to be easily
specified. That said, this does expose a userspace interface (though
one could argue kernel ABI doesn't cross reboots :) so we should try
to have some consistency so the same userspace can work on various
devices.
There is: UEFI. Boot mode efivars are standard. But then they are pretty
much PC oriented though. It is more which device to boot off of, but
there is network boot or boot to bios setup.
I do think the "bootloader" and "recovery" arguments are somewhat
defacto standards, well established on most android devices.
Yes, otherwise I'd be completely against "mode-bootloader" as the
property.
I think here the concern is rockchip probably has some userspace that
is already using "reboot maskrom" or "reboot loader" for their own
uses. And its a bit of a pain to ask that userspace to be reworked to
Perhaps those are only for development and change would not be so
painful.
use "reboot rom-download" or "reboot rockchip,rom-download" depending
on how we try to deal with these. (Granted, non-upstream interfaces
aren't official, so that is their risk somewhat, but we avoid being
smug about that :)
Or vendor specific modes require vendor specific translation in the
kernel.
To some extent we need to design what is right and worry about future
devices rather than cater to past devices. There's always some
compromise. What would you design ignoring the existing conditions.
Start there and then figure out how to make it work with current
designs.
Another part of the issue is there isn't really a way to probe for
reboot cmd capability here. As much as I'd rather not complicate
things, one couldn't easily extend existing userspace to work with
current kernels as well as future kernels, since the reboot with an
invalid command won't fail. The machine still resets. So you can't try
one and fallback to the other.
Well, that's nice. Maybe we should change that? Or we're stuck with
that ABI?
Maybe there needs to be a sysfs entry with the list of the supported commands?
You can just read the DT. Although, the problem then is what happens
when we move to the next firmware interface. We see that some with
devices having userspace dependencies on ATAGS.
Rob
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
Wait. This is a bit confusing. The utility of adding a property name
and using that name be the reboot command parsed for made sense
(compared to earlier versions which had command strings) as it made
the dts more terse. But it sounds here like you're suggesting we
should have some logic in the driver that translates "reboot fastboot"
to mode-bootloader or vice versa.
I said early on the DT names and kernel-userspace names should not
necessarily be linked. They can be, but we shouldn't require that.
Sigh. Ok. It seemed it was due to earlier comments (maybe from others,
but I thought it was you), that we moved from specifying a command
string, to using the label. But if you think the label name and the
commands shouldn't be linked, it seems like we should re-introduce
that. No?
Unless your thinking we need some sort of static in-kernel mapping of
commands to label names? But that just seems painfully indirect for
little gain ("Its obvious! For that mode, you use this term here, and
that different term over there!").
My concern with mode-bootloader is what if you can boot into multiple
bootloader modes. Say USB mass storage is one option. "bootloader" is
not real specific.
True. But as I think we agreed below, "bootloader" and "recovery" are
basically defacto standards, and I think it would be a bad idea to try
to declare all the existing android tooling and docs wrong just
because the command is vague, technically.
quoted
quoted
quoted
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
Hrm. So how what reboot command do you expect to trigger that?
Whatever your OS has defined to map to that.
We could just decide the kernel will strip <vendor> and 'mode-' and
match commands against what remains.
That part sounds sane, although I do think having vendor prefixes are
reasonable for actual commands as well.
quoted
I think one of the difficult things here is that there's no real
standards for all bios/bootloader modes. So they are somewhat
firmware/bootloader/device specific, and thus we need something that
is flexible enough to allow lots of different modes to be easily
specified. That said, this does expose a userspace interface (though
one could argue kernel ABI doesn't cross reboots :) so we should try
to have some consistency so the same userspace can work on various
devices.
There is: UEFI. Boot mode efivars are standard. But then they are pretty
much PC oriented though. It is more which device to boot off of, but
there is network boot or boot to bios setup.
Well, there's a partial standard there. I'm told for android on x86,
there is no UEFI standard way to communicate rebooting to fastboot or
recovery. Every device does its own device specific driver.
quoted
I do think the "bootloader" and "recovery" arguments are somewhat
defacto standards, well established on most android devices.
Yes, otherwise I'd be completely against "mode-bootloader" as the
property.
Ok.
quoted
I think here the concern is rockchip probably has some userspace that
is already using "reboot maskrom" or "reboot loader" for their own
uses. And its a bit of a pain to ask that userspace to be reworked to
Perhaps those are only for development and change would not be so
painful.
Andy: Can you comment here? How critical are the specific commands
you've used here for your userspace?
quoted
use "reboot rom-download" or "reboot rockchip,rom-download" depending
on how we try to deal with these. (Granted, non-upstream interfaces
aren't official, so that is their risk somewhat, but we avoid being
smug about that :)
Or vendor specific modes require vendor specific translation in the
kernel.
True.
To some extent we need to design what is right and worry about future
devices rather than cater to past devices. There's always some
compromise. What would you design ignoring the existing conditions.
Start there and then figure out how to make it work with current
designs.
Fair enough. I just want to make sure we're not getting too caught up
with design purity and are willing the meet the world where it is.
quoted
Another part of the issue is there isn't really a way to probe for
reboot cmd capability here. As much as I'd rather not complicate
things, one couldn't easily extend existing userspace to work with
current kernels as well as future kernels, since the reboot with an
invalid command won't fail. The machine still resets. So you can't try
one and fallback to the other.
Well, that's nice. Maybe we should change that? Or we're stuck with
that ABI?
Maybe? I'm not sure what might have trouble with reboot failing if it
sticks any extra noise in the reboot command.
I'd probably lean towards sticking with the existing behavior.
quoted
Maybe there needs to be a sysfs entry with the list of the supported commands?
You can just read the DT. Although, the problem then is what happens
when we move to the next firmware interface. We see that some with
devices having userspace dependencies on ATAGS.
Heh. I guess. Thought I suspect "Just read the DT to sort out the
available reboot modes" is probably not what most userspace wants to
hear. :)
thanks
-john
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
Wait. This is a bit confusing. The utility of adding a property name
and using that name be the reboot command parsed for made sense
(compared to earlier versions which had command strings) as it made
the dts more terse. But it sounds here like you're suggesting we
should have some logic in the driver that translates "reboot fastboot"
to mode-bootloader or vice versa.
I said early on the DT names and kernel-userspace names should not
necessarily be linked. They can be, but we shouldn't require that.
Sigh. Ok. It seemed it was due to earlier comments (maybe from others,
but I thought it was you), that we moved from specifying a command
string, to using the label. But if you think the label name and the
commands shouldn't be linked, it seems like we should re-introduce
that. No?
Unless your thinking we need some sort of static in-kernel mapping of
commands to label names? But that just seems painfully indirect for
little gain ("Its obvious! For that mode, you use this term here, and
that different term over there!").
Tying it to a Linux ABI makes the binding Linux specific. I don't have a
problem that the strings happen to be the same, but we should have some
understanding that they may not be and allow for that.
quoted
My concern with mode-bootloader is what if you can boot into multiple
bootloader modes. Say USB mass storage is one option. "bootloader" is
not real specific.
True. But as I think we agreed below, "bootloader" and "recovery" are
basically defacto standards, and I think it would be a bad idea to try
to declare all the existing android tooling and docs wrong just
because the command is vague, technically.
Okay, as long as they are clearly documented what they mean.
quoted
quoted
quoted
quoted
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
Hrm. So how what reboot command do you expect to trigger that?
Whatever your OS has defined to map to that.
We could just decide the kernel will strip <vendor> and 'mode-' and
match commands against what remains.
That part sounds sane, although I do think having vendor prefixes are
reasonable for actual commands as well.
Well, you could still have "rockchip,mode-rockchip-bl-download"...
We can bikeshed that when get there.
The other way random custom modes could be done is just allow the raw
value to be passed from userspace converting the string to a number.
Then we have no abstraction rather than half way abstracting it.
quoted
quoted
I think one of the difficult things here is that there's no real
standards for all bios/bootloader modes. So they are somewhat
firmware/bootloader/device specific, and thus we need something that
is flexible enough to allow lots of different modes to be easily
specified. That said, this does expose a userspace interface (though
one could argue kernel ABI doesn't cross reboots :) so we should try
to have some consistency so the same userspace can work on various
devices.
There is: UEFI. Boot mode efivars are standard. But then they are pretty
much PC oriented though. It is more which device to boot off of, but
there is network boot or boot to bios setup.
Well, there's a partial standard there. I'm told for android on x86,
there is no UEFI standard way to communicate rebooting to fastboot or
recovery. Every device does its own device specific driver.
So much for standards. However, while these specific modes have not been
standardized, there is a set of standard modes and these could have been
added to the existing mechanism. So there at least exists some model to
draw inspiration from.
Rob
I tend to agree with John on calling this mode-bootloader.
OTOH, fastboot is more specific about what the mode is. The name in DT
and the userspace name don't necessarily have to be the same.
Wait. This is a bit confusing. The utility of adding a property name
and using that name be the reboot command parsed for made sense
(compared to earlier versions which had command strings) as it made
the dts more terse. But it sounds here like you're suggesting we
should have some logic in the driver that translates "reboot fastboot"
to mode-bootloader or vice versa.
I said early on the DT names and kernel-userspace names should not
necessarily be linked. They can be, but we shouldn't require that.
Sigh. Ok. It seemed it was due to earlier comments (maybe from others,
but I thought it was you), that we moved from specifying a command
string, to using the label. But if you think the label name and the
commands shouldn't be linked, it seems like we should re-introduce
that. No?
Unless your thinking we need some sort of static in-kernel mapping of
commands to label names? But that just seems painfully indirect for
little gain ("Its obvious! For that mode, you use this term here, and
that different term over there!").
quoted
My concern with mode-bootloader is what if you can boot into multiple
bootloader modes. Say USB mass storage is one option. "bootloader" is
not real specific.
True. But as I think we agreed below, "bootloader" and "recovery" are
basically defacto standards, and I think it would be a bad idea to try
to declare all the existing android tooling and docs wrong just
because the command is vague, technically.
quoted
quoted
quoted
quoted
+ mode-loader = <BOOT_LOADER>;
This one needs a better name. Maybe it should be 'rockchip,mode-loader'
as it is vendor specific. Either way, loader is vague. Perhaps
rockchip,mode-bl-download?
Hrm. So how what reboot command do you expect to trigger that?
Whatever your OS has defined to map to that.
We could just decide the kernel will strip <vendor> and 'mode-' and
match commands against what remains.
That part sounds sane, although I do think having vendor prefixes are
reasonable for actual commands as well.
quoted
quoted
I think one of the difficult things here is that there's no real
standards for all bios/bootloader modes. So they are somewhat
firmware/bootloader/device specific, and thus we need something that
is flexible enough to allow lots of different modes to be easily
specified. That said, this does expose a userspace interface (though
one could argue kernel ABI doesn't cross reboots :) so we should try
to have some consistency so the same userspace can work on various
devices.
There is: UEFI. Boot mode efivars are standard. But then they are pretty
much PC oriented though. It is more which device to boot off of, but
there is network boot or boot to bios setup.
Well, there's a partial standard there. I'm told for android on x86,
there is no UEFI standard way to communicate rebooting to fastboot or
recovery. Every device does its own device specific driver.
quoted
quoted
I do think the "bootloader" and "recovery" arguments are somewhat
defacto standards, well established on most android devices.
Yes, otherwise I'd be completely against "mode-bootloader" as the
property.
Ok.
quoted
quoted
I think here the concern is rockchip probably has some userspace that
is already using "reboot maskrom" or "reboot loader" for their own
uses. And its a bit of a pain to ask that userspace to be reworked to
Perhaps those are only for development and change would not be so
painful.
Andy: Can you comment here? How critical are the specific commands
you've used here for your userspace?
Have some discussion with my colleague, we decided remove the"
maskrom" mode in next version.
Actually, this mode is not so used so often.
But "reboot loader" is frequently used in development by all the
rockchip platform related people, even
some widely used factory tools use this command.So we really hope it can
compatible with the existing tools
and user experience.
quoted
quoted
use "reboot rom-download" or "reboot rockchip,rom-download" depending
on how we try to deal with these. (Granted, non-upstream interfaces
aren't official, so that is their risk somewhat, but we avoid being
smug about that :)
Or vendor specific modes require vendor specific translation in the
kernel.
True.
quoted
To some extent we need to design what is right and worry about future
devices rather than cater to past devices. There's always some
compromise. What would you design ignoring the existing conditions.
Start there and then figure out how to make it work with current
designs.
Fair enough. I just want to make sure we're not getting too caught up
with design purity and are willing the meet the world where it is.
quoted
quoted
Another part of the issue is there isn't really a way to probe for
reboot cmd capability here. As much as I'd rather not complicate
things, one couldn't easily extend existing userspace to work with
current kernels as well as future kernels, since the reboot with an
invalid command won't fail. The machine still resets. So you can't try
one and fallback to the other.
Well, that's nice. Maybe we should change that? Or we're stuck with
that ABI?
Maybe? I'm not sure what might have trouble with reboot failing if it
sticks any extra noise in the reboot command.
I'd probably lean towards sticking with the existing behavior.
quoted
quoted
Maybe there needs to be a sysfs entry with the list of the supported commands?
You can just read the DT. Although, the problem then is what happens
when we move to the next firmware interface. We see that some with
devices having userspace dependencies on ATAGS.
Heh. I guess. Thought I suspect "Just read the DT to sort out the
available reboot modes" is probably not what most userspace wants to
hear. :)
thanks
-john
_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip
From: Andy Yan <andy.yan@rock-chips.com> Date: 2016-02-02 10:04:22
This driver parse the reboot commands like "reboot loader"
and "reboot recovery" to get a boot mode described in the
device tree , then call the write interfae to store the boot
mode in some place like special register or sram , which can
be read by the bootloader after system reboot, then the bootloader
can take different action according to the mode stored.
This is commonly used on Android based devices, in order to
reboot the device into fastboot or recovery mode.
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
---
Changes in v3:
- scan multi properities
- add mask value for some platform which only use some bits of the register
to store boot mode magic value
Changes in v2:
- move to dir drivers/power/reset/
- make syscon-reboot-mode a generic driver
Changes in v1:
- fix the embarrassed compile warning
- correct the maskrom magic number
- check for the normal reboot
drivers/power/reset/Kconfig | 16 +++++
drivers/power/reset/Makefile | 2 +
drivers/power/reset/reboot-mode.c | 105 +++++++++++++++++++++++++++++++
drivers/power/reset/reboot-mode.h | 6 ++
drivers/power/reset/syscon-reboot-mode.c | 64 +++++++++++++++++++
5 files changed, 193 insertions(+)
create mode 100644 drivers/power/reset/reboot-mode.c
create mode 100644 drivers/power/reset/reboot-mode.h
create mode 100644 drivers/power/reset/syscon-reboot-mode.c
From: kbuild test robot <hidden> Date: 2016-02-03 11:54:58
Hi Andy,
[auto build test ERROR on rockchip/for-next]
[also build test ERROR on v4.5-rc2 next-20160203]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/Andy-Yan/add-reboot-mode-driver/20160202-181909
base: https://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip.git for-next
config: x86_64-randconfig-r0-02031912 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
warning: (SYSCON_REBOOT_MODE) selects REBOOT_MODE which has unmet direct dependencies (POWER_RESET && OF)
drivers/power/reset/reboot-mode.c: In function 'reboot_mode_register':
quoted
drivers/power/reset/reboot-mode.c:79:2: error: implicit declaration of function 'for_each_property_of_node' [-Werror=implicit-function-declaration]
for_each_property_of_node(dev->of_node, prop) {
^
quoted
drivers/power/reset/reboot-mode.c:79:48: error: expected ';' before '{' token
From: Andy Yan <andy.yan@rock-chips.com> Date: 2016-02-02 10:12:46
Rockchip platform use a SYSCON mapped register store
the reboot mode magic value for bootloader to use when
system reboot. So add syscon-reboot-mode driver DT node
for rk3xxx,rk3036, rk3288 platform
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
---
Changes in v3:
- descirbe all reboot mode as property instead of subnode
- add rk3036 support
Changes in v2:
- make this node as a subnode of PMU
Changes in v1:
- correct the maskrom magic number
- use macro defined in rockchip_boot-mode.h for reboot-mode DT node
arch/arm/boot/dts/rk3036.dtsi | 11 +++++++++-
arch/arm/boot/dts/rk3288.dtsi | 11 ++++++++++
arch/arm/boot/dts/rk3xxx.dtsi | 13 +++++++++++-
include/dt-bindings/soc/rockchip_boot-mode.h | 30 ++++++++++++++++++++++++++++
4 files changed, 63 insertions(+), 2 deletions(-)
create mode 100644 include/dt-bindings/soc/rockchip_boot-mode.h
From: Andy Yan <andy.yan@rock-chips.com> Date: 2016-02-02 10:15:28
Add syscon-reboot-mode driver DT node for rk3368 platform
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
---
Changes in v3:
- descirbe all reboot mode as property instead of subnode
Changes in v2:
- make this node as a subnode of pmugrf
Changes in v1: None
arch/arm64/boot/dts/rockchip/rk3368.dtsi | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
From: Shawn Lin <shawn.lin@rock-chips.com> Date: 2016-02-03 02:08:09
On 2016/2/2 18:13, Andy Yan wrote:
Add syscon-reboot-mode driver DT node for rk3368 platform
Signed-off-by: Andy Yan <andy.yan@rock-chips.com>
Work fine with my rk3368-sheep board :)
Tested-by: Shawn Lin <shawn.lin@rock-chips.com>
quoted hunk
---
Changes in v3:
- descirbe all reboot mode as property instead of subnode
Changes in v2:
- make this node as a subnode of pmugrf
Changes in v1: None
arch/arm64/boot/dts/rockchip/rk3368.dtsi | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)