Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1700790 > unrolled thread
| Started by | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| First post | 2017-08-01 11:30 +0200 |
| Last post | 2017-08-01 11:40 +0200 |
| Articles | 3 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH V3 0/8] drivers: Boot Constraints core Viresh Kumar <viresh.kumar@linaro.org> - 2017-08-01 11:30 +0200
[PATCH V3 2/8] drivers: boot_constraint: Add boot_constraints_disable kernel parameter Viresh Kumar <viresh.kumar@linaro.org> - 2017-08-01 11:40 +0200
[PATCH V3 4/8] drivers: boot_constraint: Add support for clk constraints Viresh Kumar <viresh.kumar@linaro.org> - 2017-08-01 11:40 +0200
| From | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| Date | 2017-08-01 11:30 +0200 |
| Subject | [PATCH V3 0/8] drivers: Boot Constraints core |
| Message-ID | <u9BEZ-1GX-3@gated-at.bofh.it> |
Hi Greg,
Here is V3 of the boot constraints core based on the feedbacks I have
received during V2. This tested on real hardware (Qcom dragonboard 410c)
with a display controller configured from bootloader to display a flash
screen. Obviously it doesn't work seamlessly without this series and
works just fine with it. Rajendra Nayak helped getting this tested on
Qcom hardware.
Problem statement:
Some devices are powered ON by the bootloader before the bootloader
handovers control to Linux. It maybe important for those devices to keep
working until the time a Linux device driver probes the device and
reconfigure its resources.
A typical example of that can be the LCD controller, which is used by
the bootloaders to show image(s) while the platform is booting into
Linux. The LCD controller can be using some resources, like clk,
regulators, etc, that are shared between several devices. These shared
resources should be configured to satisfy need of all the users. If
another device's (X) driver gets probed before the LCD controller driver
in this case, then it may end up reconfiguring these resources to ranges
satisfying the current users (only device X) and that can make the LCD
screen unstable.
Of course we can have more complex cases where the same resource is
getting used by two devices while the kernel boots and the order in
which devices get probed wouldn't matter as the other device will surely
break then.
There are also cases where the resources may not be shared, but the
kernel will disable them forcefully as no users may have appeared until
a certain point in kernel boot. This makes sure that the resources stay
enabled. A wide variety of constraints can be satisfied using the new
framework.
Proposed solution:
This patchset introduces the concept of boot-constraints, which are set
by platform specific drivers (for now at least) at early init (like
subsys_initcall) and the kernel will satisfy them until the time driver
for such a device is probed (successfully or unsuccessfully). Once the
driver is probed, the driver core removes the constraints set for the
device. This series implements clk, regulator and PM domain constraints
for now.
The last patch isn't up for merge yet, and is used to test the boot
constraint framework on Qcom 410c along with some of the display
controller patches from Rob's series [1] to make sure the controller's
registers are configured properly.
Rebased over: drivers/driver-core-next (some debugfs dependencies)
Pushed here: git://git.kernel.org/pub/scm/linux/kernel/git/vireshk/linux.git device/boot-constraints
V2->V3:
- Removed DT support as we aren't sure about how to define the bindings
yet.
- Added CLK and PM domain constraint types.
- A new directory is added for boot constraints, which will also contain
platform specific drivers in future.
- Deferred devices are still supported, just that it wouldn't be called
from generic code anymore but platform specific code.
- Tested on Qcom 410c dragonboard with display flash screen (Rajendra).
- Usual renaming/commit-log-updates/etc changes done.
V1->V2:
- Add support for setting constraints for devices created from DT.
- Allow handling deferred devices earlier then late_init.
- Remove 'default y' line from kconfig.
- Drop '=" after boot_constraints_disable kernel param.
- Dropped the dummy testing patch now.
--
viresh
[1] https://marc.info/?l=dri-devel&m=149979722606563&w=2
Rajendra Nayak (1):
drivers: boot_constraint: Add Qualcomm display controller constraints
Viresh Kumar (7):
drivers: Add boot constraints core
drivers: boot_constraint: Add boot_constraints_disable kernel
parameter
drivers: boot_constraint: Add support for supply constraints
drivers: boot_constraint: Add support for clk constraints
drivers: boot_constraint: Add support for PM constraints
drivers: boot_constraint: Add debugfs support
drivers: boot_constraint: Manage deferrable constraints
Documentation/admin-guide/kernel-parameters.txt | 3 +
drivers/base/Kconfig | 10 +
drivers/base/Makefile | 1 +
drivers/base/base.h | 1 +
drivers/base/boot_constraints/Makefile | 3 +
drivers/base/boot_constraints/clk.c | 74 ++++++
drivers/base/boot_constraints/core.c | 300 ++++++++++++++++++++++++
drivers/base/boot_constraints/core.h | 50 ++++
drivers/base/boot_constraints/deferrable_dev.c | 192 +++++++++++++++
drivers/base/boot_constraints/pm.c | 32 +++
drivers/base/boot_constraints/qcom-display.c | 107 +++++++++
drivers/base/boot_constraints/supply.c | 108 +++++++++
drivers/base/dd.c | 32 ++-
include/linux/boot_constraint.h | 68 ++++++
14 files changed, 974 insertions(+), 7 deletions(-)
create mode 100644 drivers/base/boot_constraints/Makefile
create mode 100644 drivers/base/boot_constraints/clk.c
create mode 100644 drivers/base/boot_constraints/core.c
create mode 100644 drivers/base/boot_constraints/core.h
create mode 100644 drivers/base/boot_constraints/deferrable_dev.c
create mode 100644 drivers/base/boot_constraints/pm.c
create mode 100644 drivers/base/boot_constraints/qcom-display.c
create mode 100644 drivers/base/boot_constraints/supply.c
create mode 100644 include/linux/boot_constraint.h
--
2.13.0.71.gd7076ec9c9cb
[toc] | [next] | [standalone]
| From | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| Date | 2017-08-01 11:40 +0200 |
| Subject | [PATCH V3 2/8] drivers: boot_constraint: Add boot_constraints_disable kernel parameter |
| Message-ID | <u9BOG-1MA-9@gated-at.bofh.it> |
| In reply to | #1700790 |
Users must be given an option to discard any constraints set by
bootloaders. For example, consider that a constraint is set for the LCD
controller's supply and the LCD driver isn't loaded by the kernel. If
the user doesn't need to use the LCD device, then he shouldn't be forced
to honour the constraint.
We can also think about finer control of such constraints with help of
some sysfs files, but a kernel parameter is fine to begin with.
Tested-by: Rajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
Documentation/admin-guide/kernel-parameters.txt | 3 +++
drivers/base/boot_constraints/core.c | 17 +++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index d9c171ce4190..0706d1b6004d 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -426,6 +426,9 @@
embedded devices based on command line input.
See Documentation/block/cmdline-partition.txt
+ boot_constraints_disable
+ Do not set any boot constraints for devices.
+
boot_delay= Milliseconds to delay each printk during boot.
Values larger than 10 seconds (10000) are changed to
no delay (0).
diff --git a/drivers/base/boot_constraints/core.c b/drivers/base/boot_constraints/core.c
index 366a05d6d9ba..e0c33b2b216f 100644
--- a/drivers/base/boot_constraints/core.c
+++ b/drivers/base/boot_constraints/core.c
@@ -24,6 +24,17 @@
static LIST_HEAD(constraint_devices);
static DEFINE_MUTEX(constraint_devices_mutex);
+static bool boot_constraints_disabled;
+
+static int __init constraints_disable(char *str)
+{
+ boot_constraints_disabled = true;
+ pr_debug("disabled\n");
+
+ return 0;
+}
+early_param("boot_constraints_disable", constraints_disable);
+
/* Boot constraints core */
static struct constraint_dev *constraint_device_find(struct device *dev)
@@ -126,6 +137,9 @@ int dev_boot_constraint_add(struct device *dev,
struct constraint *constraint;
int ret;
+ if (boot_constraints_disabled)
+ return -ENODEV;
+
mutex_lock(&constraint_devices_mutex);
/* Find or add the cdev type first */
@@ -184,6 +198,9 @@ void dev_boot_constraints_remove(struct device *dev)
struct constraint_dev *cdev;
struct constraint *constraint, *temp;
+ if (boot_constraints_disabled)
+ return;
+
mutex_lock(&constraint_devices_mutex);
cdev = constraint_device_find(dev);
--
2.13.0.71.gd7076ec9c9cb
[toc] | [prev] | [next] | [standalone]
| From | Viresh Kumar <viresh.kumar@linaro.org> |
|---|---|
| Date | 2017-08-01 11:40 +0200 |
| Subject | [PATCH V3 4/8] drivers: boot_constraint: Add support for clk constraints |
| Message-ID | <u9BOG-1MA-5@gated-at.bofh.it> |
| In reply to | #1700790 |
This patch adds the clk constraint type.
The constraint is set by enabling the clk for the device. Once the
device is probed, the clk is disabled and the constraint is removed.
We may want to do clk_set_rate() from here, but lets wait for some real
users that really want it.
Tested-by: Rajendra Nayak <rnayak@codeaurora.org>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
drivers/base/boot_constraints/Makefile | 2 +-
drivers/base/boot_constraints/clk.c | 70 ++++++++++++++++++++++++++++++++++
drivers/base/boot_constraints/core.c | 4 ++
drivers/base/boot_constraints/core.h | 3 ++
include/linux/boot_constraint.h | 5 +++
5 files changed, 83 insertions(+), 1 deletion(-)
create mode 100644 drivers/base/boot_constraints/clk.c
diff --git a/drivers/base/boot_constraints/Makefile b/drivers/base/boot_constraints/Makefile
index a45616f0c3b0..3424379fd1e4 100644
--- a/drivers/base/boot_constraints/Makefile
+++ b/drivers/base/boot_constraints/Makefile
@@ -1,3 +1,3 @@
# Makefile for device boot constraints
-obj-y := core.o supply.o
+obj-y := clk.o core.o supply.o
diff --git a/drivers/base/boot_constraints/clk.c b/drivers/base/boot_constraints/clk.c
new file mode 100644
index 000000000000..b5b1d63c3e76
--- /dev/null
+++ b/drivers/base/boot_constraints/clk.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 Linaro.
+ * Viresh Kumar <viresh.kumar@linaro.org>
+ *
+ * This file is released under the GPLv2.
+ */
+
+#define pr_fmt(fmt) "Clock Boot Constraints: " fmt
+
+#include <linux/clk.h>
+#include <linux/err.h>
+#include <linux/slab.h>
+
+#include "core.h"
+
+struct constraint_clk {
+ struct dev_boot_constraint_clk_info clk_info;
+ struct clk *clk;
+};
+
+int constraint_clk_add(struct constraint *constraint, void *data)
+{
+ struct dev_boot_constraint_clk_info *clk_info = data;
+ struct constraint_clk *cclk;
+ struct device *dev = constraint->cdev->dev;
+ int ret;
+
+ cclk = kzalloc(sizeof(*cclk), GFP_KERNEL);
+ if (!cclk)
+ return -ENOMEM;
+
+ cclk->clk = clk_get(dev, clk_info->name);
+ if (IS_ERR(cclk->clk)) {
+ ret = PTR_ERR(cclk->clk);
+ if (ret != -EPROBE_DEFER) {
+ dev_err(dev, "clk_get() failed for %s (%d)\n",
+ clk_info->name, ret);
+ }
+ goto free;
+ }
+
+ ret = clk_prepare_enable(cclk->clk);
+ if (ret) {
+ dev_err(dev, "clk_prepare_enable() %s failed (%d)\n",
+ clk_info->name, ret);
+ goto put_clk;
+ }
+
+ cclk->clk_info.name = kstrdup_const(clk_info->name, GFP_KERNEL);
+ constraint->private = cclk;
+
+ return 0;
+
+put_clk:
+ clk_put(cclk->clk);
+free:
+ kfree(cclk);
+
+ return ret;
+}
+
+void constraint_clk_remove(struct constraint *constraint)
+{
+ struct constraint_clk *cclk = constraint->private;
+
+ kfree_const(cclk->clk_info.name);
+ clk_disable_unprepare(cclk->clk);
+ clk_put(cclk->clk);
+ kfree(cclk);
+}
diff --git a/drivers/base/boot_constraints/core.c b/drivers/base/boot_constraints/core.c
index 06b618a85c0a..88568ed1bfad 100644
--- a/drivers/base/boot_constraints/core.c
+++ b/drivers/base/boot_constraints/core.c
@@ -105,6 +105,10 @@ static struct constraint *constraint_allocate(struct constraint_dev *cdev,
void (*remove)(struct constraint *constraint);
switch (type) {
+ case DEV_BOOT_CONSTRAINT_CLK:
+ add = constraint_clk_add;
+ remove = constraint_clk_remove;
+ break;
case DEV_BOOT_CONSTRAINT_SUPPLY:
add = constraint_supply_add;
remove = constraint_supply_remove;
diff --git a/drivers/base/boot_constraints/core.h b/drivers/base/boot_constraints/core.h
index 73b9d2d22a12..4f28ac2ef691 100644
--- a/drivers/base/boot_constraints/core.h
+++ b/drivers/base/boot_constraints/core.h
@@ -30,6 +30,9 @@ struct constraint {
};
/* Forward declarations of constraint specific callbacks */
+int constraint_clk_add(struct constraint *constraint, void *data);
+void constraint_clk_remove(struct constraint *constraint);
+
int constraint_supply_add(struct constraint *constraint, void *data);
void constraint_supply_remove(struct constraint *constraint);
diff --git a/include/linux/boot_constraint.h b/include/linux/boot_constraint.h
index d19b8ec2f10d..a2696002e6e1 100644
--- a/include/linux/boot_constraint.h
+++ b/include/linux/boot_constraint.h
@@ -15,9 +15,14 @@
struct device;
enum dev_boot_constraint_type {
+ DEV_BOOT_CONSTRAINT_CLK,
DEV_BOOT_CONSTRAINT_SUPPLY,
};
+struct dev_boot_constraint_clk_info {
+ const char *name;
+};
+
struct dev_boot_constraint_supply_info {
const char *name;
unsigned int u_volt_min;
--
2.13.0.71.gd7076ec9c9cb
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web