Compare commits
20 Commits
master
...
f29-riscv6
Author | SHA1 | Date |
---|---|---|
David Abdurachmanov | 24ef14817b | |
David Abdurachmanov | f72820cd8f | |
David Abdurachmanov | 4b722cac34 | |
David Abdurachmanov | 22e71c9173 | |
David Abdurachmanov | bf6565ba91 | |
David Abdurachmanov | 7a2f3d62e7 | |
David Abdurachmanov | 6afa6a1d1d | |
David Abdurachmanov | 61da5462ab | |
David Abdurachmanov | 1838232458 | |
David Abdurachmanov | 8d4ff40415 | |
David Abdurachmanov | f47d31c65b | |
David Abdurachmanov | 80112e26ae | |
David Abdurachmanov | 676aad9847 | |
David Abdurachmanov | 65627459ed | |
David Abdurachmanov | fd01e1b407 | |
David Abdurachmanov | e93b45642b | |
David Abdurachmanov | 088edc4af9 | |
David Abdurachmanov | 681c2dab76 | |
David Abdurachmanov | 7094da6400 | |
David Abdurachmanov | b3c173bfe0 |
|
@ -1,2 +1,10 @@
|
||||||
|
clog
|
||||||
*.xz
|
*.xz
|
||||||
*.bz2
|
*.bz2
|
||||||
|
*.rpm
|
||||||
|
*.orig
|
||||||
|
*.sign
|
||||||
|
kernel-[234].*/
|
||||||
|
perf-man-*.tar.gz
|
||||||
|
kernel-headers/
|
||||||
|
kernel-tools/
|
||||||
|
|
|
@ -0,0 +1,109 @@
|
||||||
|
From 3ce5852ec6add45a28fe1706e9163351940e905c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Jones <pjones@redhat.com>
|
||||||
|
Date: Mon, 2 Oct 2017 18:25:29 -0400
|
||||||
|
Subject: [PATCH 1/3] Make get_cert_list() not complain about cert lists that
|
||||||
|
aren't present.
|
||||||
|
|
||||||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||||
|
---
|
||||||
|
certs/load_uefi.c | 37 ++++++++++++++++++++++---------------
|
||||||
|
1 file changed, 22 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/certs/load_uefi.c b/certs/load_uefi.c
|
||||||
|
index 3d884598601..9ef34c44fd1 100644
|
||||||
|
--- a/certs/load_uefi.c
|
||||||
|
+++ b/certs/load_uefi.c
|
||||||
|
@@ -35,8 +35,8 @@ static __init bool uefi_check_ignore_db(void)
|
||||||
|
/*
|
||||||
|
* Get a certificate list blob from the named EFI variable.
|
||||||
|
*/
|
||||||
|
-static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
- unsigned long *size)
|
||||||
|
+static __init int get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
+ unsigned long *size, void **cert_list)
|
||||||
|
{
|
||||||
|
efi_status_t status;
|
||||||
|
unsigned long lsize = 4;
|
||||||
|
@@ -44,26 +44,33 @@ static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
void *db;
|
||||||
|
|
||||||
|
status = efi.get_variable(name, guid, NULL, &lsize, &tmpdb);
|
||||||
|
+ if (status == EFI_NOT_FOUND) {
|
||||||
|
+ *size = 0;
|
||||||
|
+ *cert_list = NULL;
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
pr_err("Couldn't get size: 0x%lx\n", status);
|
||||||
|
- return NULL;
|
||||||
|
+ return efi_status_to_err(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
db = kmalloc(lsize, GFP_KERNEL);
|
||||||
|
if (!db) {
|
||||||
|
pr_err("Couldn't allocate memory for uefi cert list\n");
|
||||||
|
- return NULL;
|
||||||
|
+ return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = efi.get_variable(name, guid, NULL, &lsize, db);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
kfree(db);
|
||||||
|
pr_err("Error reading db var: 0x%lx\n", status);
|
||||||
|
- return NULL;
|
||||||
|
+ return efi_status_to_err(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
*size = lsize;
|
||||||
|
- return db;
|
||||||
|
+ *cert_list = db;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -152,10 +159,10 @@ static int __init load_uefi_certs(void)
|
||||||
|
* an error if we can't get them.
|
||||||
|
*/
|
||||||
|
if (!uefi_check_ignore_db()) {
|
||||||
|
- db = get_cert_list(L"db", &secure_var, &dbsize);
|
||||||
|
- if (!db) {
|
||||||
|
+ rc = get_cert_list(L"db", &secure_var, &dbsize, &db);
|
||||||
|
+ if (rc < 0) {
|
||||||
|
pr_err("MODSIGN: Couldn't get UEFI db list\n");
|
||||||
|
- } else {
|
||||||
|
+ } else if (dbsize != 0) {
|
||||||
|
rc = parse_efi_signature_list("UEFI:db",
|
||||||
|
db, dbsize, get_handler_for_db);
|
||||||
|
if (rc)
|
||||||
|
@@ -164,10 +171,10 @@ static int __init load_uefi_certs(void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- mok = get_cert_list(L"MokListRT", &mok_var, &moksize);
|
||||||
|
- if (!mok) {
|
||||||
|
+ rc = get_cert_list(L"MokListRT", &mok_var, &moksize, &mok);
|
||||||
|
+ if (rc < 0) {
|
||||||
|
pr_info("MODSIGN: Couldn't get UEFI MokListRT\n");
|
||||||
|
- } else {
|
||||||
|
+ } else if (moksize != 0) {
|
||||||
|
rc = parse_efi_signature_list("UEFI:MokListRT",
|
||||||
|
mok, moksize, get_handler_for_db);
|
||||||
|
if (rc)
|
||||||
|
@@ -175,10 +182,10 @@ static int __init load_uefi_certs(void)
|
||||||
|
kfree(mok);
|
||||||
|
}
|
||||||
|
|
||||||
|
- dbx = get_cert_list(L"dbx", &secure_var, &dbxsize);
|
||||||
|
- if (!dbx) {
|
||||||
|
+ rc = get_cert_list(L"dbx", &secure_var, &dbxsize, &dbx);
|
||||||
|
+ if (rc < 0) {
|
||||||
|
pr_info("MODSIGN: Couldn't get UEFI dbx list\n");
|
||||||
|
- } else {
|
||||||
|
+ } else if (dbxsize != 0) {
|
||||||
|
rc = parse_efi_signature_list("UEFI:dbx",
|
||||||
|
dbx, dbxsize,
|
||||||
|
get_handler_for_dbx);
|
||||||
|
--
|
||||||
|
2.15.0
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
From 0eadbb65c0026fb4eec89c54f6b48a0febd87f92 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Laura Abbott <labbott@redhat.com>
|
||||||
|
Date: Fri, 9 Sep 2016 08:19:17 -0700
|
||||||
|
Subject: [PATCH] iio: Use type header from kernel tree
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
To: Jonathan Cameron <jic23@kernel.org>
|
||||||
|
To: Hartmut Knaack <knaack.h@gmx.de>
|
||||||
|
To: Lars-Peter Clausen <lars@metafoo.de>
|
||||||
|
To: Peter Meerwald-Stadler <pmeerw@pmeerw.net>
|
||||||
|
Cc: linux-iio@vger.kernel.org
|
||||||
|
Cc: linux-kernel@vger.kernel.org
|
||||||
|
|
||||||
|
|
||||||
|
The iio tools have been updated as new event types have been added to
|
||||||
|
the kernel. The tools currently use the standard system headers which
|
||||||
|
means that the system may not have the newest defintitions. This leads
|
||||||
|
to build failures when building newer tools on older hosts:
|
||||||
|
|
||||||
|
gcc -Wall -g -D_GNU_SOURCE -c -o iio_event_monitor.o
|
||||||
|
iio_event_monitor.c
|
||||||
|
iio_event_monitor.c:59:3: error: ‘IIO_UVINDEX’ undeclared here (not in a
|
||||||
|
function)
|
||||||
|
[IIO_UVINDEX] = "uvindex",
|
||||||
|
^~~~~~~~~~~
|
||||||
|
iio_event_monitor.c:59:3: error: array index in initializer not of
|
||||||
|
integer type
|
||||||
|
iio_event_monitor.c:59:3: note: (near initialization for
|
||||||
|
‘iio_chan_type_name_spec’)
|
||||||
|
iio_event_monitor.c:97:3: error: ‘IIO_MOD_LIGHT_UV’ undeclared here (not
|
||||||
|
in a function)
|
||||||
|
[IIO_MOD_LIGHT_UV] = "uv",
|
||||||
|
^~~~~~~~~~~~~~~~
|
||||||
|
iio_event_monitor.c:97:3: error: array index in initializer not of
|
||||||
|
integer type
|
||||||
|
iio_event_monitor.c:97:3: note: (near initialization for
|
||||||
|
‘iio_modifier_names’)
|
||||||
|
<builtin>: recipe for target 'iio_event_monitor.o' failed
|
||||||
|
|
||||||
|
Switch to using the header from the kernel tree to ensure the newest
|
||||||
|
defintions are always picked up.
|
||||||
|
|
||||||
|
Signed-off-by: Laura Abbott <labbott@redhat.com>
|
||||||
|
---
|
||||||
|
tools/iio/iio_event_monitor.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tools/iio/iio_event_monitor.c b/tools/iio/iio_event_monitor.c
|
||||||
|
index d9b7e0f..f02523d 100644
|
||||||
|
--- a/tools/iio/iio_event_monitor.c
|
||||||
|
+++ b/tools/iio/iio_event_monitor.c
|
||||||
|
@@ -26,7 +26,7 @@
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include "iio_utils.h"
|
||||||
|
#include <linux/iio/events.h>
|
||||||
|
-#include <linux/iio/types.h>
|
||||||
|
+#include "../../include/uapi/linux/iio/types.h"
|
||||||
|
|
||||||
|
static const char * const iio_chan_type_name_spec[] = {
|
||||||
|
[IIO_VOLTAGE] = "voltage",
|
||||||
|
--
|
||||||
|
2.7.4
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
From c8218e9b3c38fcd36a2d06eec09952a0c6cee9e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Jones <pjones@redhat.com>
|
||||||
|
Date: Mon, 2 Oct 2017 18:22:13 -0400
|
||||||
|
Subject: [PATCH 2/3] Add efi_status_to_str() and rework efi_status_to_err().
|
||||||
|
|
||||||
|
This adds efi_status_to_str() for use when printing efi_status_t
|
||||||
|
messages, and reworks efi_status_to_err() so that the two use a common
|
||||||
|
list of errors.
|
||||||
|
|
||||||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||||
|
---
|
||||||
|
include/linux/efi.h | 3 ++
|
||||||
|
drivers/firmware/efi/efi.c | 122 ++++++++++++++++++++++++++++++++++-----------
|
||||||
|
2 files changed, 95 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||||
|
index 18b16bf5ce1..436b3c93c3d 100644
|
||||||
|
--- a/include/linux/efi.h
|
||||||
|
+++ b/include/linux/efi.h
|
||||||
|
@@ -42,6 +42,8 @@
|
||||||
|
#define EFI_ABORTED (21 | (1UL << (BITS_PER_LONG-1)))
|
||||||
|
#define EFI_SECURITY_VIOLATION (26 | (1UL << (BITS_PER_LONG-1)))
|
||||||
|
|
||||||
|
+#define EFI_IS_ERROR(x) ((x) & (1UL << (BITS_PER_LONG-1)))
|
||||||
|
+
|
||||||
|
typedef unsigned long efi_status_t;
|
||||||
|
typedef u8 efi_bool_t;
|
||||||
|
typedef u16 efi_char16_t; /* UNICODE character */
|
||||||
|
@@ -1183,6 +1185,7 @@ static inline void efi_set_secure_boot(enum efi_secureboot_mode mode) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern int efi_status_to_err(efi_status_t status);
|
||||||
|
+extern const char *efi_status_to_str(efi_status_t status);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Variable Attributes
|
||||||
|
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
|
||||||
|
index 557a47829d0..e8f9c7d84e9 100644
|
||||||
|
--- a/drivers/firmware/efi/efi.c
|
||||||
|
+++ b/drivers/firmware/efi/efi.c
|
||||||
|
@@ -31,6 +31,7 @@
|
||||||
|
#include <linux/acpi.h>
|
||||||
|
#include <linux/ucs2_string.h>
|
||||||
|
#include <linux/memblock.h>
|
||||||
|
+#include <linux/bsearch.h>
|
||||||
|
|
||||||
|
#include <asm/early_ioremap.h>
|
||||||
|
|
||||||
|
@@ -865,40 +866,101 @@ int efi_mem_type(unsigned long phys_addr)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+struct efi_error_code {
|
||||||
|
+ efi_status_t status;
|
||||||
|
+ int errno;
|
||||||
|
+ const char *description;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct efi_error_code efi_error_codes[] = {
|
||||||
|
+ { EFI_SUCCESS, 0, "Success"},
|
||||||
|
+#if 0
|
||||||
|
+ { EFI_LOAD_ERROR, -EPICK_AN_ERRNO, "Load Error"},
|
||||||
|
+#endif
|
||||||
|
+ { EFI_INVALID_PARAMETER, -EINVAL, "Invalid Parameter"},
|
||||||
|
+ { EFI_UNSUPPORTED, -ENOSYS, "Unsupported"},
|
||||||
|
+ { EFI_BAD_BUFFER_SIZE, -ENOSPC, "Bad Buffer Size"},
|
||||||
|
+ { EFI_BUFFER_TOO_SMALL, -ENOSPC, "Buffer Too Small"},
|
||||||
|
+ { EFI_NOT_READY, -EAGAIN, "Not Ready"},
|
||||||
|
+ { EFI_DEVICE_ERROR, -EIO, "Device Error"},
|
||||||
|
+ { EFI_WRITE_PROTECTED, -EROFS, "Write Protected"},
|
||||||
|
+ { EFI_OUT_OF_RESOURCES, -ENOMEM, "Out of Resources"},
|
||||||
|
+#if 0
|
||||||
|
+ { EFI_VOLUME_CORRUPTED, -EPICK_AN_ERRNO, "Volume Corrupt"},
|
||||||
|
+ { EFI_VOLUME_FULL, -EPICK_AN_ERRNO, "Volume Full"},
|
||||||
|
+ { EFI_NO_MEDIA, -EPICK_AN_ERRNO, "No Media"},
|
||||||
|
+ { EFI_MEDIA_CHANGED, -EPICK_AN_ERRNO, "Media changed"},
|
||||||
|
+#endif
|
||||||
|
+ { EFI_NOT_FOUND, -ENOENT, "Not Found"},
|
||||||
|
+#if 0
|
||||||
|
+ { EFI_ACCESS_DENIED, -EPICK_AN_ERRNO, "Access Denied"},
|
||||||
|
+ { EFI_NO_RESPONSE, -EPICK_AN_ERRNO, "No Response"},
|
||||||
|
+ { EFI_NO_MAPPING, -EPICK_AN_ERRNO, "No mapping"},
|
||||||
|
+ { EFI_TIMEOUT, -EPICK_AN_ERRNO, "Time out"},
|
||||||
|
+ { EFI_NOT_STARTED, -EPICK_AN_ERRNO, "Not started"},
|
||||||
|
+ { EFI_ALREADY_STARTED, -EPICK_AN_ERRNO, "Already started"},
|
||||||
|
+#endif
|
||||||
|
+ { EFI_ABORTED, -EINTR, "Aborted"},
|
||||||
|
+#if 0
|
||||||
|
+ { EFI_ICMP_ERROR, -EPICK_AN_ERRNO, "ICMP Error"},
|
||||||
|
+ { EFI_TFTP_ERROR, -EPICK_AN_ERRNO, "TFTP Error"},
|
||||||
|
+ { EFI_PROTOCOL_ERROR, -EPICK_AN_ERRNO, "Protocol Error"},
|
||||||
|
+ { EFI_INCOMPATIBLE_VERSION, -EPICK_AN_ERRNO, "Incompatible Version"},
|
||||||
|
+#endif
|
||||||
|
+ { EFI_SECURITY_VIOLATION, -EACCES, "Security Policy Violation"},
|
||||||
|
+#if 0
|
||||||
|
+ { EFI_CRC_ERROR, -EPICK_AN_ERRNO, "CRC Error"},
|
||||||
|
+ { EFI_END_OF_MEDIA, -EPICK_AN_ERRNO, "End of Media"},
|
||||||
|
+ { EFI_END_OF_FILE, -EPICK_AN_ERRNO, "End of File"},
|
||||||
|
+ { EFI_INVALID_LANGUAGE, -EPICK_AN_ERRNO, "Invalid Languages"},
|
||||||
|
+ { EFI_COMPROMISED_DATA, -EPICK_AN_ERRNO, "Compromised Data"},
|
||||||
|
+
|
||||||
|
+ // warnings
|
||||||
|
+ { EFI_WARN_UNKOWN_GLYPH, -EPICK_AN_ERRNO, "Warning Unknown Glyph"},
|
||||||
|
+ { EFI_WARN_DELETE_FAILURE, -EPICK_AN_ERRNO, "Warning Delete Failure"},
|
||||||
|
+ { EFI_WARN_WRITE_FAILURE, -EPICK_AN_ERRNO, "Warning Write Failure"},
|
||||||
|
+ { EFI_WARN_BUFFER_TOO_SMALL, -EPICK_AN_ERRNO, "Warning Buffer Too Small"},
|
||||||
|
+#endif
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+efi_status_cmp_bsearch(const void *key, const void *item)
|
||||||
|
+{
|
||||||
|
+ u64 status = (u64)(uintptr_t)key;
|
||||||
|
+ struct efi_error_code *code = (struct efi_error_code *)item;
|
||||||
|
+
|
||||||
|
+ if (status < code->status)
|
||||||
|
+ return -1;
|
||||||
|
+ if (status > code->status)
|
||||||
|
+ return 1;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int efi_status_to_err(efi_status_t status)
|
||||||
|
{
|
||||||
|
- int err;
|
||||||
|
+ struct efi_error_code *found;
|
||||||
|
+ size_t num = sizeof(efi_error_codes) / sizeof(struct efi_error_code);
|
||||||
|
|
||||||
|
- switch (status) {
|
||||||
|
- case EFI_SUCCESS:
|
||||||
|
- err = 0;
|
||||||
|
- break;
|
||||||
|
- case EFI_INVALID_PARAMETER:
|
||||||
|
- err = -EINVAL;
|
||||||
|
- break;
|
||||||
|
- case EFI_OUT_OF_RESOURCES:
|
||||||
|
- err = -ENOSPC;
|
||||||
|
- break;
|
||||||
|
- case EFI_DEVICE_ERROR:
|
||||||
|
- err = -EIO;
|
||||||
|
- break;
|
||||||
|
- case EFI_WRITE_PROTECTED:
|
||||||
|
- err = -EROFS;
|
||||||
|
- break;
|
||||||
|
- case EFI_SECURITY_VIOLATION:
|
||||||
|
- err = -EACCES;
|
||||||
|
- break;
|
||||||
|
- case EFI_NOT_FOUND:
|
||||||
|
- err = -ENOENT;
|
||||||
|
- break;
|
||||||
|
- case EFI_ABORTED:
|
||||||
|
- err = -EINTR;
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- err = -EINVAL;
|
||||||
|
- }
|
||||||
|
+ found = bsearch((void *)(uintptr_t)status, efi_error_codes,
|
||||||
|
+ sizeof(struct efi_error_code), num,
|
||||||
|
+ efi_status_cmp_bsearch);
|
||||||
|
+ if (!found)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ return found->errno;
|
||||||
|
+}
|
||||||
|
|
||||||
|
- return err;
|
||||||
|
+const char *
|
||||||
|
+efi_status_to_str(efi_status_t status)
|
||||||
|
+{
|
||||||
|
+ struct efi_error_code *found;
|
||||||
|
+ size_t num = sizeof(efi_error_codes) / sizeof(struct efi_error_code);
|
||||||
|
+
|
||||||
|
+ found = bsearch((void *)(uintptr_t)status, efi_error_codes,
|
||||||
|
+ sizeof(struct efi_error_code), num,
|
||||||
|
+ efi_status_cmp_bsearch);
|
||||||
|
+ if (!found)
|
||||||
|
+ return "Unknown error code";
|
||||||
|
+ return found->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool efi_is_table_address(unsigned long phys_addr)
|
||||||
|
--
|
||||||
|
2.15.0
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
From 520e902d864930e2d4f329983d9ae9781a24231f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Jones <pjones@redhat.com>
|
||||||
|
Date: Mon, 2 Oct 2017 18:18:30 -0400
|
||||||
|
Subject: [PATCH 3/3] Make get_cert_list() use efi_status_to_str() to print
|
||||||
|
error messages.
|
||||||
|
|
||||||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||||||
|
---
|
||||||
|
certs/load_uefi.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/certs/load_uefi.c b/certs/load_uefi.c
|
||||||
|
index 9ef34c44fd1..13a2826715d 100644
|
||||||
|
--- a/certs/load_uefi.c
|
||||||
|
+++ b/certs/load_uefi.c
|
||||||
|
@@ -51,7 +51,8 @@ static __init int get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
- pr_err("Couldn't get size: 0x%lx\n", status);
|
||||||
|
+ pr_err("Couldn't get size: %s (0x%lx)\n",
|
||||||
|
+ efi_status_to_str(status), status);
|
||||||
|
return efi_status_to_err(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -64,7 +65,8 @@ static __init int get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
status = efi.get_variable(name, guid, NULL, &lsize, db);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
kfree(db);
|
||||||
|
- pr_err("Error reading db var: 0x%lx\n", status);
|
||||||
|
+ pr_err("Error reading db var: %s (0x%lx)\n",
|
||||||
|
+ efi_status_to_str(status), status);
|
||||||
|
return efi_status_to_err(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.15.0
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
From dbdda4277cf0422a9ccb7ea98d0263c3cdbecdf6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Salter <msalter@redhat.com>
|
||||||
|
Date: Tue, 8 May 2018 21:54:39 -0400
|
||||||
|
Subject: [PATCH] ACPI / irq: Workaround firmware issue on X-Gene based
|
||||||
|
m400
|
||||||
|
|
||||||
|
The ACPI firmware on the xgene-based m400 platorms erroneously
|
||||||
|
describes its UART interrupt as ACPI_PRODUCER rather than
|
||||||
|
ACPI_CONSUMER. This leads to the UART driver being unable to
|
||||||
|
find its interrupt and the kernel unable find a console.
|
||||||
|
Work around this by avoiding the producer/consumer check
|
||||||
|
for X-Gene UARTs.
|
||||||
|
|
||||||
|
Signed-off-by: Mark Salter <msalter@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/acpi/irq.c | 17 +++++++++++++++--
|
||||||
|
1 file changed, 15 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c
|
||||||
|
index 7c352cba0528..028c1a564cff 100644
|
||||||
|
--- a/drivers/acpi/irq.c
|
||||||
|
+++ b/drivers/acpi/irq.c
|
||||||
|
@@ -129,6 +129,7 @@ struct acpi_irq_parse_one_ctx {
|
||||||
|
unsigned int index;
|
||||||
|
unsigned long *res_flags;
|
||||||
|
struct irq_fwspec *fwspec;
|
||||||
|
+ bool skip_producer_check;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -200,7 +201,8 @@ static acpi_status acpi_irq_parse_one_cb(struct acpi_resource *ares,
|
||||||
|
return AE_CTRL_TERMINATE;
|
||||||
|
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
|
||||||
|
eirq = &ares->data.extended_irq;
|
||||||
|
- if (eirq->producer_consumer == ACPI_PRODUCER)
|
||||||
|
+ if (!ctx->skip_producer_check &&
|
||||||
|
+ eirq->producer_consumer == ACPI_PRODUCER)
|
||||||
|
return AE_OK;
|
||||||
|
if (ctx->index >= eirq->interrupt_count) {
|
||||||
|
ctx->index -= eirq->interrupt_count;
|
||||||
|
@@ -235,8 +237,19 @@ static acpi_status acpi_irq_parse_one_cb(struct acpi_resource *ares,
|
||||||
|
static int acpi_irq_parse_one(acpi_handle handle, unsigned int index,
|
||||||
|
struct irq_fwspec *fwspec, unsigned long *flags)
|
||||||
|
{
|
||||||
|
- struct acpi_irq_parse_one_ctx ctx = { -EINVAL, index, flags, fwspec };
|
||||||
|
+ struct acpi_irq_parse_one_ctx ctx = { -EINVAL, index, flags, fwspec, false };
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Firmware on arm64-based HPE m400 platform incorrectly marks
|
||||||
|
+ * its UART interrupt as ACPI_PRODUCER rather than ACPI_CONSUMER.
|
||||||
|
+ * Don't do the producer/consumer check for that device.
|
||||||
|
+ */
|
||||||
|
+ if (IS_ENABLED(CONFIG_ARM64)) {
|
||||||
|
+ struct acpi_device *adev = acpi_bus_get_acpi_device(handle);
|
||||||
|
+
|
||||||
|
+ if (adev && !strcmp(acpi_device_hid(adev), "APMC0D08"))
|
||||||
|
+ ctx.skip_producer_check = true;
|
||||||
|
+ }
|
||||||
|
acpi_walk_resources(handle, METHOD_NAME__CRS, acpi_irq_parse_one_cb, &ctx);
|
||||||
|
return ctx.rc;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.17.0
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
From 1e494dc5f3140005ff1f17bc06c0c16d6d50d580 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mark Salter <msalter@redhat.com>
|
||||||
|
Date: Thu, 19 Apr 2018 23:29:47 -0400
|
||||||
|
Subject: [PATCH] ACPI / scan: Fix regression related to X-Gene UARTs
|
||||||
|
|
||||||
|
Commit e361d1f85855 ("ACPI / scan: Fix enumeration for special UART
|
||||||
|
devices") caused a regression with some X-Gene based platforms (Mustang
|
||||||
|
and M400) with invalid DSDT. The DSDT makes it appear that the UART
|
||||||
|
device is also a slave device attached to itself. With the above commit
|
||||||
|
the UART won't be enumerated by ACPI scan (slave serial devices shouldn't
|
||||||
|
be). So check for X-Gene UART device and skip slace device check on it.
|
||||||
|
|
||||||
|
Signed-off-by: Mark Salter <msalter@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/acpi/scan.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
|
||||||
|
index e1b6231cfa1c..542dafac4306 100644
|
||||||
|
--- a/drivers/acpi/scan.c
|
||||||
|
+++ b/drivers/acpi/scan.c
|
||||||
|
@@ -1567,6 +1567,14 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
|
||||||
|
if (!acpi_match_device_ids(device, i2c_multi_instantiate_ids))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Firmware on some arm64 X-Gene platforms will make the UART
|
||||||
|
+ * device appear as both a UART and a slave of that UART. Just
|
||||||
|
+ * bail out here for X-Gene UARTs.
|
||||||
|
+ */
|
||||||
|
+ if (!strcmp(acpi_device_hid(device), "APMC0D08"))
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
INIT_LIST_HEAD(&resource_list);
|
||||||
|
acpi_dev_get_resources(device, &resource_list,
|
||||||
|
acpi_check_serial_bus_slave,
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
From: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
Date: Thu, 3 May 2012 20:27:11 +0100
|
||||||
|
Subject: [PATCH] ARM: tegra: usb no reset
|
||||||
|
|
||||||
|
Patch for disconnect issues with storage attached to a
|
||||||
|
tegra-ehci controller
|
||||||
|
---
|
||||||
|
drivers/usb/core/hub.c | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||||
|
index 43cb2f2e3b43..7f838ec11c81 100644
|
||||||
|
--- a/drivers/usb/core/hub.c
|
||||||
|
+++ b/drivers/usb/core/hub.c
|
||||||
|
@@ -4996,6 +4996,13 @@ static void hub_event(struct work_struct *work)
|
||||||
|
(u16) hub->change_bits[0],
|
||||||
|
(u16) hub->event_bits[0]);
|
||||||
|
|
||||||
|
+ /* Don't disconnect USB-SATA on TrimSlice */
|
||||||
|
+ if (strcmp(dev_name(hdev->bus->controller), "tegra-ehci.0") == 0) {
|
||||||
|
+ if ((hdev->state == 7) && (hub->change_bits[0] == 0) &&
|
||||||
|
+ (hub->event_bits[0] == 0x2))
|
||||||
|
+ hub->event_bits[0] = 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* Lock the device, then check to see if we were
|
||||||
|
* disconnected while waiting for the lock to succeed. */
|
||||||
|
usb_lock_device(hdev);
|
|
@ -0,0 +1,60 @@
|
||||||
|
From 0451d4e795929a69a0fda6d960aa4b077c5bd179 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dave Howells <dhowells@redhat.com>
|
||||||
|
Date: Fri, 5 May 2017 08:21:58 +0100
|
||||||
|
Subject: [PATCH 1/4] efi: Add EFI signature data types
|
||||||
|
|
||||||
|
Add the data types that are used for containing hashes, keys and
|
||||||
|
certificates for cryptographic verification along with their corresponding
|
||||||
|
type GUIDs.
|
||||||
|
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
---
|
||||||
|
include/linux/efi.h | 25 +++++++++++++++++++++++++
|
||||||
|
1 file changed, 25 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||||
|
index ec36f42..3259ad6 100644
|
||||||
|
--- a/include/linux/efi.h
|
||||||
|
+++ b/include/linux/efi.h
|
||||||
|
@@ -614,6 +614,10 @@ void efi_native_runtime_setup(void);
|
||||||
|
#define EFI_IMAGE_SECURITY_DATABASE_GUID EFI_GUID(0xd719b2cb, 0x3d3a, 0x4596, 0xa3, 0xbc, 0xda, 0xd0, 0x0e, 0x67, 0x65, 0x6f)
|
||||||
|
#define EFI_SHIM_LOCK_GUID EFI_GUID(0x605dab50, 0xe046, 0x4300, 0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23)
|
||||||
|
|
||||||
|
+#define EFI_CERT_SHA256_GUID EFI_GUID(0xc1c41626, 0x504c, 0x4092, 0xac, 0xa9, 0x41, 0xf9, 0x36, 0x93, 0x43, 0x28)
|
||||||
|
+#define EFI_CERT_X509_GUID EFI_GUID(0xa5c059a1, 0x94e4, 0x4aa7, 0x87, 0xb5, 0xab, 0x15, 0x5c, 0x2b, 0xf0, 0x72)
|
||||||
|
+#define EFI_CERT_X509_SHA256_GUID EFI_GUID(0x3bd2a492, 0x96c0, 0x4079, 0xb4, 0x20, 0xfc, 0xf9, 0x8e, 0xf1, 0x03, 0xed)
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* This GUID is used to pass to the kernel proper the struct screen_info
|
||||||
|
* structure that was populated by the stub based on the GOP protocol instance
|
||||||
|
@@ -873,6 +877,27 @@ typedef struct {
|
||||||
|
efi_memory_desc_t entry[0];
|
||||||
|
} efi_memory_attributes_table_t;
|
||||||
|
|
||||||
|
+typedef struct {
|
||||||
|
+ efi_guid_t signature_owner;
|
||||||
|
+ u8 signature_data[];
|
||||||
|
+} efi_signature_data_t;
|
||||||
|
+
|
||||||
|
+typedef struct {
|
||||||
|
+ efi_guid_t signature_type;
|
||||||
|
+ u32 signature_list_size;
|
||||||
|
+ u32 signature_header_size;
|
||||||
|
+ u32 signature_size;
|
||||||
|
+ u8 signature_header[];
|
||||||
|
+ /* efi_signature_data_t signatures[][] */
|
||||||
|
+} efi_signature_list_t;
|
||||||
|
+
|
||||||
|
+typedef u8 efi_sha256_hash_t[32];
|
||||||
|
+
|
||||||
|
+typedef struct {
|
||||||
|
+ efi_sha256_hash_t to_be_signed_hash;
|
||||||
|
+ efi_time_t time_of_revocation;
|
||||||
|
+} efi_cert_x509_sha256_t;
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* All runtime access to EFI goes through this structure:
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
From e4c62c12635a371e43bd17e8d33a936668264491 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Dave Howells <dhowells@redhat.com>
|
||||||
|
Date: Fri, 5 May 2017 08:21:58 +0100
|
||||||
|
Subject: [PATCH 2/4] efi: Add an EFI signature blob parser
|
||||||
|
|
||||||
|
Add a function to parse an EFI signature blob looking for elements of
|
||||||
|
interest. A list is made up of a series of sublists, where all the
|
||||||
|
elements in a sublist are of the same type, but sublists can be of
|
||||||
|
different types.
|
||||||
|
|
||||||
|
For each sublist encountered, the function pointed to by the
|
||||||
|
get_handler_for_guid argument is called with the type specifier GUID and
|
||||||
|
returns either a pointer to a function to handle elements of that type or
|
||||||
|
NULL if the type is not of interest.
|
||||||
|
|
||||||
|
If the sublist is of interest, each element is passed to the handler
|
||||||
|
function in turn.
|
||||||
|
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
---
|
||||||
|
certs/Kconfig | 8 ++++
|
||||||
|
certs/Makefile | 1 +
|
||||||
|
certs/efi_parser.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
include/linux/efi.h | 9 +++++
|
||||||
|
4 files changed, 130 insertions(+)
|
||||||
|
create mode 100644 certs/efi_parser.c
|
||||||
|
|
||||||
|
diff --git a/certs/Kconfig b/certs/Kconfig
|
||||||
|
index 6ce51ed..630ae09 100644
|
||||||
|
--- a/certs/Kconfig
|
||||||
|
+++ b/certs/Kconfig
|
||||||
|
@@ -82,4 +82,12 @@ config SYSTEM_BLACKLIST_HASH_LIST
|
||||||
|
wrapper to incorporate the list into the kernel. Each <hash> should
|
||||||
|
be a string of hex digits.
|
||||||
|
|
||||||
|
+config EFI_SIGNATURE_LIST_PARSER
|
||||||
|
+ bool "EFI signature list parser"
|
||||||
|
+ depends on EFI
|
||||||
|
+ select X509_CERTIFICATE_PARSER
|
||||||
|
+ help
|
||||||
|
+ This option provides support for parsing EFI signature lists for
|
||||||
|
+ X.509 certificates and turning them into keys.
|
||||||
|
+
|
||||||
|
endmenu
|
||||||
|
diff --git a/certs/Makefile b/certs/Makefile
|
||||||
|
index 4119bb3..738151a 100644
|
||||||
|
--- a/certs/Makefile
|
||||||
|
+++ b/certs/Makefile
|
||||||
|
@@ -9,6 +9,7 @@ obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_hashes.o
|
||||||
|
else
|
||||||
|
obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_nohashes.o
|
||||||
|
endif
|
||||||
|
+obj-$(CONFIG_EFI_SIGNATURE_LIST_PARSER) += efi_parser.o
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_SYSTEM_TRUSTED_KEYRING),y)
|
||||||
|
|
||||||
|
diff --git a/certs/efi_parser.c b/certs/efi_parser.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..4e396f9
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/certs/efi_parser.c
|
||||||
|
@@ -0,0 +1,112 @@
|
||||||
|
+/* EFI signature/key/certificate list parser
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2012, 2016 Red Hat, Inc. All Rights Reserved.
|
||||||
|
+ * Written by David Howells (dhowells@redhat.com)
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU General Public Licence
|
||||||
|
+ * as published by the Free Software Foundation; either version
|
||||||
|
+ * 2 of the Licence, or (at your option) any later version.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#define pr_fmt(fmt) "EFI: "fmt
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/printk.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * parse_efi_signature_list - Parse an EFI signature list for certificates
|
||||||
|
+ * @source: The source of the key
|
||||||
|
+ * @data: The data blob to parse
|
||||||
|
+ * @size: The size of the data blob
|
||||||
|
+ * @get_handler_for_guid: Get the handler func for the sig type (or NULL)
|
||||||
|
+ *
|
||||||
|
+ * Parse an EFI signature list looking for elements of interest. A list is
|
||||||
|
+ * made up of a series of sublists, where all the elements in a sublist are of
|
||||||
|
+ * the same type, but sublists can be of different types.
|
||||||
|
+ *
|
||||||
|
+ * For each sublist encountered, the @get_handler_for_guid function is called
|
||||||
|
+ * with the type specifier GUID and returns either a pointer to a function to
|
||||||
|
+ * handle elements of that type or NULL if the type is not of interest.
|
||||||
|
+ *
|
||||||
|
+ * If the sublist is of interest, each element is passed to the handler
|
||||||
|
+ * function in turn.
|
||||||
|
+ *
|
||||||
|
+ * Error EBADMSG is returned if the list doesn't parse correctly and 0 is
|
||||||
|
+ * returned if the list was parsed correctly. No error can be returned from
|
||||||
|
+ * the @get_handler_for_guid function or the element handler function it
|
||||||
|
+ * returns.
|
||||||
|
+ */
|
||||||
|
+int __init parse_efi_signature_list(
|
||||||
|
+ const char *source,
|
||||||
|
+ const void *data, size_t size,
|
||||||
|
+ efi_element_handler_t (*get_handler_for_guid)(const efi_guid_t *))
|
||||||
|
+{
|
||||||
|
+ efi_element_handler_t handler;
|
||||||
|
+ unsigned offs = 0;
|
||||||
|
+
|
||||||
|
+ pr_devel("-->%s(,%zu)\n", __func__, size);
|
||||||
|
+
|
||||||
|
+ while (size > 0) {
|
||||||
|
+ const efi_signature_data_t *elem;
|
||||||
|
+ efi_signature_list_t list;
|
||||||
|
+ size_t lsize, esize, hsize, elsize;
|
||||||
|
+
|
||||||
|
+ if (size < sizeof(list))
|
||||||
|
+ return -EBADMSG;
|
||||||
|
+
|
||||||
|
+ memcpy(&list, data, sizeof(list));
|
||||||
|
+ pr_devel("LIST[%04x] guid=%pUl ls=%x hs=%x ss=%x\n",
|
||||||
|
+ offs,
|
||||||
|
+ list.signature_type.b, list.signature_list_size,
|
||||||
|
+ list.signature_header_size, list.signature_size);
|
||||||
|
+
|
||||||
|
+ lsize = list.signature_list_size;
|
||||||
|
+ hsize = list.signature_header_size;
|
||||||
|
+ esize = list.signature_size;
|
||||||
|
+ elsize = lsize - sizeof(list) - hsize;
|
||||||
|
+
|
||||||
|
+ if (lsize > size) {
|
||||||
|
+ pr_devel("<--%s() = -EBADMSG [overrun @%x]\n",
|
||||||
|
+ __func__, offs);
|
||||||
|
+ return -EBADMSG;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (lsize < sizeof(list) ||
|
||||||
|
+ lsize - sizeof(list) < hsize ||
|
||||||
|
+ esize < sizeof(*elem) ||
|
||||||
|
+ elsize < esize ||
|
||||||
|
+ elsize % esize != 0) {
|
||||||
|
+ pr_devel("- bad size combo @%x\n", offs);
|
||||||
|
+ return -EBADMSG;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ handler = get_handler_for_guid(&list.signature_type);
|
||||||
|
+ if (!handler) {
|
||||||
|
+ data += lsize;
|
||||||
|
+ size -= lsize;
|
||||||
|
+ offs += lsize;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ data += sizeof(list) + hsize;
|
||||||
|
+ size -= sizeof(list) + hsize;
|
||||||
|
+ offs += sizeof(list) + hsize;
|
||||||
|
+
|
||||||
|
+ for (; elsize > 0; elsize -= esize) {
|
||||||
|
+ elem = data;
|
||||||
|
+
|
||||||
|
+ pr_devel("ELEM[%04x]\n", offs);
|
||||||
|
+ handler(source,
|
||||||
|
+ &elem->signature_data,
|
||||||
|
+ esize - sizeof(*elem));
|
||||||
|
+
|
||||||
|
+ data += esize;
|
||||||
|
+ size -= esize;
|
||||||
|
+ offs += esize;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||||
|
index 3259ad6..08024c6 100644
|
||||||
|
--- a/include/linux/efi.h
|
||||||
|
+++ b/include/linux/efi.h
|
||||||
|
@@ -1055,6 +1055,15 @@ extern int efi_memattr_apply_permissions(struct mm_struct *mm,
|
||||||
|
char * __init efi_md_typeattr_format(char *buf, size_t size,
|
||||||
|
const efi_memory_desc_t *md);
|
||||||
|
|
||||||
|
+
|
||||||
|
+typedef void (*efi_element_handler_t)(const char *source,
|
||||||
|
+ const void *element_data,
|
||||||
|
+ size_t element_size);
|
||||||
|
+extern int __init parse_efi_signature_list(
|
||||||
|
+ const char *source,
|
||||||
|
+ const void *data, size_t size,
|
||||||
|
+ efi_element_handler_t (*get_handler_for_guid)(const efi_guid_t *));
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* efi_range_is_wc - check the WC bit on an address range
|
||||||
|
* @start: starting kvirt address
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,217 @@
|
||||||
|
From 6b6203b92cfb457a0669a9c87a29b360405bffc6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Matthew Garrett <matthew.garrett@nebula.com>
|
||||||
|
Date: Fri, 9 Aug 2013 18:36:30 -0400
|
||||||
|
Subject: [PATCH 10/20] Add option to automatically enforce module signatures
|
||||||
|
when in Secure Boot mode
|
||||||
|
|
||||||
|
UEFI Secure Boot provides a mechanism for ensuring that the firmware will
|
||||||
|
only load signed bootloaders and kernels. Certain use cases may also
|
||||||
|
require that all kernel modules also be signed. Add a configuration option
|
||||||
|
that enforces this automatically when enabled.
|
||||||
|
|
||||||
|
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
|
||||||
|
---
|
||||||
|
Documentation/x86/zero-page.txt | 2 ++
|
||||||
|
arch/x86/Kconfig | 11 ++++++
|
||||||
|
arch/x86/boot/compressed/eboot.c | 66 +++++++++++++++++++++++++++++++++++
|
||||||
|
arch/x86/include/uapi/asm/bootparam.h | 3 +-
|
||||||
|
arch/x86/kernel/setup.c | 6 ++++
|
||||||
|
include/linux/module.h | 6 ++++
|
||||||
|
kernel/module.c | 7 ++++
|
||||||
|
7 files changed, 100 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Documentation/x86/zero-page.txt b/Documentation/x86/zero-page.txt
|
||||||
|
index 95a4d34af3fd..b8527c6b7646 100644
|
||||||
|
--- a/Documentation/x86/zero-page.txt
|
||||||
|
+++ b/Documentation/x86/zero-page.txt
|
||||||
|
@@ -31,6 +31,8 @@ Offset Proto Name Meaning
|
||||||
|
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
|
||||||
|
1EA/001 ALL edd_mbr_sig_buf_entries Number of entries in edd_mbr_sig_buffer
|
||||||
|
(below)
|
||||||
|
+1EB/001 ALL kbd_status Numlock is enabled
|
||||||
|
+1EC/001 ALL secure_boot Secure boot is enabled in the firmware
|
||||||
|
1EF/001 ALL sentinel Used to detect broken bootloaders
|
||||||
|
290/040 ALL edd_mbr_sig_buffer EDD MBR signatures
|
||||||
|
2D0/A00 ALL e820_map E820 memory map table
|
||||||
|
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
|
||||||
|
index bada636d1065..d666ef8b616c 100644
|
||||||
|
--- a/arch/x86/Kconfig
|
||||||
|
+++ b/arch/x86/Kconfig
|
||||||
|
@@ -1786,6 +1786,17 @@ config EFI_MIXED
|
||||||
|
|
||||||
|
If unsure, say N.
|
||||||
|
|
||||||
|
+config EFI_SECURE_BOOT_SIG_ENFORCE
|
||||||
|
+ def_bool n
|
||||||
|
+ depends on EFI
|
||||||
|
+ prompt "Force module signing when UEFI Secure Boot is enabled"
|
||||||
|
+ ---help---
|
||||||
|
+ UEFI Secure Boot provides a mechanism for ensuring that the
|
||||||
|
+ firmware will only load signed bootloaders and kernels. Certain
|
||||||
|
+ use cases may also require that all kernel modules also be signed.
|
||||||
|
+ Say Y here to automatically enable module signature enforcement
|
||||||
|
+ when a system boots with UEFI Secure Boot enabled.
|
||||||
|
+
|
||||||
|
config SECCOMP
|
||||||
|
def_bool y
|
||||||
|
prompt "Enable seccomp to safely compute untrusted bytecode"
|
||||||
|
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
|
||||||
|
index cc69e37548db..ebc85c1eefd6 100644
|
||||||
|
--- a/arch/x86/boot/compressed/eboot.c
|
||||||
|
+++ b/arch/x86/boot/compressed/eboot.c
|
||||||
|
@@ -12,6 +12,7 @@
|
||||||
|
#include <asm/efi.h>
|
||||||
|
#include <asm/setup.h>
|
||||||
|
#include <asm/desc.h>
|
||||||
|
+#include <asm/bootparam_utils.h>
|
||||||
|
|
||||||
|
#include "../string.h"
|
||||||
|
#include "eboot.h"
|
||||||
|
@@ -537,6 +538,67 @@ static void setup_efi_pci(struct boot_params *params)
|
||||||
|
efi_call_early(free_pool, pci_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int get_secure_boot(void)
|
||||||
|
+{
|
||||||
|
+ u8 sb, setup;
|
||||||
|
+ unsigned long datasize = sizeof(sb);
|
||||||
|
+ efi_guid_t var_guid = EFI_GLOBAL_VARIABLE_GUID;
|
||||||
|
+ efi_status_t status;
|
||||||
|
+
|
||||||
|
+ status = efi_early->call((unsigned long)sys_table->runtime->get_variable,
|
||||||
|
+ L"SecureBoot", &var_guid, NULL, &datasize, &sb);
|
||||||
|
+
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (sb == 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ status = efi_early->call((unsigned long)sys_table->runtime->get_variable,
|
||||||
|
+ L"SetupMode", &var_guid, NULL, &datasize,
|
||||||
|
+ &setup);
|
||||||
|
+
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (setup == 1)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * See if we have Graphics Output Protocol
|
||||||
|
+ */
|
||||||
|
+static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto,
|
||||||
|
+ unsigned long size)
|
||||||
|
+{
|
||||||
|
+ efi_status_t status;
|
||||||
|
+ void **gop_handle = NULL;
|
||||||
|
+
|
||||||
|
+ status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
|
||||||
|
+ size, (void **)&gop_handle);
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ return status;
|
||||||
|
+
|
||||||
|
+ status = efi_call_early(locate_handle,
|
||||||
|
+ EFI_LOCATE_BY_PROTOCOL,
|
||||||
|
+ proto, NULL, &size, gop_handle);
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ goto free_handle;
|
||||||
|
+
|
||||||
|
+ if (efi_early->is64)
|
||||||
|
+ status = setup_gop64(si, proto, size, gop_handle);
|
||||||
|
+ else
|
||||||
|
+ status = setup_gop32(si, proto, size, gop_handle);
|
||||||
|
+
|
||||||
|
+free_handle:
|
||||||
|
+ efi_call_early(free_pool, gop_handle);
|
||||||
|
+ return status;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static efi_status_t
|
||||||
|
setup_uga32(void **uga_handle, unsigned long size, u32 *width, u32 *height)
|
||||||
|
{
|
||||||
|
@@ -1094,6 +1156,10 @@ struct boot_params *efi_main(struct efi_config *c,
|
||||||
|
else
|
||||||
|
setup_boot_services32(efi_early);
|
||||||
|
|
||||||
|
+ sanitize_boot_params(boot_params);
|
||||||
|
+
|
||||||
|
+ boot_params->secure_boot = get_secure_boot();
|
||||||
|
+
|
||||||
|
setup_graphics(boot_params);
|
||||||
|
|
||||||
|
setup_efi_pci(boot_params);
|
||||||
|
diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h
|
||||||
|
index c18ce67495fa..2b3e5427097b 100644
|
||||||
|
--- a/arch/x86/include/uapi/asm/bootparam.h
|
||||||
|
+++ b/arch/x86/include/uapi/asm/bootparam.h
|
||||||
|
@@ -134,7 +134,8 @@ struct boot_params {
|
||||||
|
__u8 eddbuf_entries; /* 0x1e9 */
|
||||||
|
__u8 edd_mbr_sig_buf_entries; /* 0x1ea */
|
||||||
|
__u8 kbd_status; /* 0x1eb */
|
||||||
|
- __u8 _pad5[3]; /* 0x1ec */
|
||||||
|
+ __u8 secure_boot; /* 0x1ec */
|
||||||
|
+ __u8 _pad5[2]; /* 0x1ed */
|
||||||
|
/*
|
||||||
|
* The sentinel is set to a nonzero value (0xff) in header.S.
|
||||||
|
*
|
||||||
|
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||||
|
index bbfbca5fea0c..d40e961753c9 100644
|
||||||
|
--- a/arch/x86/kernel/setup.c
|
||||||
|
+++ b/arch/x86/kernel/setup.c
|
||||||
|
@@ -1160,6 +1160,12 @@ void __init setup_arch(char **cmdline_p)
|
||||||
|
|
||||||
|
io_delay_init();
|
||||||
|
|
||||||
|
+#ifdef CONFIG_EFI_SECURE_BOOT_SIG_ENFORCE
|
||||||
|
+ if (boot_params.secure_boot) {
|
||||||
|
+ enforce_signed_modules();
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Parse the ACPI tables for possible boot-time SMP configuration.
|
||||||
|
*/
|
||||||
|
diff --git a/include/linux/module.h b/include/linux/module.h
|
||||||
|
index 05bd6c989a0c..32327704e18d 100644
|
||||||
|
--- a/include/linux/module.h
|
||||||
|
+++ b/include/linux/module.h
|
||||||
|
@@ -260,6 +260,12 @@ extern const typeof(name) __mod_##type##__##name##_device_table \
|
||||||
|
|
||||||
|
struct notifier_block;
|
||||||
|
|
||||||
|
+#ifdef CONFIG_MODULE_SIG
|
||||||
|
+extern void enforce_signed_modules(void);
|
||||||
|
+#else
|
||||||
|
+static inline void enforce_signed_modules(void) {};
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_MODULES
|
||||||
|
|
||||||
|
extern int modules_disabled; /* for sysctl */
|
||||||
|
diff --git a/kernel/module.c b/kernel/module.c
|
||||||
|
index cb864505d020..cb1f1da69bf4 100644
|
||||||
|
--- a/kernel/module.c
|
||||||
|
+++ b/kernel/module.c
|
||||||
|
@@ -4285,6 +4285,13 @@ void module_layout(struct module *mod,
|
||||||
|
EXPORT_SYMBOL(module_layout);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef CONFIG_MODULE_SIG
|
||||||
|
+void enforce_signed_modules(void)
|
||||||
|
+{
|
||||||
|
+ sig_enforce = true;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
bool secure_modules(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_MODULE_SIG
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
From ea6e7d9d0fe3e448aef19b3943d4897ae0bef128 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Fedora Kernel Team <kernel-team@fedoraproject.org>
|
||||||
|
Date: Thu, 3 Aug 2017 13:46:51 -0500
|
||||||
|
Subject: [PATCH] Fix for module sig verification
|
||||||
|
|
||||||
|
---
|
||||||
|
kernel/module_signing.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/kernel/module_signing.c b/kernel/module_signing.c
|
||||||
|
index 937c844..d3d6f95 100644
|
||||||
|
--- a/kernel/module_signing.c
|
||||||
|
+++ b/kernel/module_signing.c
|
||||||
|
@@ -81,6 +81,6 @@ int mod_verify_sig(const void *mod, unsigned long *_modlen)
|
||||||
|
}
|
||||||
|
|
||||||
|
return verify_pkcs7_signature(mod, modlen, mod + modlen, sig_len,
|
||||||
|
- NULL, VERIFYING_MODULE_SIGNATURE,
|
||||||
|
+ (void *)1UL, VERIFYING_MODULE_SIGNATURE,
|
||||||
|
NULL, NULL);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.13.3
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
From: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||||
|
Date: Thu, 16 Apr 2015 13:01:46 -0400
|
||||||
|
Subject: [PATCH] Input - synaptics: pin 3 touches when the firmware reports 3
|
||||||
|
fingers
|
||||||
|
|
||||||
|
Synaptics PS/2 touchpad can send only 2 touches in a report. They can
|
||||||
|
detect 4 or 5 and this information is valuable.
|
||||||
|
|
||||||
|
In commit 63c4fda (Input: synaptics - allocate 3 slots to keep stability
|
||||||
|
in image sensors), we allocate 3 slots, but we still continue to report
|
||||||
|
the 2 available fingers. That means that the client sees 2 used slots while
|
||||||
|
there is a total of 3 fingers advertised by BTN_TOOL_TRIPLETAP.
|
||||||
|
|
||||||
|
For old kernels this is not a problem because max_slots was 2 and libinput/
|
||||||
|
xorg-synaptics knew how to deal with that. Now that max_slot is 3, the
|
||||||
|
clients ignore BTN_TOOL_TRIPLETAP and count the actual used slots (so 2).
|
||||||
|
It then gets confused when receiving the BTN_TOOL_TRIPLETAP and DOUBLETAP
|
||||||
|
information, and goes wild.
|
||||||
|
|
||||||
|
We can pin the 3 slots until we get a total number of fingers below 2.
|
||||||
|
|
||||||
|
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1212230
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||||
|
---
|
||||||
|
drivers/input/mouse/synaptics.c | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
||||||
|
index 3a32caf06bf1..58102970f94f 100644
|
||||||
|
--- a/drivers/input/mouse/synaptics.c
|
||||||
|
+++ b/drivers/input/mouse/synaptics.c
|
||||||
|
@@ -940,6 +940,14 @@ static void synaptics_report_mt_data(struct psmouse *psmouse,
|
||||||
|
input_report_abs(dev, ABS_MT_PRESSURE, hw[i]->z);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* keep (slot count <= num_fingers) by pinning all slots */
|
||||||
|
+ if (num_fingers >= 3) {
|
||||||
|
+ for (i = 0; i < 3; i++) {
|
||||||
|
+ input_mt_slot(dev, i);
|
||||||
|
+ input_mt_report_slot_state(dev, MT_TOOL_FINGER, true);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
input_mt_drop_unused(dev);
|
||||||
|
|
||||||
|
/* Don't use active slot count to generate BTN_TOOL events. */
|
|
@ -0,0 +1,95 @@
|
||||||
|
From fb2ac204a70da565de9ef9a9d6d69a40c2d59727 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Howells <dhowells@redhat.com>
|
||||||
|
Date: Fri, 5 May 2017 08:21:56 +0100
|
||||||
|
Subject: [PATCH] KEYS: Allow unrestricted boot-time addition of keys to
|
||||||
|
secondary keyring
|
||||||
|
|
||||||
|
Allow keys to be added to the system secondary certificates keyring during
|
||||||
|
kernel initialisation in an unrestricted fashion. Such keys are implicitly
|
||||||
|
trusted and don't have their trust chains checked on link.
|
||||||
|
|
||||||
|
This allows keys in the UEFI database to be added in secure boot mode for
|
||||||
|
the purposes of module signing.
|
||||||
|
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
---
|
||||||
|
certs/internal.h | 18 ++++++++++++++++++
|
||||||
|
certs/system_keyring.c | 33 +++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 51 insertions(+)
|
||||||
|
create mode 100644 certs/internal.h
|
||||||
|
|
||||||
|
diff --git a/certs/internal.h b/certs/internal.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..5dcbefb
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/certs/internal.h
|
||||||
|
@@ -0,0 +1,18 @@
|
||||||
|
+/* Internal definitions
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
|
||||||
|
+ * Written by David Howells (dhowells@redhat.com)
|
||||||
|
+ *
|
||||||
|
+ * This program is free software; you can redistribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU General Public Licence
|
||||||
|
+ * as published by the Free Software Foundation; either version
|
||||||
|
+ * 2 of the Licence, or (at your option) any later version.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * system_keyring.c
|
||||||
|
+ */
|
||||||
|
+#ifdef CONFIG_SECONDARY_TRUSTED_KEYRING
|
||||||
|
+extern void __init add_trusted_secondary_key(const char *source,
|
||||||
|
+ const void *data, size_t len);
|
||||||
|
+#endif
|
||||||
|
diff --git a/certs/system_keyring.c b/certs/system_keyring.c
|
||||||
|
index 6251d1b..5ac8ba6 100644
|
||||||
|
--- a/certs/system_keyring.c
|
||||||
|
+++ b/certs/system_keyring.c
|
||||||
|
@@ -18,6 +18,7 @@
|
||||||
|
#include <keys/asymmetric-type.h>
|
||||||
|
#include <keys/system_keyring.h>
|
||||||
|
#include <crypto/pkcs7.h>
|
||||||
|
+#include "internal.h"
|
||||||
|
|
||||||
|
static struct key *builtin_trusted_keys;
|
||||||
|
#ifdef CONFIG_SECONDARY_TRUSTED_KEYRING
|
||||||
|
@@ -265,3 +266,35 @@ int verify_pkcs7_signature(const void *data, size_t len,
|
||||||
|
EXPORT_SYMBOL_GPL(verify_pkcs7_signature);
|
||||||
|
|
||||||
|
#endif /* CONFIG_SYSTEM_DATA_VERIFICATION */
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_SECONDARY_TRUSTED_KEYRING
|
||||||
|
+/**
|
||||||
|
+ * add_trusted_secondary_key - Add to secondary keyring with no validation
|
||||||
|
+ * @source: Source of key
|
||||||
|
+ * @data: The blob holding the key
|
||||||
|
+ * @len: The length of the data blob
|
||||||
|
+ *
|
||||||
|
+ * Add a key to the secondary keyring without checking its trust chain. This
|
||||||
|
+ * is available only during kernel initialisation.
|
||||||
|
+ */
|
||||||
|
+void __init add_trusted_secondary_key(const char *source,
|
||||||
|
+ const void *data, size_t len)
|
||||||
|
+{
|
||||||
|
+ key_ref_t key;
|
||||||
|
+
|
||||||
|
+ key = key_create_or_update(make_key_ref(secondary_trusted_keys, 1),
|
||||||
|
+ "asymmetric",
|
||||||
|
+ NULL, data, len,
|
||||||
|
+ (KEY_POS_ALL & ~KEY_POS_SETATTR) |
|
||||||
|
+ KEY_USR_VIEW,
|
||||||
|
+ KEY_ALLOC_NOT_IN_QUOTA |
|
||||||
|
+ KEY_ALLOC_BYPASS_RESTRICTION);
|
||||||
|
+
|
||||||
|
+ if (IS_ERR(key))
|
||||||
|
+ pr_err("Problem loading %s X.509 certificate (%ld)\n",
|
||||||
|
+ source, PTR_ERR(key));
|
||||||
|
+ else
|
||||||
|
+ pr_notice("Loaded %s cert '%s' linked to secondary sys keyring\n",
|
||||||
|
+ source, key_ref_to_ptr(key)->description);
|
||||||
|
+}
|
||||||
|
+#endif /* CONFIG_SECONDARY_TRUSTED_KEYRING */
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
From: Josh Stone <jistone@redhat.com>
|
||||||
|
Date: Fri, 21 Nov 2014 10:40:00 -0800
|
||||||
|
Subject: [PATCH] Kbuild: Add an option to enable GCC VTA
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Due to recent codegen issues, gcc -fvar-tracking-assignments was
|
||||||
|
unconditionally disabled in commit 2062afb4f804a ("Fix gcc-4.9.0
|
||||||
|
miscompilation of load_balance() in scheduler"). However, this reduces
|
||||||
|
the debuginfo coverage for variable locations, especially in inline
|
||||||
|
functions. VTA is certainly not perfect either in those cases, but it
|
||||||
|
is much better than without. With compiler versions that have fixed the
|
||||||
|
codegen bugs, we would prefer to have the better details for SystemTap,
|
||||||
|
and surely other debuginfo consumers like perf will benefit as well.
|
||||||
|
|
||||||
|
This patch simply makes CONFIG_DEBUG_INFO_VTA an option. I considered
|
||||||
|
Frank and Linus's discussion of a cc-option-like -fcompare-debug test,
|
||||||
|
but I'm convinced that a narrow test of an arch-specific codegen issue
|
||||||
|
is not really useful. GCC has their own regression tests for this, so
|
||||||
|
I'd suggest GCC_COMPARE_DEBUG=-fvar-tracking-assignments-toggle is more
|
||||||
|
useful for kernel developers to test confidence.
|
||||||
|
|
||||||
|
In fact, I ran into a couple more issues when testing for this patch[1],
|
||||||
|
although neither of those had any codegen impact.
|
||||||
|
[1] https://bugzilla.redhat.com/show_bug.cgi?id=1140872
|
||||||
|
|
||||||
|
With gcc-4.9.2-1.fc22, I can now build v3.18-rc5 with Fedora's i686 and
|
||||||
|
x86_64 configs, and this is completely clean with GCC_COMPARE_DEBUG.
|
||||||
|
|
||||||
|
Cc: Frank Ch. Eigler <fche@redhat.com>
|
||||||
|
Cc: Jakub Jelinek <jakub@redhat.com>
|
||||||
|
Cc: Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||||
|
Cc: Andrew Morton <akpm@linux-foundation.org>
|
||||||
|
Cc: Markus Trippelsdorf <markus@trippelsdorf.de>
|
||||||
|
Cc: Michel Dänzer <michel@daenzer.net>
|
||||||
|
Signed-off-by: Josh Stone <jistone@redhat.com>
|
||||||
|
---
|
||||||
|
Makefile | 4 ++++
|
||||||
|
lib/Kconfig.debug | 18 +++++++++++++++++-
|
||||||
|
2 files changed, 21 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 257ef5892ab7..3cc6f4477e78 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -701,7 +701,11 @@ KBUILD_CFLAGS += -fomit-frame-pointer
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
+ifdef CONFIG_DEBUG_INFO_VTA
|
||||||
|
+KBUILD_CFLAGS += $(call cc-option, -fvar-tracking-assignments)
|
||||||
|
+else
|
||||||
|
KBUILD_CFLAGS += $(call cc-option, -fno-var-tracking-assignments)
|
||||||
|
+endif
|
||||||
|
|
||||||
|
ifdef CONFIG_DEBUG_INFO
|
||||||
|
ifdef CONFIG_DEBUG_INFO_SPLIT
|
||||||
|
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
|
||||||
|
index e2894b23efb6..d98afe18f704 100644
|
||||||
|
--- a/lib/Kconfig.debug
|
||||||
|
+++ b/lib/Kconfig.debug
|
||||||
|
@@ -165,7 +165,23 @@ config DEBUG_INFO_DWARF4
|
||||||
|
Generate dwarf4 debug info. This requires recent versions
|
||||||
|
of gcc and gdb. It makes the debug information larger.
|
||||||
|
But it significantly improves the success of resolving
|
||||||
|
- variables in gdb on optimized code.
|
||||||
|
+ variables in gdb on optimized code. The gcc docs also
|
||||||
|
+ recommend enabling -fvar-tracking-assignments for maximum
|
||||||
|
+ benefit. (see DEBUG_INFO_VTA)
|
||||||
|
+
|
||||||
|
+config DEBUG_INFO_VTA
|
||||||
|
+ bool "Enable var-tracking-assignments for debuginfo"
|
||||||
|
+ depends on DEBUG_INFO
|
||||||
|
+ help
|
||||||
|
+ Enable gcc -fvar-tracking-assignments for improved debug
|
||||||
|
+ information on variable locations in optimized code. Per
|
||||||
|
+ gcc, DEBUG_INFO_DWARF4 is recommended for best use of VTA.
|
||||||
|
+
|
||||||
|
+ VTA has been implicated in codegen bugs (gcc PR61801,
|
||||||
|
+ PR61904), so this may deserve some caution. One can set
|
||||||
|
+ GCC_COMPARE_DEBUG=-fvar-tracking-assignments-toggle in the
|
||||||
|
+ environment to automatically compile everything both ways,
|
||||||
|
+ generating an error if anything differs.
|
||||||
|
|
||||||
|
config GDB_SCRIPTS
|
||||||
|
bool "Provide GDB scripts for kernel debugging"
|
|
@ -0,0 +1,246 @@
|
||||||
|
From 90dc66270b02981b19a085c6a9184e3452b7b3e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
Date: Fri, 5 May 2017 08:21:59 +0100
|
||||||
|
Subject: [PATCH 3/4] MODSIGN: Import certificates from UEFI Secure Boot
|
||||||
|
|
||||||
|
Secure Boot stores a list of allowed certificates in the 'db' variable.
|
||||||
|
This imports those certificates into the system trusted keyring. This
|
||||||
|
allows for a third party signing certificate to be used in conjunction
|
||||||
|
with signed modules. By importing the public certificate into the 'db'
|
||||||
|
variable, a user can allow a module signed with that certificate to
|
||||||
|
load. The shim UEFI bootloader has a similar certificate list stored
|
||||||
|
in the 'MokListRT' variable. We import those as well.
|
||||||
|
|
||||||
|
Secure Boot also maintains a list of disallowed certificates in the 'dbx'
|
||||||
|
variable. We load those certificates into the newly introduced system
|
||||||
|
blacklist keyring and forbid any module signed with those from loading and
|
||||||
|
forbid the use within the kernel of any key with a matching hash.
|
||||||
|
|
||||||
|
This facility is enabled by setting CONFIG_LOAD_UEFI_KEYS.
|
||||||
|
|
||||||
|
Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
---
|
||||||
|
certs/Kconfig | 16 ++++++
|
||||||
|
certs/Makefile | 4 ++
|
||||||
|
certs/load_uefi.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 188 insertions(+)
|
||||||
|
create mode 100644 certs/load_uefi.c
|
||||||
|
|
||||||
|
diff --git a/certs/Kconfig b/certs/Kconfig
|
||||||
|
index 630ae09..edf9f75 100644
|
||||||
|
--- a/certs/Kconfig
|
||||||
|
+++ b/certs/Kconfig
|
||||||
|
@@ -90,4 +90,20 @@ config EFI_SIGNATURE_LIST_PARSER
|
||||||
|
This option provides support for parsing EFI signature lists for
|
||||||
|
X.509 certificates and turning them into keys.
|
||||||
|
|
||||||
|
+config LOAD_UEFI_KEYS
|
||||||
|
+ bool "Load certs and blacklist from UEFI db for module checking"
|
||||||
|
+ depends on SYSTEM_BLACKLIST_KEYRING
|
||||||
|
+ depends on SECONDARY_TRUSTED_KEYRING
|
||||||
|
+ depends on EFI
|
||||||
|
+ depends on EFI_SIGNATURE_LIST_PARSER
|
||||||
|
+ help
|
||||||
|
+ If the kernel is booted in secure boot mode, this option will cause
|
||||||
|
+ the kernel to load the certificates from the UEFI db and MokListRT
|
||||||
|
+ into the secondary trusted keyring. It will also load any X.509
|
||||||
|
+ SHA256 hashes in the dbx list into the blacklist.
|
||||||
|
+
|
||||||
|
+ The effect of this is that, if the kernel is booted in secure boot
|
||||||
|
+ mode, modules signed with UEFI-stored keys will be permitted to be
|
||||||
|
+ loaded and keys that match the blacklist will be rejected.
|
||||||
|
+
|
||||||
|
endmenu
|
||||||
|
diff --git a/certs/Makefile b/certs/Makefile
|
||||||
|
index 738151a..a5e057a 100644
|
||||||
|
--- a/certs/Makefile
|
||||||
|
+++ b/certs/Makefile
|
||||||
|
@@ -11,6 +11,10 @@ obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_nohashes.o
|
||||||
|
endif
|
||||||
|
obj-$(CONFIG_EFI_SIGNATURE_LIST_PARSER) += efi_parser.o
|
||||||
|
|
||||||
|
+obj-$(CONFIG_LOAD_UEFI_KEYS) += load_uefi.o
|
||||||
|
+$(obj)/load_uefi.o: KBUILD_CFLAGS += -fshort-wchar
|
||||||
|
+
|
||||||
|
+
|
||||||
|
ifeq ($(CONFIG_SYSTEM_TRUSTED_KEYRING),y)
|
||||||
|
|
||||||
|
$(eval $(call config_filename,SYSTEM_TRUSTED_KEYS))
|
||||||
|
diff --git a/certs/load_uefi.c b/certs/load_uefi.c
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..b44e464
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/certs/load_uefi.c
|
||||||
|
@@ -0,0 +1,168 @@
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/sched.h>
|
||||||
|
+#include <linux/cred.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/efi.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+#include <keys/asymmetric-type.h>
|
||||||
|
+#include <keys/system_keyring.h>
|
||||||
|
+#include "internal.h"
|
||||||
|
+
|
||||||
|
+static __initdata efi_guid_t efi_cert_x509_guid = EFI_CERT_X509_GUID;
|
||||||
|
+static __initdata efi_guid_t efi_cert_x509_sha256_guid = EFI_CERT_X509_SHA256_GUID;
|
||||||
|
+static __initdata efi_guid_t efi_cert_sha256_guid = EFI_CERT_SHA256_GUID;
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Get a certificate list blob from the named EFI variable.
|
||||||
|
+ */
|
||||||
|
+static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
+ unsigned long *size)
|
||||||
|
+{
|
||||||
|
+ efi_status_t status;
|
||||||
|
+ unsigned long lsize = 4;
|
||||||
|
+ unsigned long tmpdb[4];
|
||||||
|
+ void *db;
|
||||||
|
+
|
||||||
|
+ status = efi.get_variable(name, guid, NULL, &lsize, &tmpdb);
|
||||||
|
+ if (status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
+ pr_err("Couldn't get size: 0x%lx\n", status);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ db = kmalloc(lsize, GFP_KERNEL);
|
||||||
|
+ if (!db) {
|
||||||
|
+ pr_err("Couldn't allocate memory for uefi cert list\n");
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ status = efi.get_variable(name, guid, NULL, &lsize, db);
|
||||||
|
+ if (status != EFI_SUCCESS) {
|
||||||
|
+ kfree(db);
|
||||||
|
+ pr_err("Error reading db var: 0x%lx\n", status);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *size = lsize;
|
||||||
|
+ return db;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Blacklist an X509 TBS hash.
|
||||||
|
+ */
|
||||||
|
+static __init void uefi_blacklist_x509_tbs(const char *source,
|
||||||
|
+ const void *data, size_t len)
|
||||||
|
+{
|
||||||
|
+ char *hash, *p;
|
||||||
|
+
|
||||||
|
+ hash = kmalloc(4 + len * 2 + 1, GFP_KERNEL);
|
||||||
|
+ if (!hash)
|
||||||
|
+ return;
|
||||||
|
+ p = memcpy(hash, "tbs:", 4);
|
||||||
|
+ p += 4;
|
||||||
|
+ bin2hex(p, data, len);
|
||||||
|
+ p += len * 2;
|
||||||
|
+ *p = 0;
|
||||||
|
+
|
||||||
|
+ mark_hash_blacklisted(hash);
|
||||||
|
+ kfree(hash);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Blacklist the hash of an executable.
|
||||||
|
+ */
|
||||||
|
+static __init void uefi_blacklist_binary(const char *source,
|
||||||
|
+ const void *data, size_t len)
|
||||||
|
+{
|
||||||
|
+ char *hash, *p;
|
||||||
|
+
|
||||||
|
+ hash = kmalloc(4 + len * 2 + 1, GFP_KERNEL);
|
||||||
|
+ if (!hash)
|
||||||
|
+ return;
|
||||||
|
+ p = memcpy(hash, "bin:", 4);
|
||||||
|
+ p += 4;
|
||||||
|
+ bin2hex(p, data, len);
|
||||||
|
+ p += len * 2;
|
||||||
|
+ *p = 0;
|
||||||
|
+
|
||||||
|
+ mark_hash_blacklisted(hash);
|
||||||
|
+ kfree(hash);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Return the appropriate handler for particular signature list types found in
|
||||||
|
+ * the UEFI db and MokListRT tables.
|
||||||
|
+ */
|
||||||
|
+static __init efi_element_handler_t get_handler_for_db(const efi_guid_t *sig_type)
|
||||||
|
+{
|
||||||
|
+ if (efi_guidcmp(*sig_type, efi_cert_x509_guid) == 0)
|
||||||
|
+ return add_trusted_secondary_key;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Return the appropriate handler for particular signature list types found in
|
||||||
|
+ * the UEFI dbx and MokListXRT tables.
|
||||||
|
+ */
|
||||||
|
+static __init efi_element_handler_t get_handler_for_dbx(const efi_guid_t *sig_type)
|
||||||
|
+{
|
||||||
|
+ if (efi_guidcmp(*sig_type, efi_cert_x509_sha256_guid) == 0)
|
||||||
|
+ return uefi_blacklist_x509_tbs;
|
||||||
|
+ if (efi_guidcmp(*sig_type, efi_cert_sha256_guid) == 0)
|
||||||
|
+ return uefi_blacklist_binary;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Load the certs contained in the UEFI databases
|
||||||
|
+ */
|
||||||
|
+static int __init load_uefi_certs(void)
|
||||||
|
+{
|
||||||
|
+ efi_guid_t secure_var = EFI_IMAGE_SECURITY_DATABASE_GUID;
|
||||||
|
+ efi_guid_t mok_var = EFI_SHIM_LOCK_GUID;
|
||||||
|
+ void *db = NULL, *dbx = NULL, *mok = NULL;
|
||||||
|
+ unsigned long dbsize = 0, dbxsize = 0, moksize = 0;
|
||||||
|
+ int rc = 0;
|
||||||
|
+
|
||||||
|
+ if (!efi.get_variable)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ /* Get db, MokListRT, and dbx. They might not exist, so it isn't
|
||||||
|
+ * an error if we can't get them.
|
||||||
|
+ */
|
||||||
|
+ db = get_cert_list(L"db", &secure_var, &dbsize);
|
||||||
|
+ if (!db) {
|
||||||
|
+ pr_err("MODSIGN: Couldn't get UEFI db list\n");
|
||||||
|
+ } else {
|
||||||
|
+ rc = parse_efi_signature_list("UEFI:db",
|
||||||
|
+ db, dbsize, get_handler_for_db);
|
||||||
|
+ if (rc)
|
||||||
|
+ pr_err("Couldn't parse db signatures: %d\n", rc);
|
||||||
|
+ kfree(db);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ mok = get_cert_list(L"MokListRT", &mok_var, &moksize);
|
||||||
|
+ if (!mok) {
|
||||||
|
+ pr_info("MODSIGN: Couldn't get UEFI MokListRT\n");
|
||||||
|
+ } else {
|
||||||
|
+ rc = parse_efi_signature_list("UEFI:MokListRT",
|
||||||
|
+ mok, moksize, get_handler_for_db);
|
||||||
|
+ if (rc)
|
||||||
|
+ pr_err("Couldn't parse MokListRT signatures: %d\n", rc);
|
||||||
|
+ kfree(mok);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dbx = get_cert_list(L"dbx", &secure_var, &dbxsize);
|
||||||
|
+ if (!dbx) {
|
||||||
|
+ pr_info("MODSIGN: Couldn't get UEFI dbx list\n");
|
||||||
|
+ } else {
|
||||||
|
+ rc = parse_efi_signature_list("UEFI:dbx",
|
||||||
|
+ dbx, dbxsize,
|
||||||
|
+ get_handler_for_dbx);
|
||||||
|
+ if (rc)
|
||||||
|
+ pr_err("Couldn't parse dbx signatures: %d\n", rc);
|
||||||
|
+ kfree(dbx);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+late_initcall(load_uefi_certs);
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
From 9f1958a0cc911e1f79b2733ee5029dbd819ff328 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
Date: Fri, 5 May 2017 08:21:59 +0100
|
||||||
|
Subject: [PATCH 4/4] MODSIGN: Allow the "db" UEFI variable to be suppressed
|
||||||
|
|
||||||
|
If a user tells shim to not use the certs/hashes in the UEFI db variable
|
||||||
|
for verification purposes, shim will set a UEFI variable called
|
||||||
|
MokIgnoreDB. Have the uefi import code look for this and ignore the db
|
||||||
|
variable if it is found.
|
||||||
|
|
||||||
|
Signed-off-by: Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||||
|
---
|
||||||
|
certs/load_uefi.c | 44 ++++++++++++++++++++++++++++++++++----------
|
||||||
|
1 file changed, 34 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/certs/load_uefi.c b/certs/load_uefi.c
|
||||||
|
index b44e464..3d88459 100644
|
||||||
|
--- a/certs/load_uefi.c
|
||||||
|
+++ b/certs/load_uefi.c
|
||||||
|
@@ -13,6 +13,26 @@ static __initdata efi_guid_t efi_cert_x509_sha256_guid = EFI_CERT_X509_SHA256_GU
|
||||||
|
static __initdata efi_guid_t efi_cert_sha256_guid = EFI_CERT_SHA256_GUID;
|
||||||
|
|
||||||
|
/*
|
||||||
|
+ * Look to see if a UEFI variable called MokIgnoreDB exists and return true if
|
||||||
|
+ * it does.
|
||||||
|
+ *
|
||||||
|
+ * This UEFI variable is set by the shim if a user tells the shim to not use
|
||||||
|
+ * the certs/hashes in the UEFI db variable for verification purposes. If it
|
||||||
|
+ * is set, we should ignore the db variable also and the true return indicates
|
||||||
|
+ * this.
|
||||||
|
+ */
|
||||||
|
+static __init bool uefi_check_ignore_db(void)
|
||||||
|
+{
|
||||||
|
+ efi_status_t status;
|
||||||
|
+ unsigned int db = 0;
|
||||||
|
+ unsigned long size = sizeof(db);
|
||||||
|
+ efi_guid_t guid = EFI_SHIM_LOCK_GUID;
|
||||||
|
+
|
||||||
|
+ status = efi.get_variable(L"MokIgnoreDB", &guid, NULL, &size, &db);
|
||||||
|
+ return status == EFI_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
* Get a certificate list blob from the named EFI variable.
|
||||||
|
*/
|
||||||
|
static __init void *get_cert_list(efi_char16_t *name, efi_guid_t *guid,
|
||||||
|
@@ -113,7 +133,9 @@ static __init efi_element_handler_t get_handler_for_dbx(const efi_guid_t *sig_ty
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Load the certs contained in the UEFI databases
|
||||||
|
+ * Load the certs contained in the UEFI databases into the secondary trusted
|
||||||
|
+ * keyring and the UEFI blacklisted X.509 cert SHA256 hashes into the blacklist
|
||||||
|
+ * keyring.
|
||||||
|
*/
|
||||||
|
static int __init load_uefi_certs(void)
|
||||||
|
{
|
||||||
|
@@ -129,15 +151,17 @@ static int __init load_uefi_certs(void)
|
||||||
|
/* Get db, MokListRT, and dbx. They might not exist, so it isn't
|
||||||
|
* an error if we can't get them.
|
||||||
|
*/
|
||||||
|
- db = get_cert_list(L"db", &secure_var, &dbsize);
|
||||||
|
- if (!db) {
|
||||||
|
- pr_err("MODSIGN: Couldn't get UEFI db list\n");
|
||||||
|
- } else {
|
||||||
|
- rc = parse_efi_signature_list("UEFI:db",
|
||||||
|
- db, dbsize, get_handler_for_db);
|
||||||
|
- if (rc)
|
||||||
|
- pr_err("Couldn't parse db signatures: %d\n", rc);
|
||||||
|
- kfree(db);
|
||||||
|
+ if (!uefi_check_ignore_db()) {
|
||||||
|
+ db = get_cert_list(L"db", &secure_var, &dbsize);
|
||||||
|
+ if (!db) {
|
||||||
|
+ pr_err("MODSIGN: Couldn't get UEFI db list\n");
|
||||||
|
+ } else {
|
||||||
|
+ rc = parse_efi_signature_list("UEFI:db",
|
||||||
|
+ db, dbsize, get_handler_for_db);
|
||||||
|
+ if (rc)
|
||||||
|
+ pr_err("Couldn't parse db signatures: %d\n", rc);
|
||||||
|
+ kfree(db);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
mok = get_cert_list(L"MokListRT", &mok_var, &moksize);
|
||||||
|
--
|
||||||
|
2.9.3
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
# Makefile for source rpm: kernel
|
||||||
|
SPECFILE := kernel.spec
|
||||||
|
|
||||||
|
# we only check the .sign signatures
|
||||||
|
UPSTREAM_CHECKS = sign
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
help:
|
||||||
|
%:
|
||||||
|
@echo "Try fedpkg $@ or something like that"
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
prep: config-files
|
||||||
|
fedpkg -v prep
|
||||||
|
|
||||||
|
noarch:
|
||||||
|
fedpkg -v local --arch=noarch
|
||||||
|
|
||||||
|
# 'make local' also needs to build the noarch firmware package
|
||||||
|
local:
|
||||||
|
fedpkg -v local
|
||||||
|
|
||||||
|
extremedebug:
|
||||||
|
@perl -pi -e 's/# CONFIG_DEBUG_PAGEALLOC is not set/CONFIG_DEBUG_PAGEALLOC=y/' config-nodebug
|
||||||
|
|
||||||
|
config-files:
|
||||||
|
@./build_configs.sh
|
||||||
|
|
||||||
|
debug:
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
|
||||||
|
@rpmdev-bumpspec -c "Reenable debugging options." kernel.spec
|
||||||
|
|
||||||
|
release:
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 0/%define debugbuildsenabled 1/' kernel.spec
|
||||||
|
@rpmdev-bumpspec -c "Disable debugging options." kernel.spec
|
||||||
|
|
||||||
|
nodebuginfo:
|
||||||
|
@perl -pi -e 's/^%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 1\}/%define with_debuginfo %\{\?_without_debuginfo: 0\} %\{\?\!_without_debuginfo: 0\}/' kernel.spec
|
||||||
|
|
||||||
|
nodebug: release
|
||||||
|
@perl -pi -e 's/^%define debugbuildsenabled 1/%define debugbuildsenabled 0/' kernel.spec
|
||||||
|
|
||||||
|
ifeq ($(MAKECMDGOALS),me a sandwich)
|
||||||
|
.PHONY: me a sandwich
|
||||||
|
me a:
|
||||||
|
@:
|
||||||
|
|
||||||
|
sandwich:
|
||||||
|
@[ `id -u` -ne 0 ] && echo "What? Make it yourself." || echo Okay.
|
||||||
|
endif
|
|
@ -1,45 +0,0 @@
|
||||||
RHEL_MAJOR = 8
|
|
||||||
RHEL_MINOR = 99
|
|
||||||
|
|
||||||
#
|
|
||||||
# RHEL_RELEASE
|
|
||||||
# -------------
|
|
||||||
#
|
|
||||||
# Represents build number in 'release' part of RPM's name-version-release.
|
|
||||||
# name is <package_name>, e.g. kernel
|
|
||||||
# version is upstream kernel version this kernel is based on, e.g. 4.18.0
|
|
||||||
# release is <RHEL_RELEASE>.<dist_tag>[<buildid>], e.g. 100.el8
|
|
||||||
#
|
|
||||||
# Use this spot to avoid future merge conflicts.
|
|
||||||
# Do not trim this comment.
|
|
||||||
RHEL_RELEASE = 122
|
|
||||||
|
|
||||||
#
|
|
||||||
# Early y+1 numbering
|
|
||||||
# --------------------
|
|
||||||
#
|
|
||||||
# In early y+1 process, RHEL_RELEASE consists of 2 numbers: x.y
|
|
||||||
# First is RHEL_RELEASE inherited/merged from y as-is, second number
|
|
||||||
# is incremented with each build starting from 1. After merge from y,
|
|
||||||
# it resets back to 1. This way y+1 nvr reflects status of last merge.
|
|
||||||
#
|
|
||||||
# Example:
|
|
||||||
#
|
|
||||||
# rhel8.0 rhel-8.1
|
|
||||||
# kernel-4.18.0-58.el8 --> kernel-4.18.0-58.1.el8
|
|
||||||
# kernel-4.18.0-58.2.el8
|
|
||||||
# kernel-4.18.0-59.el8 kernel-4.18.0-59.1.el8
|
|
||||||
# kernel-4.18.0-60.el8
|
|
||||||
# kernel-4.18.0-61.el8 --> kernel-4.18.0-61.1.el8
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Use this spot to avoid future merge conflicts.
|
|
||||||
# Do not trim this comment.
|
|
||||||
EARLY_YSTREAM ?= no
|
|
||||||
EARLY_YBUILD:=
|
|
||||||
EARLY_YRELEASE:=
|
|
||||||
ifneq ("$(ZSTREAM)", "yes")
|
|
||||||
ifeq ("$(EARLY_YSTREAM)","yes")
|
|
||||||
RHEL_RELEASE:=$(RHEL_RELEASE).$(EARLY_YRELEASE)
|
|
||||||
endif
|
|
||||||
endif
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
# This file contains patches that we intend to carry for longer than
|
||||||
|
# "Should show up in a stable release soonish"
|
||||||
|
# Some of these may eventually drop out
|
||||||
|
|
||||||
|
kbuild-AFTER_LINK.patch
|
||||||
|
|
||||||
|
arm64-avoid-needing-console-to-enable-serial-console.patch
|
||||||
|
|
||||||
|
geekbox-v4-device-tree-support.patch
|
||||||
|
|
||||||
|
Initial-AllWinner-A64-and-PINE64-support.patch
|
||||||
|
|
||||||
|
arm64-pcie-quirks-xgene.patch
|
||||||
|
|
||||||
|
usb-phy-tegra-Add-38.4MHz-clock-table-entry.patch
|
||||||
|
|
||||||
|
ARM-tegra-usb-no-reset.patch
|
||||||
|
|
||||||
|
bcm283x-upstream-fixes.patch
|
||||||
|
|
||||||
|
lib-cpumask-Make-CPUMASK_OFFSTACK-usable-without-deb.patch
|
||||||
|
|
||||||
|
input-kill-stupid-messages.patch
|
||||||
|
|
||||||
|
die-floppy-die.patch
|
||||||
|
|
||||||
|
no-pcspkr-modalias.patch
|
||||||
|
|
||||||
|
silence-fbcon-logo.patch
|
||||||
|
|
||||||
|
Kbuild-Add-an-option-to-enable-GCC-VTA.patch
|
||||||
|
|
||||||
|
crash-driver.patch
|
||||||
|
|
||||||
|
#Secure boot patches
|
||||||
|
Add-secure_modules-call.patch
|
||||||
|
PCI-Lock-down-BAR-access-when-module-security-is-ena.patch
|
||||||
|
x86-Lock-down-IO-port-access-when-module-security-is.patch
|
||||||
|
ACPI-Limit-access-to-custom_method.patch
|
||||||
|
asus-wmi-Restrict-debugfs-interface-when-module-load.patch
|
||||||
|
Restrict-dev-mem-and-dev-kmem-when-module-loading-is.patch
|
||||||
|
acpi-Ignore-acpi_rsdp-kernel-parameter-when-module-l.patch
|
||||||
|
kexec-Disable-at-runtime-if-the-kernel-enforces-modu.patch
|
||||||
|
x86-Restrict-MSR-access-when-module-loading-is-restr.patch
|
||||||
|
Add-option-to-automatically-enforce-module-signature.patch
|
||||||
|
efi-Disable-secure-boot-if-shim-is-in-insecure-mode.patch
|
||||||
|
efi-Add-EFI_SECURE_BOOT-bit.patch
|
||||||
|
hibernate-Disable-in-a-signed-modules-environment.patch
|
||||||
|
Add-EFI-signature-data-types.patch
|
||||||
|
Add-an-EFI-signature-blob-parser-and-key-loader.patch
|
||||||
|
KEYS-Add-a-system-blacklist-keyring.patch
|
||||||
|
MODSIGN-Import-certificates-from-UEFI-Secure-Boot.patch
|
||||||
|
MODSIGN-Support-not-importing-certs-from-db.patch
|
||||||
|
Add-sysrq-option-to-disable-secure-boot-mode.patch
|
||||||
|
kexec-uefi-copy-secure_boot-flag-in-boot-params.patch
|
||||||
|
|
||||||
|
drm-i915-hush-check-crtc-state.patch
|
||||||
|
|
||||||
|
disable-i8042-check-on-apple-mac.patch
|
||||||
|
|
||||||
|
lis3-improve-handling-of-null-rate.patch
|
||||||
|
|
||||||
|
scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
||||||
|
|
||||||
|
criu-no-expert.patch
|
||||||
|
|
||||||
|
ath9k-rx-dma-stop-check.patch
|
||||||
|
|
||||||
|
xen-pciback-Don-t-disable-PCI_COMMAND-on-PCI-device-.patch
|
||||||
|
|
||||||
|
Input-synaptics-pin-3-touches-when-the-firmware-repo.patch
|
||||||
|
|
||||||
|
firmware-Drop-WARN-from-usermodehelper_read_trylock-.patch
|
||||||
|
|
||||||
|
drm-i915-turn-off-wc-mmaps.patch
|
||||||
|
|
|
@ -1,228 +0,0 @@
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/8773e8c6039ff74d1426cc80de30de759cd0c2a2
|
|
||||||
8773e8c6039ff74d1426cc80de30de759cd0c2a2 irq: export irq_check_status_bit
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/e187313e5f0086538fefe0925ef84480f99616d8
|
|
||||||
e187313e5f0086538fefe0925ef84480f99616d8 gcc-plugins: fix gcc 11 indigestion with plugins...
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/0c84b348e33ab9d7df5c3c5acc7fbc07fd96fafc
|
|
||||||
0c84b348e33ab9d7df5c3c5acc7fbc07fd96fafc Fix up bad merge with efi: generalize efi_get_secureboot
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/364788093bdf437c33753d327136c363be8f756c
|
|
||||||
364788093bdf437c33753d327136c363be8f756c Fix up a merge issue with rxe.c
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/a4d554ce883e24df77cce42bc2deec527028c213
|
|
||||||
a4d554ce883e24df77cce42bc2deec527028c213 Filter out LTO build options from the perl ccopts
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/17b0f7f1d49df30661b517d668715ff5ee1bab09
|
|
||||||
17b0f7f1d49df30661b517d668715ff5ee1bab09 Fixes "acpi: prefer booting with ACPI over DTS" to be RHEL only
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/e7c009cd91ababdbb5f726ef592c7800f0682d3a
|
|
||||||
e7c009cd91ababdbb5f726ef592c7800f0682d3a arch/x86: Remove vendor specific CPU ID checks
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7120b2a26fc4c7954fd0395973dc6739c110e091
|
|
||||||
7120b2a26fc4c7954fd0395973dc6739c110e091 redhat: Replace hardware.redhat.com link in Unsupported message
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7a28e2fde653a161913abb8eee943cdacb5ff2ae
|
|
||||||
7a28e2fde653a161913abb8eee943cdacb5ff2ae x86: Fix compile issues with rh_check_supported()
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/45f64c1a24e73af7987cffec3ea941e29364f87f
|
|
||||||
45f64c1a24e73af7987cffec3ea941e29364f87f e1000e: bump up timeout to wait when ME un-configure ULP mode
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/6c14763b1ce98698949ff45135c15e333aa6416d
|
|
||||||
6c14763b1ce98698949ff45135c15e333aa6416d drm/sun4i: sun6i_mipi_dsi: fix horizontal timing calculation
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/67a19b16012b12cffba0b515c6503e5f8cdbb798
|
|
||||||
67a19b16012b12cffba0b515c6503e5f8cdbb798 drm: panel: add Xingbangda XBD599 panel
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/d220dbf98cef820367b5a2a2eeaacebee958bdd4
|
|
||||||
d220dbf98cef820367b5a2a2eeaacebee958bdd4 dt-bindings: panel: add binding for Xingbangda XBD599 panel
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/80660062260dec4bdca9540922577542c16145e8
|
|
||||||
80660062260dec4bdca9540922577542c16145e8 ARM: fix __get_user_check() in case uaccess_* calls are not inlined
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/24d8743613b2a6a585fc68cfe95078d9a3d5b389
|
|
||||||
24d8743613b2a6a585fc68cfe95078d9a3d5b389 mm/kmemleak: skip late_init if not skip disable
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/b697ff5e26974fee8fcd31a1e221e9dd41515efc
|
|
||||||
b697ff5e26974fee8fcd31a1e221e9dd41515efc KEYS: Make use of platform keyring for module signature verify
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/081d2185e22479b449586c4e9843602ca0d49806
|
|
||||||
081d2185e22479b449586c4e9843602ca0d49806 Drop that for now
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/5ef51389cf6673a0e9e004909c7be1dc785050b2
|
|
||||||
5ef51389cf6673a0e9e004909c7be1dc785050b2 Input: rmi4 - remove the need for artificial IRQ in case of HID
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/c1788012ebf8de46e9dc80d18051ed0c77c811b6
|
|
||||||
c1788012ebf8de46e9dc80d18051ed0c77c811b6 ARM: tegra: usb no reset
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/577365feaa909db4c0949eabfcda7e4a972b8e54
|
|
||||||
577365feaa909db4c0949eabfcda7e4a972b8e54 arm: make CONFIG_HIGHPTE optional without CONFIG_EXPERT
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/331be9c5a436057ee852075c102d9d90a9046a30
|
|
||||||
331be9c5a436057ee852075c102d9d90a9046a30 redhat: rh_kabi: deduplication friendly structs
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/34d79fbfb327f732ebf3ece4db21a14f81fedf03
|
|
||||||
34d79fbfb327f732ebf3ece4db21a14f81fedf03 redhat: rh_kabi add a comment with warning about RH_KABI_EXCLUDE usage
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/93a4b5f12d5a1c2d62cf1d7c440b31d9847eab07
|
|
||||||
93a4b5f12d5a1c2d62cf1d7c440b31d9847eab07 redhat: rh_kabi: introduce RH_KABI_EXTEND_WITH_SIZE
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/8e5c06356457f5351289e9f687b991189d163dae
|
|
||||||
8e5c06356457f5351289e9f687b991189d163dae redhat: rh_kabi: Indirect EXTEND macros so nesting of other macros will resolve.
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/212cbccda77cc81fcb60123907eabdac8ad5adb7
|
|
||||||
212cbccda77cc81fcb60123907eabdac8ad5adb7 redhat: rh_kabi: Fix RH_KABI_SET_SIZE to use dereference operator
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/6f7744b412e1fb86a67d8761e64df69cf891b4ad
|
|
||||||
6f7744b412e1fb86a67d8761e64df69cf891b4ad redhat: rh_kabi: Add macros to size and extend structs
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/049623d33998be30d79692c69b34acb502c496e3
|
|
||||||
049623d33998be30d79692c69b34acb502c496e3 Removing Obsolete hba pci-ids from rhel8
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/43ef1d631ecfe84084db3572c9ed1bedbdceb0f8
|
|
||||||
43ef1d631ecfe84084db3572c9ed1bedbdceb0f8 mptsas: pci-id table changes
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/e5726695109dd1a73da92487b75de6a51d54c015
|
|
||||||
e5726695109dd1a73da92487b75de6a51d54c015 mptsas: Taint kernel if mptsas is loaded
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/ee4dcd6f04ca76ad35ab0f38c436ab2f7de53f16
|
|
||||||
ee4dcd6f04ca76ad35ab0f38c436ab2f7de53f16 mptspi: pci-id table changes
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/bd305f716d8b64be1926bc7aebe02468ac6bf599
|
|
||||||
bd305f716d8b64be1926bc7aebe02468ac6bf599 qla2xxx: Remove PCI IDs of deprecated adapter
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/803ff9a2c660c094e14d246ef05019bf6008d503
|
|
||||||
803ff9a2c660c094e14d246ef05019bf6008d503 be2iscsi: remove unsupported device IDs
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2cb24399321f555f18b0804d3fe02cf53949fba1
|
|
||||||
2cb24399321f555f18b0804d3fe02cf53949fba1 mptspi: Taint kernel if mptspi is loaded
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/ad1740551ff4af49f1ef10a130783d9369e955a0
|
|
||||||
ad1740551ff4af49f1ef10a130783d9369e955a0 hpsa: remove old cciss-based smartarray pci ids
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/4197ba3e766656eea9175c11ed05903620d98a28
|
|
||||||
4197ba3e766656eea9175c11ed05903620d98a28 qla4xxx: Remove deprecated PCI IDs from RHEL 8
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7e285aec22ab1213639afda877902db363473cb0
|
|
||||||
7e285aec22ab1213639afda877902db363473cb0 aacraid: Remove depreciated device and vendor PCI id's
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/846109a16be92155e69731c36dde48761d375153
|
|
||||||
846109a16be92155e69731c36dde48761d375153 megaraid_sas: remove deprecated pci-ids
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/6fd2019d01cee7ff36dc047d3ecdb504b968f222
|
|
||||||
6fd2019d01cee7ff36dc047d3ecdb504b968f222 mpt*: remove certain deprecated pci-ids
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/dddcd5c1129b275ff160324036a662739db51fc3
|
|
||||||
dddcd5c1129b275ff160324036a662739db51fc3 kernel: add SUPPORT_REMOVED kernel taint
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/08d77161dba915d1ed0d9fede658085440ab4474
|
|
||||||
08d77161dba915d1ed0d9fede658085440ab4474 Rename RH_DISABLE_DEPRECATED to RHEL_DIFFERENCES
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/e2dc2ca6a25a445bf22ceb6a8e38e02706605341
|
|
||||||
e2dc2ca6a25a445bf22ceb6a8e38e02706605341 Add option of 13 for FORCE_MAX_ZONEORDER
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2384646bf71d8c282cf49bb20321fdf802c61cce
|
|
||||||
2384646bf71d8c282cf49bb20321fdf802c61cce s390: Lock down the kernel when the IPL secure flag is set
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/5850c93175b9d2e1081873f4bbe08dead202cb08
|
|
||||||
5850c93175b9d2e1081873f4bbe08dead202cb08 efi: Lock down the kernel if booted in secure boot mode
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/53250b991f841be025fa4d264850dadc0fae2861
|
|
||||||
53250b991f841be025fa4d264850dadc0fae2861 efi: Add an EFI_SECURE_BOOT flag to indicate secure boot mode
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/72223fd1241cc5c70b96a491db14d54c83beadd8
|
|
||||||
72223fd1241cc5c70b96a491db14d54c83beadd8 security: lockdown: expose a hook to lock the kernel down
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7ba28f03674fa9346610c3fea7fc93bc58f06d2a
|
|
||||||
7ba28f03674fa9346610c3fea7fc93bc58f06d2a Make get_cert_list() use efi_status_to_str() to print error messages.
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2ae9082db0b54d831a9b3782c049d9917e37d89f
|
|
||||||
2ae9082db0b54d831a9b3782c049d9917e37d89f Add efi_status_to_str() and rework efi_status_to_err().
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/cee1461ada1b7e4b92cd154e7ec241119afcd644
|
|
||||||
cee1461ada1b7e4b92cd154e7ec241119afcd644 Add support for deprecating processors
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2420149f8f5fa9dd1e2dc793765b498022922a81
|
|
||||||
2420149f8f5fa9dd1e2dc793765b498022922a81 arm: aarch64: Drop the EXPERT setting from ARM64_FORCE_52BIT
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/1d69b30b98b60aff639351f5788d20a3b17f6e27
|
|
||||||
1d69b30b98b60aff639351f5788d20a3b17f6e27 iommu/arm-smmu: workaround DMA mode issues
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/6b2e73e508e7a117b1db91596097c00e5570f64a
|
|
||||||
6b2e73e508e7a117b1db91596097c00e5570f64a rh_kabi: introduce RH_KABI_EXCLUDE
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/ecb9206bce179eb600c52642a6753012a69ce4a2
|
|
||||||
ecb9206bce179eb600c52642a6753012a69ce4a2 ipmi: do not configure ipmi for HPE m400
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/473be59fe72afa9969cf8d10609ef3f14f594631
|
|
||||||
473be59fe72afa9969cf8d10609ef3f14f594631 IB/rxe: Mark Soft-RoCE Transport driver as tech-preview
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/b94117795261f9c074a7addca2252238871b5081
|
|
||||||
b94117795261f9c074a7addca2252238871b5081 scsi: smartpqi: add inspur advantech ids
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/cae871558c333880c1687cab6f2a71accf40d105
|
|
||||||
cae871558c333880c1687cab6f2a71accf40d105 ice: mark driver as tech-preview
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7d9cb007404211ea6638bde4a28dd0fbe8d95de0
|
|
||||||
7d9cb007404211ea6638bde4a28dd0fbe8d95de0 kABI: Add generic kABI macros to use for kABI workarounds
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/bd353e9aae8877dd490e6c92b67849e0dcfbab25
|
|
||||||
bd353e9aae8877dd490e6c92b67849e0dcfbab25 add pci_hw_vendor_status()
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/41a259999969bbdfe9f556ce71f2c3c07d7454f4
|
|
||||||
41a259999969bbdfe9f556ce71f2c3c07d7454f4 ahci: thunderx2: Fix for errata that affects stop engine
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2a107343529ce648c11bff62e9f72bbeec738f3f
|
|
||||||
2a107343529ce648c11bff62e9f72bbeec738f3f Vulcan: AHCI PCI bar fix for Broadcom Vulcan early silicon
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/03e48a48f400a51a182a1254cf22ff0c08706d76
|
|
||||||
03e48a48f400a51a182a1254cf22ff0c08706d76 bpf: Add tech preview taint for syscall
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/607f0e89af7ef5682f79f2eea0a99638a1bc0c4f
|
|
||||||
607f0e89af7ef5682f79f2eea0a99638a1bc0c4f bpf: set unprivileged_bpf_disabled to 1 by default, add a boot parameter
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/31da227877eb734ddb484bc519aae85ce200802e
|
|
||||||
31da227877eb734ddb484bc519aae85ce200802e add Red Hat-specific taint flags
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/7a2e2c83be0230667756cccb5bc3687419dfbb8b
|
|
||||||
7a2e2c83be0230667756cccb5bc3687419dfbb8b kdump: fix a grammar issue in a kernel message
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/d345d54d33e7d496c9d845e4723550dd37cb3f88
|
|
||||||
d345d54d33e7d496c9d845e4723550dd37cb3f88 tags.sh: Ignore redhat/rpm
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/5c67dc1eb0783a5c4ca4eb5c545ff6fe05facff0
|
|
||||||
5c67dc1eb0783a5c4ca4eb5c545ff6fe05facff0 put RHEL info into generated headers
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/ce12884c009ec3bed11100c9d19f6d97628cf8ae
|
|
||||||
ce12884c009ec3bed11100c9d19f6d97628cf8ae kdump: add support for crashkernel=auto
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/18fb1389afccdc5535977a10669b49a37829b55a
|
|
||||||
18fb1389afccdc5535977a10669b49a37829b55a kdump: round up the total memory size to 128M for crashkernel reservation
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/5fb9821441cc0b77101ad9c0dfaa747957a4cce4
|
|
||||||
5fb9821441cc0b77101ad9c0dfaa747957a4cce4 acpi: prefer booting with ACPI over DTS
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/0cf21a40db6fca5d89cf3d65808117c8c14e524e
|
|
||||||
0cf21a40db6fca5d89cf3d65808117c8c14e524e aarch64: acpi scan: Fix regression related to X-Gene UARTs
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/de13e14cc2388478d9a2c68c5d90affd92098f11
|
|
||||||
de13e14cc2388478d9a2c68c5d90affd92098f11 ACPI / irq: Workaround firmware issue on X-Gene based m400
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/71c098f4afa38a15a95495c14f71fb087ab27308
|
|
||||||
71c098f4afa38a15a95495c14f71fb087ab27308 modules: add rhelversion MODULE_INFO tag
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/3247f9c838f4aa91aa5d08c152b385d61554d4b5
|
|
||||||
3247f9c838f4aa91aa5d08c152b385d61554d4b5 ACPI: APEI: arm64: Ignore broken HPE moonshot APEI support
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/e80982feaa68226ff60d2f83dace2016c35270d3
|
|
||||||
e80982feaa68226ff60d2f83dace2016c35270d3 Add Red Hat tainting
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/2987f9a606df106f5bdfa4113eb55356a21085a6
|
|
||||||
2987f9a606df106f5bdfa4113eb55356a21085a6 Introduce CONFIG_RH_DISABLE_DEPRECATED
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/a99885a5e77af594dfdce586cc83e5911d8401ce
|
|
||||||
a99885a5e77af594dfdce586cc83e5911d8401ce Pull the RHEL version defines out of the Makefile
|
|
||||||
|
|
||||||
https://gitlab.com/cki-project/kernel-ark/-/commit/cd3a5d30570279538623ea8a1255db0ee4b728f7
|
|
||||||
cd3a5d30570279538623ea8a1255db0ee4b728f7 [initial commit] Add Red Hat variables in the top level makefile
|
|
||||||
|
|
25
README.rst
25
README.rst
|
@ -1,25 +0,0 @@
|
||||||
===================
|
|
||||||
The Kernel dist-git
|
|
||||||
===================
|
|
||||||
|
|
||||||
The kernel is maintained in a `source tree`_ rather than directly in dist-git.
|
|
||||||
The specfile is maintained as a `template`_ in the source tree along with a set
|
|
||||||
of build scripts to generate configurations, (S)RPMs, and to populate the
|
|
||||||
dist-git repository.
|
|
||||||
|
|
||||||
The `documentation`_ for the source tree covers how to contribute and maintain
|
|
||||||
the tree.
|
|
||||||
|
|
||||||
If you're looking for the downstream patch set it's available in the source
|
|
||||||
tree with "git log master..ark-patches" or
|
|
||||||
`online`_.
|
|
||||||
|
|
||||||
Each release in dist-git is tagged in the source repository so you can easily
|
|
||||||
check out the source tree for a build. The tags are in the format
|
|
||||||
name-version-release, but note release doesn't contain the dist tag since the
|
|
||||||
source can be built in different build roots (Fedora, CentOS, etc.)
|
|
||||||
|
|
||||||
.. _source tree: https://gitlab.com/cki-project/kernel-ark.git
|
|
||||||
.. _template: https://gitlab.com/cki-project/kernel-ark/-/blob/os-build/redhat/kernel.spec.template
|
|
||||||
.. _documentation: https://gitlab.com/cki-project/kernel-ark/-/wikis/home
|
|
||||||
.. _online: https://gitlab.com/cki-project/kernel-ark/-/commits/ark-patches
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
|
||||||
|
Kernel package tips & tricks.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The kernel is one of the more complicated packages in the distro, and
|
||||||
|
for the newcomer, some of the voodoo in the spec file can be somewhat scary.
|
||||||
|
This file attempts to document some of the magic.
|
||||||
|
|
||||||
|
|
||||||
|
Speeding up make prep
|
||||||
|
---------------------
|
||||||
|
The kernel is nearly 500MB of source code, and as such, 'make prep'
|
||||||
|
takes a while. The spec file employs some trickery so that repeated
|
||||||
|
invocations of make prep don't take as long. Ordinarily the %prep
|
||||||
|
phase of a package will delete the tree it is about to untar/patch.
|
||||||
|
The kernel %prep keeps around an unpatched version of the tree,
|
||||||
|
and makes a symlink tree clone of that clean tree and than applies
|
||||||
|
the patches listed in the spec to the symlink tree.
|
||||||
|
This makes a huge difference if you're doing multiple make preps a day.
|
||||||
|
As an added bonus, doing a diff between the clean tree and the symlink
|
||||||
|
tree is slightly faster than it would be doing two proper copies of the tree.
|
||||||
|
|
||||||
|
|
||||||
|
Build logs.
|
||||||
|
-----------
|
||||||
|
There's a convenience helper script in scripts/grab-logs.sh
|
||||||
|
that will grab the build logs from koji for the kernel version reported
|
||||||
|
by make verrel
|
||||||
|
|
||||||
|
|
||||||
|
Config hierarchy.
|
||||||
|
-----------------
|
||||||
|
Instead of having to maintain a config file for every arch variant we build on,
|
||||||
|
the kernel spec uses a nested system of configs. Each option CONFIG_FOO is
|
||||||
|
represented by a single file named CONFIG_FOO which contains the state (=y, =m,
|
||||||
|
=n). These options are collected in the folder base-generic. Architecture
|
||||||
|
specific options are set in nested folders. An option set in a nested folder
|
||||||
|
will override the same option set in one of the higher levels.
|
||||||
|
|
||||||
|
The individual CONFIG_FOO files only exist in the pkg-git repository. The RPM
|
||||||
|
contains kernel-foo.config files which are the result of combining all the
|
||||||
|
CONFIG_FOO files. The files are combined by running build_configs.sh. This
|
||||||
|
script _must_ be run each time one of the options is changed.
|
||||||
|
|
||||||
|
Example flow:
|
||||||
|
|
||||||
|
# Enable the option CONFIG_ABC123 as a module for all arches
|
||||||
|
echo "CONFIG_ABC123=m" > configs/base-generic/CONFIG_ABC1234
|
||||||
|
# enable the option CONFIG_XYZ321 for only x86
|
||||||
|
echo "# CONFIG_XYZ321 is not set" > configs/base-generic/CONFIG_XYZ321
|
||||||
|
echo "CONFIG_XYZ321=m" > configs/base-generic/x86/CONFIG_XYZ321
|
||||||
|
# regenerate the combined config files
|
||||||
|
./build_configs.sh
|
||||||
|
|
||||||
|
The file config_generation gives a listing of what folders go into each
|
||||||
|
config file generated.
|
||||||
|
|
||||||
|
Debug options.
|
||||||
|
--------------
|
||||||
|
This is a little complicated, as the purpose & meaning of this changes
|
||||||
|
depending on where we are in the release cycle.
|
||||||
|
If we are building for a current stable release, 'make release' has
|
||||||
|
typically been run already, which sets up the following..
|
||||||
|
- Two builds occur, a 'kernel' and a 'kernel-debug' flavor.
|
||||||
|
- kernel-debug will get various heavyweight debugging options like
|
||||||
|
lockdep etc turned on.
|
||||||
|
|
||||||
|
If we are building for rawhide, 'make debug' has been run, which changes
|
||||||
|
the status quo to:
|
||||||
|
- We only build one kernel 'kernel'
|
||||||
|
- The debug options are always turned on.
|
||||||
|
This is done to increase coverage testing, as not many people actually
|
||||||
|
run kernel-debug.
|
||||||
|
|
||||||
|
The debug options are managed in a separate heierarchy under base-debug. This
|
||||||
|
works in a similar manner to base-generic. More deeply nested folders, again,
|
||||||
|
override options. The file config_generation gives a listing of what folders
|
||||||
|
go into each config file generated.
|
|
@ -0,0 +1,10 @@
|
||||||
|
Config TODOs:
|
||||||
|
* review & disable a bunch of the I2C, RTC, DVB, SOUND options.
|
||||||
|
|
||||||
|
Spec file TODOs:
|
||||||
|
|
||||||
|
* modules-extra: Do a few more things to make it a bit more robust.
|
||||||
|
- Allow for comments in the mod-extra.list file.
|
||||||
|
- Don't fail the build if a module is listed but not built (maybe).
|
||||||
|
- See if it can be tied into Kconfig instead of module names.
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
From patchwork Thu Jun 28 08:13:30 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
Subject: [2/3] mmc: sdhci: add quirk to prevent higher speed modes
|
||||||
|
From: Stefan Agner <stefan@agner.ch>
|
||||||
|
X-Patchwork-Id: 10493273
|
||||||
|
Message-Id: <20180628081331.13051-3-stefan@agner.ch>
|
||||||
|
To: adrian.hunter@intel.com, ulf.hansson@linaro.org
|
||||||
|
Cc: fabio.estevam@nxp.com, haibo.chen@nxp.com, aisheng.dong@nxp.com,
|
||||||
|
michael@amarulasolutions.com, rmk+kernel@armlinux.org.uk,
|
||||||
|
linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||||
|
Stefan Agner <stefan@agner.ch>
|
||||||
|
Date: Thu, 28 Jun 2018 10:13:30 +0200
|
||||||
|
|
||||||
|
Some hosts are capable of running higher speed modes but do not
|
||||||
|
have the board support for it. Introduce a quirk which prevents
|
||||||
|
the stack from using modes running at 100MHz or faster.
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Agner <stefan@agner.ch>
|
||||||
|
---
|
||||||
|
drivers/mmc/host/sdhci.c | 8 ++++++++
|
||||||
|
drivers/mmc/host/sdhci.h | 2 ++
|
||||||
|
2 files changed, 10 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
|
||||||
|
index 1c828e0e9905..8ac257dfaab3 100644
|
||||||
|
--- a/drivers/mmc/host/sdhci.c
|
||||||
|
+++ b/drivers/mmc/host/sdhci.c
|
||||||
|
@@ -3749,6 +3749,14 @@ int sdhci_setup_host(struct sdhci_host *host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (host->quirks2 & SDHCI_QUIRK2_NO_UHS_HS200_HS400) {
|
||||||
|
+ host->caps1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
|
||||||
|
+ SDHCI_SUPPORT_DDR50);
|
||||||
|
+
|
||||||
|
+ mmc->caps2 &= ~(MMC_CAP2_HSX00_1_8V | MMC_CAP2_HSX00_1_2V |
|
||||||
|
+ MMC_CAP2_HS400_ES);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (host->quirks2 & SDHCI_QUIRK2_NO_1_8_V) {
|
||||||
|
host->caps1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
|
||||||
|
SDHCI_SUPPORT_DDR50);
|
||||||
|
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
|
||||||
|
index 23966f887da6..cb2433d6d61f 100644
|
||||||
|
--- a/drivers/mmc/host/sdhci.h
|
||||||
|
+++ b/drivers/mmc/host/sdhci.h
|
||||||
|
@@ -450,6 +450,8 @@ struct sdhci_host {
|
||||||
|
* block count.
|
||||||
|
*/
|
||||||
|
#define SDHCI_QUIRK2_USE_32BIT_BLK_CNT (1<<18)
|
||||||
|
+/* Do not support any higher speeds (>50MHz) */
|
||||||
|
+#define SDHCI_QUIRK2_NO_UHS_HS200_HS400 (1<<19)
|
||||||
|
|
||||||
|
int irq; /* Device IRQ */
|
||||||
|
void __iomem *ioaddr; /* Mapped address */
|
|
@ -0,0 +1,139 @@
|
||||||
|
From patchwork Tue Oct 16 14:00:20 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
X-Patchwork-Submitter: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
|
X-Patchwork-Id: 1000432
|
||||||
|
Return-Path: <SRS0=e/xi=M4=vger.kernel.org=linux-kernel-owner@kernel.org>
|
||||||
|
Received: from mail.kernel.org (mail.kernel.org [198.145.29.99])
|
||||||
|
by smtp.lore.kernel.org (Postfix) with ESMTP id 41BB8C04EBD
|
||||||
|
for <linux-kernel@archiver.kernel.org>; Tue, 16 Oct 2018 14:01:24 +0000 (UTC)
|
||||||
|
Received: from vger.kernel.org (vger.kernel.org [209.132.180.67])
|
||||||
|
by mail.kernel.org (Postfix) with ESMTP id 032862089E
|
||||||
|
for <linux-kernel@archiver.kernel.org>; Tue, 16 Oct 2018 14:01:24 +0000 (UTC)
|
||||||
|
Authentication-Results: mail.kernel.org;
|
||||||
|
dkim=pass (1024-bit key) header.d=linaro.org header.i=@linaro.org
|
||||||
|
header.b="OwrJnI6D"
|
||||||
|
DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 032862089E
|
||||||
|
Authentication-Results: mail.kernel.org;
|
||||||
|
dmarc=fail (p=none dis=none) header.from=linaro.org
|
||||||
|
Authentication-Results: mail.kernel.org;
|
||||||
|
spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org
|
||||||
|
Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand
|
||||||
|
id S1727241AbeJPVv6 (ORCPT
|
||||||
|
<rfc822;linux-kernel@archiver.kernel.org>);
|
||||||
|
Tue, 16 Oct 2018 17:51:58 -0400
|
||||||
|
Received: from mail-wr1-f68.google.com ([209.85.221.68]:43800 "EHLO
|
||||||
|
mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org
|
||||||
|
with ESMTP id S1727149AbeJPVv6 (ORCPT
|
||||||
|
<rfc822;linux-kernel@vger.kernel.org>);
|
||||||
|
Tue, 16 Oct 2018 17:51:58 -0400
|
||||||
|
Received: by mail-wr1-f68.google.com with SMTP id n1-v6so25672615wrt.10
|
||||||
|
for <linux-kernel@vger.kernel.org>;
|
||||||
|
Tue, 16 Oct 2018 07:01:21 -0700 (PDT)
|
||||||
|
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||||
|
d=linaro.org; s=google;
|
||||||
|
h=from:to:cc:subject:date:message-id;
|
||||||
|
bh=AyjUgKMFmAFThaK4GvWsdrdl4JZ3kTa6zVPrOmGMjOA=;
|
||||||
|
b=OwrJnI6D/huHRM5jiagiGiKBxUHFUlMvwe1t2GexoIKOTqtFGY3vwPCkrAUWdnT5+f
|
||||||
|
n+wvqEq+enR14QpmLTY3VNYAsxMcDtJOZ2R2Cw0rRdiHypMeUGRanfszUimV9omTlSGH
|
||||||
|
ApMgMERT+Pim+X1tp/uH775sDaVLHsJDyJb2Y=
|
||||||
|
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
|
||||||
|
d=1e100.net; s=20161025;
|
||||||
|
h=x-gm-message-state:from:to:cc:subject:date:message-id;
|
||||||
|
bh=AyjUgKMFmAFThaK4GvWsdrdl4JZ3kTa6zVPrOmGMjOA=;
|
||||||
|
b=DO/kT4iXCQgCsPC53FV7CMKKHaDQNQtZUIfHfJGQ2iRgCRNsZSYU6JYHxxjsqWSLyq
|
||||||
|
c46PNGLDG4qPZf/tveVt9wc9SPdKTk3klyT5NnQvdlNY8uv5/GTXINOWmNE0xD9hqvaP
|
||||||
|
ml6yJRUA51/KJU73p7XhGvWlMmEuStLUtXa4rlqKgush6lllYhSFpca2xkiKFhqcd+Bc
|
||||||
|
HHXRh2i0OVgTdmdb0+lSKyLXm74UHrhv1WEbgjGm+Mharwz/qsidTCXfqKPC7izgstBS
|
||||||
|
L+mjOACqna60eEsABW/p2nH9vxXAsU2ArAnmB714yeh9uckl1uRzYmMQCSD1LmmBN0q4
|
||||||
|
4UvQ==
|
||||||
|
X-Gm-Message-State: ABuFfojBZLkXjdlBc4AIjobar5Yk+68lR2+TEpPVGjsScLNzcmIj5eYO
|
||||||
|
yyEhPWYj3vc1MHjUcMfQLt7ahg==
|
||||||
|
X-Google-Smtp-Source:
|
||||||
|
ACcGV614RNSZy+OjIvsEaE9ONlZaDAeI1a8EpD+wP5Gt58g75Bh8DJgL6KJJ2ZjTenoZPwHLydiQBg==
|
||||||
|
X-Received: by 2002:adf:cd0c:: with SMTP id
|
||||||
|
w12-v6mr19534363wrm.67.1539698480294;
|
||||||
|
Tue, 16 Oct 2018 07:01:20 -0700 (PDT)
|
||||||
|
Received: from localhost.localdomain (221.56.88.92.rev.sfr.net.
|
||||||
|
[92.88.56.221])
|
||||||
|
by smtp.gmail.com with ESMTPSA id
|
||||||
|
b81-v6sm10195012wmh.47.2018.10.16.07.01.18
|
||||||
|
(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
|
||||||
|
Tue, 16 Oct 2018 07:01:19 -0700 (PDT)
|
||||||
|
From: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
|
To: heiko@sntech.de
|
||||||
|
Cc: linux-kernel@vger.kernel.org, Rob Herring <robh+dt@kernel.org>,
|
||||||
|
Mark Rutland <mark.rutland@arm.com>,
|
||||||
|
Vicente Bergas <vicencb@gmail.com>,
|
||||||
|
Shawn Lin <shawn.lin@rock-chips.com>,
|
||||||
|
Ezequiel Garcia <ezequiel@collabora.com>,
|
||||||
|
Enric Balletbo i Serra <enric.balletbo@collabora.com>,
|
||||||
|
Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>,
|
||||||
|
devicetree@vger.kernel.org (open list:OPEN FIRMWARE AND FLATTENED
|
||||||
|
DEVICE TREE BINDINGS),
|
||||||
|
linux-arm-kernel@lists.infradead.org (moderated list:ARM/Rockchip SoC
|
||||||
|
support),
|
||||||
|
linux-rockchip@lists.infradead.org (open list:ARM/Rockchip SoC
|
||||||
|
support)
|
||||||
|
Subject: [PATCH] DT: rockchip: Fix stability issues with the 'performance'
|
||||||
|
governor on rock960
|
||||||
|
Date: Tue, 16 Oct 2018 16:00:20 +0200
|
||||||
|
Message-Id: <1539698431-12616-1-git-send-email-daniel.lezcano@linaro.org>
|
||||||
|
X-Mailer: git-send-email 2.7.4
|
||||||
|
Sender: linux-kernel-owner@vger.kernel.org
|
||||||
|
Precedence: bulk
|
||||||
|
List-ID: <linux-kernel.vger.kernel.org>
|
||||||
|
X-Mailing-List: linux-kernel@vger.kernel.org
|
||||||
|
|
||||||
|
When the performance governor is set as default, the rock960 hangs
|
||||||
|
around one minute after booting, whatever the activity is (idle, key
|
||||||
|
pressed, loaded, ...).
|
||||||
|
|
||||||
|
Based on the commit log found at https://patchwork.kernel.org/patch/10092377/
|
||||||
|
|
||||||
|
"vdd_log has no consumer and therefore will not be set to a specific
|
||||||
|
voltage. Still the PWM output pin gets configured and thence the vdd_log
|
||||||
|
output voltage will changed from it's default. Depending on the idle
|
||||||
|
state of the PWM this will slightly over or undervoltage the logic supply
|
||||||
|
of the RK3399 and cause instability with GbE (undervoltage) and PCIe
|
||||||
|
(overvoltage). Since the default value set by a voltage divider is the
|
||||||
|
correct supply voltage and we don't need to change it during runtime we
|
||||||
|
remove the rail from the devicetree completely so the PWM pin will not
|
||||||
|
be configured."
|
||||||
|
|
||||||
|
After removing the vdd-log from the rock960's specific DT, the board
|
||||||
|
does no longer hang and shows a stable behavior.
|
||||||
|
|
||||||
|
Apply the same change for the rock960 by removing the vdd-log from the
|
||||||
|
DT.
|
||||||
|
|
||||||
|
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
|
Tested-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi | 12 ------------
|
||||||
|
1 file changed, 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
|
||||||
|
index 6c8c4ab..56abbb0 100644
|
||||||
|
--- a/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/rk3399-rock960.dtsi
|
||||||
|
@@ -57,18 +57,6 @@
|
||||||
|
regulator-always-on;
|
||||||
|
vin-supply = <&vcc_sys>;
|
||||||
|
};
|
||||||
|
-
|
||||||
|
- vdd_log: vdd-log {
|
||||||
|
- compatible = "pwm-regulator";
|
||||||
|
- pwms = <&pwm2 0 25000 0>;
|
||||||
|
- regulator-name = "vdd_log";
|
||||||
|
- regulator-min-microvolt = <800000>;
|
||||||
|
- regulator-max-microvolt = <1400000>;
|
||||||
|
- regulator-always-on;
|
||||||
|
- regulator-boot-on;
|
||||||
|
- vin-supply = <&vcc_sys>;
|
||||||
|
- };
|
||||||
|
-
|
||||||
|
};
|
||||||
|
|
||||||
|
&cpu_l0 {
|
|
@ -0,0 +1,29 @@
|
||||||
|
From 487ff7b0e537506057960a0c2d9482d19f2acf4a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
Date: Wed, 26 Apr 2017 11:12:54 +0100
|
||||||
|
Subject: [PATCH] Add option of 13 for FORCE_MAX_ZONEORDER
|
||||||
|
|
||||||
|
This is a hack, but it's what the other distros currently use
|
||||||
|
for aarch64 with 4K pages so we'll do the same while upstream
|
||||||
|
decides what the best outcome is (which isn't this).
|
||||||
|
|
||||||
|
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm64/Kconfig | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
|
||||||
|
index 3741859765cf..deec9511f1d3 100644
|
||||||
|
--- a/arch/arm64/Kconfig
|
||||||
|
+++ b/arch/arm64/Kconfig
|
||||||
|
@@ -751,6 +751,7 @@ config XEN
|
||||||
|
config FORCE_MAX_ZONEORDER
|
||||||
|
int
|
||||||
|
default "14" if (ARM64_64K_PAGES && TRANSPARENT_HUGEPAGE)
|
||||||
|
+ default "13" if (ARCH_THUNDER && !ARM64_64K_PAGES)
|
||||||
|
default "12" if (ARM64_16K_PAGES && TRANSPARENT_HUGEPAGE)
|
||||||
|
default "11"
|
||||||
|
help
|
||||||
|
--
|
||||||
|
2.12.2
|
||||||
|
|
|
@ -0,0 +1,184 @@
|
||||||
|
From patchwork Fri May 11 02:27:50 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
Subject: [1/2] arm64: arch_timer: Workaround for Allwinner A64 timer
|
||||||
|
instability
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
X-Patchwork-Id: 10392891
|
||||||
|
Message-Id: <20180511022751.9096-2-samuel@sholland.org>
|
||||||
|
To: Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,
|
||||||
|
Catalin Marinas <catalin.marinas@arm.com>,
|
||||||
|
Will Deacon <will.deacon@arm.com>,
|
||||||
|
Daniel Lezcano <daniel.lezcano@linaro.org>,
|
||||||
|
Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com>
|
||||||
|
Cc: linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org,
|
||||||
|
linux-arm-kernel@lists.infradead.org, Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Thu, 10 May 2018 21:27:50 -0500
|
||||||
|
|
||||||
|
The Allwinner A64 SoC is known [1] to have an unstable architectural
|
||||||
|
timer, which manifests itself most obviously in the time jumping forward
|
||||||
|
a multiple of 95 years [2][3]. This coincides with 2^56 cycles at a
|
||||||
|
timer frequency of 24 MHz, implying that the time went slightly backward
|
||||||
|
(and this was interpreted by the kernel as it jumping forward and
|
||||||
|
wrapping around past the epoch).
|
||||||
|
|
||||||
|
Further investigation revealed instability in the low bits of CNTVCT at
|
||||||
|
the point a high bit rolls over. This leads to power-of-two cycle
|
||||||
|
forward and backward jumps. (Testing shows that forward jumps are about
|
||||||
|
twice as likely as backward jumps.)
|
||||||
|
|
||||||
|
Without trapping reads to CNTVCT, a userspace program is able to read it
|
||||||
|
in a loop faster than it changes. A test program running on all 4 CPU
|
||||||
|
cores that reported jumps larger than 100 ms was run for 13.6 hours and
|
||||||
|
reported the following:
|
||||||
|
|
||||||
|
Count | Event
|
||||||
|
-------+---------------------------
|
||||||
|
9940 | jumped backward 699ms
|
||||||
|
268 | jumped backward 1398ms
|
||||||
|
1 | jumped backward 2097ms
|
||||||
|
16020 | jumped forward 175ms
|
||||||
|
6443 | jumped forward 699ms
|
||||||
|
2976 | jumped forward 1398ms
|
||||||
|
9 | jumped forward 356516ms
|
||||||
|
9 | jumped forward 357215ms
|
||||||
|
4 | jumped forward 714430ms
|
||||||
|
1 | jumped forward 3578440ms
|
||||||
|
|
||||||
|
This works out to a jump larger than 100 ms about every 5.5 seconds on
|
||||||
|
each CPU core.
|
||||||
|
|
||||||
|
The largest jump (almost an hour!) was the following sequence of reads:
|
||||||
|
0x0000007fffffffff → 0x00000093feffffff → 0x0000008000000000
|
||||||
|
|
||||||
|
Note that the middle bits don't necessarily all read as all zeroes or
|
||||||
|
all ones during the anomalous behavior; however the low 11 bits checked
|
||||||
|
by the function in this patch have never been observed with any other
|
||||||
|
value.
|
||||||
|
|
||||||
|
Also note that smaller jumps are much more common, with the smallest
|
||||||
|
backward jumps of 2048 cycles observed over 400 times per second on each
|
||||||
|
core. (Of course, this is partially due to lower bits rolling over more
|
||||||
|
frequently.) Any one of these could have caused the 95 year time skip.
|
||||||
|
|
||||||
|
Similar anomalies were observed while reading CNTPCT (after patching the
|
||||||
|
kernel to allow reads from userspace). However, the jumps are much less
|
||||||
|
frequent, and only small jumps were observed. The same program as before
|
||||||
|
(except now reading CNTPCT) observed after 72 hours:
|
||||||
|
|
||||||
|
Count | Event
|
||||||
|
-------+---------------------------
|
||||||
|
17 | jumped backward 699ms
|
||||||
|
52 | jumped forward 175ms
|
||||||
|
2831 | jumped forward 699ms
|
||||||
|
5 | jumped forward 1398ms
|
||||||
|
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
|
||||||
|
Tested-by: Andre Przywara <andre.przywara@arm.com>
|
||||||
|
|
||||||
|
========================================================================
|
||||||
|
|
||||||
|
Because the CPU can read the CNTPCT/CNTVCT registers faster than they
|
||||||
|
change, performing two reads of the register and comparing the high bits
|
||||||
|
(like other workarounds) is not a workable solution. And because the
|
||||||
|
timer can jump both forward and backward, no pair of reads can
|
||||||
|
distinguish a good value from a bad one. The only way to guarantee a
|
||||||
|
good value from consecutive reads would be to read _three_ times, and
|
||||||
|
take the middle value iff the three values are 1) individually unique
|
||||||
|
and 2) increasing. This takes at minimum 3 cycles (125 ns), or more if
|
||||||
|
an anomaly is detected.
|
||||||
|
|
||||||
|
However, since there is a distinct pattern to the bad values, we can
|
||||||
|
optimize the common case (2046/2048 of the time) to a single read by
|
||||||
|
simply ignoring values that match the pattern. This still takes no more
|
||||||
|
than 3 cycles in the worst case, and requires much less code.
|
||||||
|
|
||||||
|
[1]: https://github.com/armbian/build/commit/a08cd6fe7ae9
|
||||||
|
[2]: https://forum.armbian.com/topic/3458-a64-datetime-clock-issue/
|
||||||
|
[3]: https://irclog.whitequark.org/linux-sunxi/2018-01-26
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
drivers/clocksource/Kconfig | 11 ++++++++++
|
||||||
|
drivers/clocksource/arm_arch_timer.c | 39 ++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 50 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/clocksource/Kconfig b/drivers/clocksource/Kconfig
|
||||||
|
index 8e8a09755d10..7a5d434dd30b 100644
|
||||||
|
--- a/drivers/clocksource/Kconfig
|
||||||
|
+++ b/drivers/clocksource/Kconfig
|
||||||
|
@@ -364,6 +364,17 @@ config ARM64_ERRATUM_858921
|
||||||
|
The workaround will be dynamically enabled when an affected
|
||||||
|
core is detected.
|
||||||
|
|
||||||
|
+config SUN50I_A64_UNSTABLE_TIMER
|
||||||
|
+ bool "Workaround for Allwinner A64 timer instability"
|
||||||
|
+ default y
|
||||||
|
+ depends on ARM_ARCH_TIMER && ARM64 && ARCH_SUNXI
|
||||||
|
+ select ARM_ARCH_TIMER_OOL_WORKAROUND
|
||||||
|
+ help
|
||||||
|
+ This option enables a workaround for instability in the timer on
|
||||||
|
+ the Allwinner A64 SoC. The workaround will only be active if the
|
||||||
|
+ allwinner,sun50i-a64-unstable-timer property is found in the
|
||||||
|
+ timer node.
|
||||||
|
+
|
||||||
|
config ARM_GLOBAL_TIMER
|
||||||
|
bool "Support for the ARM global timer" if COMPILE_TEST
|
||||||
|
select TIMER_OF if OF
|
||||||
|
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
|
||||||
|
index 57cb2f00fc07..66ce13578c52 100644
|
||||||
|
--- a/drivers/clocksource/arm_arch_timer.c
|
||||||
|
+++ b/drivers/clocksource/arm_arch_timer.c
|
||||||
|
@@ -319,6 +319,36 @@ static u64 notrace arm64_858921_read_cntvct_el0(void)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef CONFIG_SUN50I_A64_UNSTABLE_TIMER
|
||||||
|
+/*
|
||||||
|
+ * The low bits of each register can transiently read as all ones or all zeroes
|
||||||
|
+ * when bit 11 or greater rolls over. Since the value can jump both backward
|
||||||
|
+ * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), it is simplest to just
|
||||||
|
+ * ignore register values with all ones or zeros in the low bits.
|
||||||
|
+ */
|
||||||
|
+static u64 notrace sun50i_a64_read_cntpct_el0(void)
|
||||||
|
+{
|
||||||
|
+ u64 val;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ val = read_sysreg(cntpct_el0);
|
||||||
|
+ } while (((val + 1) & GENMASK(10, 0)) <= 1);
|
||||||
|
+
|
||||||
|
+ return val;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static u64 notrace sun50i_a64_read_cntvct_el0(void)
|
||||||
|
+{
|
||||||
|
+ u64 val;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ val = read_sysreg(cntvct_el0);
|
||||||
|
+ } while (((val + 1) & GENMASK(10, 0)) <= 1);
|
||||||
|
+
|
||||||
|
+ return val;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND
|
||||||
|
DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround);
|
||||||
|
EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround);
|
||||||
|
@@ -408,6 +438,15 @@ static const struct arch_timer_erratum_workaround ool_workarounds[] = {
|
||||||
|
.read_cntvct_el0 = arm64_1188873_read_cntvct_el0,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
+#ifdef CONFIG_SUN50I_A64_UNSTABLE_TIMER
|
||||||
|
+ {
|
||||||
|
+ .match_type = ate_match_dt,
|
||||||
|
+ .id = "allwinner,sun50i-a64-unstable-timer",
|
||||||
|
+ .desc = "Allwinner A64 timer instability",
|
||||||
|
+ .read_cntpct_el0 = sun50i_a64_read_cntpct_el0,
|
||||||
|
+ .read_cntvct_el0 = sun50i_a64_read_cntvct_el0,
|
||||||
|
+ },
|
||||||
|
+#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef bool (*ate_match_fn_t)(const struct arch_timer_erratum_workaround *,
|
|
@ -0,0 +1,38 @@
|
||||||
|
From patchwork Fri May 11 02:27:51 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
Subject: [2/2] arm64: dts: allwinner: a64: Enable A64 timer workaround
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
X-Patchwork-Id: 10392889
|
||||||
|
Message-Id: <20180511022751.9096-3-samuel@sholland.org>
|
||||||
|
To: Maxime Ripard <maxime.ripard@bootlin.com>, Chen-Yu Tsai <wens@csie.org>,
|
||||||
|
Catalin Marinas <catalin.marinas@arm.com>,
|
||||||
|
Will Deacon <will.deacon@arm.com>,
|
||||||
|
Daniel Lezcano <daniel.lezcano@linaro.org>,
|
||||||
|
Thomas Gleixner <tglx@linutronix.de>, Marc Zyngier <marc.zyngier@arm.com>
|
||||||
|
Cc: linux-sunxi@googlegroups.com, linux-kernel@vger.kernel.org,
|
||||||
|
linux-arm-kernel@lists.infradead.org, Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Thu, 10 May 2018 21:27:51 -0500
|
||||||
|
|
||||||
|
As instability in the architectural timer has been observed on multiple
|
||||||
|
devices using this SoC, inluding the Pine64 and the Orange Pi Win,
|
||||||
|
enable the workaround in the SoC's device tree.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
---
|
||||||
|
arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||||
|
index 1b2ef28c42bd..5202b76e9684 100644
|
||||||
|
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi
|
||||||
|
@@ -152,6 +152,7 @@
|
||||||
|
|
||||||
|
timer {
|
||||||
|
compatible = "arm,armv8-timer";
|
||||||
|
+ allwinner,sun50i-a64-unstable-timer;
|
||||||
|
interrupts = <GIC_PPI 13
|
||||||
|
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>,
|
||||||
|
<GIC_PPI 14
|
|
@ -0,0 +1,38 @@
|
||||||
|
From: "kernel-team@fedoraproject.org" <kernel-team@fedoraproject.org>
|
||||||
|
Date: Wed, 6 Feb 2013 09:57:47 -0500
|
||||||
|
Subject: [PATCH] ath9k: rx dma stop check
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/net/wireless/ath/ath9k/mac.c | 12 +++++++++++-
|
||||||
|
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
|
||||||
|
index bba85d1a6cd1..ebbee8f17130 100644
|
||||||
|
--- a/drivers/net/wireless/ath/ath9k/mac.c
|
||||||
|
+++ b/drivers/net/wireless/ath/ath9k/mac.c
|
||||||
|
@@ -693,7 +693,7 @@ bool ath9k_hw_stopdmarecv(struct ath_hw *ah, bool *reset)
|
||||||
|
{
|
||||||
|
#define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */
|
||||||
|
struct ath_common *common = ath9k_hw_common(ah);
|
||||||
|
- u32 mac_status, last_mac_status = 0;
|
||||||
|
+ u32 mac_status = 0, last_mac_status = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Enable access to the DMA observation bus */
|
||||||
|
@@ -723,6 +723,16 @@ bool ath9k_hw_stopdmarecv(struct ath_hw *ah, bool *reset)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == 0) {
|
||||||
|
+ if (!AR_SREV_9300_20_OR_LATER(ah) &&
|
||||||
|
+ (mac_status & 0x700) == 0) {
|
||||||
|
+ /*
|
||||||
|
+ * DMA is idle but the MAC is still stuck
|
||||||
|
+ * processing events
|
||||||
|
+ */
|
||||||
|
+ *reset = true;
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ath_err(common,
|
||||||
|
"DMA failed to stop in %d ms AR_CR=0x%08x AR_DIAG_SW=0x%08x DMADBG_7=0x%08x\n",
|
||||||
|
AH_RX_STOP_DMA_TIMEOUT / 1000,
|
|
@ -0,0 +1,396 @@
|
||||||
|
From 624e057827435de39274c34e20c2d937cb9d4ac3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
Date: Thu, 31 May 2018 19:08:12 +0100
|
||||||
|
Subject: [PATCH] bcm2835: cpufreq: add CPU frequency control driver
|
||||||
|
|
||||||
|
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/bcm2835-rpi.dtsi | 7 ++
|
||||||
|
arch/arm/boot/dts/bcm2837.dtsi | 33 +++++++
|
||||||
|
drivers/clk/bcm/Kconfig | 8 ++
|
||||||
|
drivers/clk/bcm/Makefile | 1 +
|
||||||
|
drivers/clk/bcm/clk-raspberrypi.c | 138 +++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 187 insertions(+)
|
||||||
|
create mode 100644 drivers/clk/bcm/clk-raspberrypi.c
|
||||||
|
|
||||||
|
diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||||
|
index 6c3cfaa77f3d..e6d1627ec421 100644
|
||||||
|
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||||
|
@@ -35,6 +35,13 @@
|
||||||
|
reg = <0x7e00b840 0xf>;
|
||||||
|
interrupts = <0 2>;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+ arm_clk: arm_clk {
|
||||||
|
+ compatible = "raspberrypi,bcm2835-cpu";
|
||||||
|
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||||
|
+ #clock-cells = <0>;
|
||||||
|
+ clock-output-names = "arm";
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
index 7704bb029605..c24176282a1f 100644
|
||||||
|
--- a/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
@@ -38,6 +38,9 @@
|
||||||
|
reg = <0>;
|
||||||
|
enable-method = "spin-table";
|
||||||
|
cpu-release-addr = <0x0 0x000000d8>;
|
||||||
|
+ clocks = <&arm_clk>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
@@ -46,6 +49,9 @@
|
||||||
|
reg = <1>;
|
||||||
|
enable-method = "spin-table";
|
||||||
|
cpu-release-addr = <0x0 0x000000e0>;
|
||||||
|
+ clocks = <&arm_clk>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu2: cpu@2 {
|
||||||
|
@@ -54,6 +60,9 @@
|
||||||
|
reg = <2>;
|
||||||
|
enable-method = "spin-table";
|
||||||
|
cpu-release-addr = <0x0 0x000000e8>;
|
||||||
|
+ clocks = <&arm_clk>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu3: cpu@3 {
|
||||||
|
@@ -62,6 +71,30 @@
|
||||||
|
reg = <3>;
|
||||||
|
enable-method = "spin-table";
|
||||||
|
cpu-release-addr = <0x0 0x000000f0>;
|
||||||
|
+ clocks = <&arm_clk>;
|
||||||
|
+ clock-names = "cpu";
|
||||||
|
+ operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cpu0_opp_table: opp_table0 {
|
||||||
|
+ compatible = "operating-points-v2";
|
||||||
|
+ opp-shared;
|
||||||
|
+
|
||||||
|
+ opp@600000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <600000000>;
|
||||||
|
+ clock-latency-ns = <355000>;
|
||||||
|
+ opp-suspend;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp@900000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <900000000>;
|
||||||
|
+ clock-latency-ns = <355000>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ opp@1200000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1200000000>;
|
||||||
|
+ clock-latency-ns = <355000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
diff --git a/drivers/clk/bcm/Kconfig b/drivers/clk/bcm/Kconfig
|
||||||
|
index 4c4bd85f707c..e40bd19da22b 100644
|
||||||
|
--- a/drivers/clk/bcm/Kconfig
|
||||||
|
+++ b/drivers/clk/bcm/Kconfig
|
||||||
|
@@ -63,3 +63,11 @@ config CLK_BCM_SR
|
||||||
|
default ARCH_BCM_IPROC
|
||||||
|
help
|
||||||
|
Enable common clock framework support for the Broadcom Stingray SoC
|
||||||
|
+
|
||||||
|
+config CLK_RASPBERRYPI_CPU
|
||||||
|
+ bool "Raspberry Pi CPU clock driver"
|
||||||
|
+ depends on ARCH_BCM2835 || (COMPILE_TEST && OF)
|
||||||
|
+ depends on RASPBERRYPI_FIRMWARE=y
|
||||||
|
+ help
|
||||||
|
+ This enables support for the RPi CPU clock which can be adjusted
|
||||||
|
+ via the RPi firmware.
|
||||||
|
diff --git a/drivers/clk/bcm/Makefile b/drivers/clk/bcm/Makefile
|
||||||
|
index 002661d39128..a028b0a90b6e 100644
|
||||||
|
--- a/drivers/clk/bcm/Makefile
|
||||||
|
+++ b/drivers/clk/bcm/Makefile
|
||||||
|
@@ -8,6 +8,7 @@ obj-$(CONFIG_COMMON_CLK_IPROC) += clk-iproc-armpll.o clk-iproc-pll.o clk-iproc-a
|
||||||
|
obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835.o
|
||||||
|
obj-$(CONFIG_ARCH_BCM2835) += clk-bcm2835-aux.o
|
||||||
|
obj-$(CONFIG_ARCH_BCM_53573) += clk-bcm53573-ilp.o
|
||||||
|
+obj-$(CONFIG_CLK_RASPBERRYPI_CPU) += clk-raspberrypi.o
|
||||||
|
obj-$(CONFIG_CLK_BCM_CYGNUS) += clk-cygnus.o
|
||||||
|
obj-$(CONFIG_CLK_BCM_HR2) += clk-hr2.o
|
||||||
|
obj-$(CONFIG_CLK_BCM_NSP) += clk-nsp.o
|
||||||
|
diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..046efc822a59
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/clk/bcm/clk-raspberrypi.c
|
||||||
|
@@ -0,0 +1,138 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+/*
|
||||||
|
+ * Raspberry Pi CPU clock driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2018 Stefan Wahren <stefan.wahren@i2se.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/clk-provider.h>
|
||||||
|
+#include <linux/device.h>
|
||||||
|
+#include <linux/err.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||||
|
+
|
||||||
|
+#define VCMSG_ID_ARM_CLOCK 0x000000003 /* Clock/Voltage ID's */
|
||||||
|
+
|
||||||
|
+struct rpi_cpu_clkgen {
|
||||||
|
+ struct clk_hw hw;
|
||||||
|
+ struct rpi_firmware *fw;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* tag part of the message */
|
||||||
|
+struct prop {
|
||||||
|
+ u32 id; /* the ID of the clock/voltage to get or set */
|
||||||
|
+ u32 val; /* the value (e.g. rate (in Hz)) to set */
|
||||||
|
+} __packed;
|
||||||
|
+
|
||||||
|
+static int rpi_cpu_clock_property(struct rpi_firmware *fw, u32 tag, u32 *val)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ struct prop msg = {
|
||||||
|
+ .id = VCMSG_ID_ARM_CLOCK,
|
||||||
|
+ .val = *val,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ ret = rpi_firmware_property(fw, tag, &msg, sizeof(msg));
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ *val = msg.val;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static unsigned long rpi_cpu_get_rate(struct clk_hw *hw,
|
||||||
|
+ unsigned long parent_rate)
|
||||||
|
+{
|
||||||
|
+ struct rpi_cpu_clkgen *cpu = container_of(hw, struct rpi_cpu_clkgen, hw);
|
||||||
|
+ u32 rate = 0;
|
||||||
|
+
|
||||||
|
+ rpi_cpu_clock_property(cpu->fw, RPI_FIRMWARE_GET_CLOCK_RATE, &rate);
|
||||||
|
+
|
||||||
|
+ return rate;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static long rpi_cpu_round_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
|
+ unsigned long *parent_rate)
|
||||||
|
+{
|
||||||
|
+ return rate;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int rpi_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
|
||||||
|
+ unsigned long parent_rate)
|
||||||
|
+{
|
||||||
|
+ struct rpi_cpu_clkgen *cpu = container_of(hw, struct rpi_cpu_clkgen, hw);
|
||||||
|
+ u32 new_rate = rate;
|
||||||
|
+
|
||||||
|
+ return rpi_cpu_clock_property(cpu->fw, RPI_FIRMWARE_SET_CLOCK_RATE,
|
||||||
|
+ &new_rate);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct clk_ops rpi_cpu_ops = {
|
||||||
|
+ .recalc_rate = rpi_cpu_get_rate,
|
||||||
|
+ .round_rate = rpi_cpu_round_rate,
|
||||||
|
+ .set_rate = rpi_cpu_set_rate,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int rpi_cpu_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct device_node *fw_node;
|
||||||
|
+ struct rpi_cpu_clkgen *cpu;
|
||||||
|
+ struct clk_init_data *init;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ cpu = devm_kzalloc(dev, sizeof(*cpu), GFP_KERNEL);
|
||||||
|
+ if (!cpu)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ init = devm_kzalloc(dev, sizeof(*init), GFP_KERNEL);
|
||||||
|
+ if (!init)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ fw_node = of_find_compatible_node(NULL, NULL,
|
||||||
|
+ "raspberrypi,bcm2835-firmware");
|
||||||
|
+ if (!fw_node) {
|
||||||
|
+ dev_err(dev, "Missing firmware node\n");
|
||||||
|
+ return -ENOENT;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cpu->fw = rpi_firmware_get(fw_node);
|
||||||
|
+ of_node_put(fw_node);
|
||||||
|
+ if (!cpu->fw)
|
||||||
|
+ return -EPROBE_DEFER;
|
||||||
|
+
|
||||||
|
+ init->name = dev->of_node->name;
|
||||||
|
+ init->ops = &rpi_cpu_ops;
|
||||||
|
+
|
||||||
|
+ cpu->hw.init = init;
|
||||||
|
+ ret = devm_clk_hw_register(dev, &cpu->hw);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ return of_clk_add_hw_provider(dev->of_node, of_clk_hw_simple_get,
|
||||||
|
+ &cpu->hw);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id rpi_cpu_of_match[] = {
|
||||||
|
+ { .compatible = "raspberrypi,bcm2835-cpu", },
|
||||||
|
+ {},
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, rpi_cpu_of_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver rpi_cpu_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "raspberrypi-cpu",
|
||||||
|
+ .of_match_table = rpi_cpu_of_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = rpi_cpu_probe,
|
||||||
|
+};
|
||||||
|
+builtin_platform_driver(rpi_cpu_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Stefan Wahren <stefan.wahren@i2se.com>");
|
||||||
|
+MODULE_DESCRIPTION("Raspberry Pi CPU clock driver");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--
|
||||||
|
2.17.0
|
||||||
|
|
||||||
|
From 40a82f71737891581dcbe45331d15a29dd3e7805 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
Date: Mon, 4 Jun 2018 09:14:10 +0100
|
||||||
|
Subject: [PATCH 7/7] add 1.4 ghz OPP for the 3B+
|
||||||
|
|
||||||
|
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts | 7 +++++++
|
||||||
|
1 file changed, 7 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
|
||||||
|
index 4adb85e66be3..aaefb078f391 100644
|
||||||
|
--- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
|
||||||
|
+++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts
|
||||||
|
@@ -106,3 +106,10 @@
|
||||||
|
pinctrl-0 = <&uart1_gpio14>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+&cpu0_opp_table {
|
||||||
|
+ opp@1400000000 {
|
||||||
|
+ opp-hz = /bits/ 64 <1400000000>;
|
||||||
|
+ clock-latency-ns = <355000>;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
--
|
||||||
|
2.17.1
|
||||||
|
|
||||||
|
From d00bd46b40001d3500b8a7207dcfe1d66600e47e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||||
|
Date: Wed, 26 Sep 2018 21:13:22 +0200
|
||||||
|
Subject: [PATCH] ARM: bcm2837: Use CPU0 as cooling device
|
||||||
|
|
||||||
|
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||||
|
---
|
||||||
|
arch/arm/boot/dts/bcm2837.dtsi | 25 +++++++++++++++++++++++++
|
||||||
|
arch/arm/boot/dts/bcm283x.dtsi | 2 +-
|
||||||
|
2 files changed, 26 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/arch/arm/boot/dts/bcm2837.dtsi b/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
index 9cfc553..1590d94 100644
|
||||||
|
--- a/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/bcm2837.dtsi
|
||||||
|
@@ -1,4 +1,5 @@
|
||||||
|
#include "bcm283x.dtsi"
|
||||||
|
+#include <dt-bindings/thermal/thermal.h>
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "brcm,bcm2837";
|
||||||
|
@@ -47,6 +48,7 @@
|
||||||
|
clocks = <&arm_clk>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu1: cpu@1 {
|
||||||
|
@@ -58,6 +60,7 @@
|
||||||
|
clocks = <&arm_clk>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu2: cpu@2 {
|
||||||
|
@@ -69,6 +72,7 @@
|
||||||
|
clocks = <&arm_clk>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
cpu3: cpu@3 {
|
||||||
|
@@ -80,6 +84,7 @@
|
||||||
|
clocks = <&arm_clk>;
|
||||||
|
clock-names = "cpu";
|
||||||
|
operating-points-v2 = <&cpu0_opp_table>;
|
||||||
|
+ #cooling-cells = <2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -117,6 +122,26 @@
|
||||||
|
|
||||||
|
&cpu_thermal {
|
||||||
|
coefficients = <(-538) 412000>;
|
||||||
|
+
|
||||||
|
+ trips {
|
||||||
|
+ cpu_alert0: cpu-alert0 {
|
||||||
|
+ temperature = <70000>;
|
||||||
|
+ hysteresis = <0>;
|
||||||
|
+ type = "passive";
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ cooling-maps {
|
||||||
|
+ map0 {
|
||||||
|
+ trip = <&cpu_alert0>;
|
||||||
|
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ map1 {
|
||||||
|
+ trip = <&cpu_crit>;
|
||||||
|
+ cooling-device = <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
};
|
||||||
|
|
||||||
|
/* enable thermal sensor with the correct compatible property set */
|
||||||
|
diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
|
||||||
|
index 31b2964..2def068 100644
|
||||||
|
--- a/arch/arm/boot/dts/bcm283x.dtsi
|
||||||
|
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||||
|
@@ -38,7 +38,7 @@
|
||||||
|
thermal-sensors = <&thermal>;
|
||||||
|
|
||||||
|
trips {
|
||||||
|
- cpu-crit {
|
||||||
|
+ cpu_crit: cpu-crit {
|
||||||
|
temperature = <80000>;
|
||||||
|
hysteresis = <0>;
|
||||||
|
type = "critical";
|
||||||
|
--
|
||||||
|
2.7.4
|
|
@ -0,0 +1,40 @@
|
||||||
|
From patchwork Tue Oct 9 13:24:46 2018
|
||||||
|
Content-Type: text/plain; charset="utf-8"
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Transfer-Encoding: 7bit
|
||||||
|
Subject: drm/vc4: Set ->is_yuv to false when num_planes == 1
|
||||||
|
From: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||||
|
X-Patchwork-Id: 255528
|
||||||
|
Message-Id: <20181009132446.21960-1-boris.brezillon@bootlin.com>
|
||||||
|
To: David Airlie <airlied@linux.ie>, Daniel Vetter <daniel@ffwll.ch>,
|
||||||
|
dri-devel@lists.freedesktop.org, Eric Anholt <eric@anholt.net>
|
||||||
|
Cc: Boris Brezillon <boris.brezillon@bootlin.com>, stable@vger.kernel.org
|
||||||
|
Date: Tue, 9 Oct 2018 15:24:46 +0200
|
||||||
|
|
||||||
|
When vc4_plane_state is duplicated ->is_yuv is left assigned to its
|
||||||
|
previous value, and we never set it back to false when switching to
|
||||||
|
a non-YUV format.
|
||||||
|
|
||||||
|
Fix that by setting ->is_yuv to false in the 'num_planes == 1' branch
|
||||||
|
of the vc4_plane_setup_clipping_and_scaling() function.
|
||||||
|
|
||||||
|
Fixes: fc04023fafecf ("drm/vc4: Add support for YUV planes.")
|
||||||
|
Cc: <stable@vger.kernel.org>
|
||||||
|
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||||
|
Reviewed-by: Eric Anholt <eric@anholt.net>
|
||||||
|
---
|
||||||
|
drivers/gpu/drm/vc4/vc4_plane.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||||
|
index d04b3c3246ba..60d5ad19cedd 100644
|
||||||
|
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||||
|
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||||
|
@@ -321,6 +321,7 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
|
||||||
|
if (vc4_state->is_unity)
|
||||||
|
vc4_state->x_scaling[0] = VC4_SCALING_PPF;
|
||||||
|
} else {
|
||||||
|
+ vc4_state->is_yuv = false;
|
||||||
|
vc4_state->x_scaling[1] = VC4_SCALING_NONE;
|
||||||
|
vc4_state->y_scaling[1] = VC4_SCALING_NONE;
|
||||||
|
}
|
|
@ -0,0 +1,615 @@
|
||||||
|
From 76202e874f06ab641fbe1caaddd4cfcf7158f174 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
Date: Wed, 10 Oct 2018 13:00:58 +0200
|
||||||
|
Subject: [PATCH 1/5] brcmfmac: Remove firmware-loading code duplication
|
||||||
|
|
||||||
|
brcmf_fw_request_next_item and brcmf_fw_request_done both have identical
|
||||||
|
code to complete the fw-request depending on the item-type.
|
||||||
|
|
||||||
|
This commit adds a new brcmf_fw_complete_request helper removing this code
|
||||||
|
duplication.
|
||||||
|
|
||||||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
---
|
||||||
|
.../broadcom/brcm80211/brcmfmac/firmware.c | 62 +++++++++----------
|
||||||
|
1 file changed, 31 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
index 9095b830ae4d..784c84f0e9e7 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
@@ -504,6 +504,34 @@ static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||||
|
+ struct brcmf_fw *fwctx)
|
||||||
|
+{
|
||||||
|
+ struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path, fw ? "" : "not ");
|
||||||
|
+
|
||||||
|
+ switch (cur->type) {
|
||||||
|
+ case BRCMF_FW_TYPE_NVRAM:
|
||||||
|
+ ret = brcmf_fw_request_nvram_done(fw, fwctx);
|
||||||
|
+ break;
|
||||||
|
+ case BRCMF_FW_TYPE_BINARY:
|
||||||
|
+ if (fw)
|
||||||
|
+ cur->binary = fw;
|
||||||
|
+ else
|
||||||
|
+ ret = -ENOENT;
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ /* something fishy here so bail out early */
|
||||||
|
+ brcmf_err("unknown fw type: %d\n", cur->type);
|
||||||
|
+ release_firmware(fw);
|
||||||
|
+ ret = -EINVAL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
|
||||||
|
{
|
||||||
|
struct brcmf_fw_item *cur;
|
||||||
|
@@ -525,15 +553,7 @@ static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
|
||||||
|
if (ret < 0) {
|
||||||
|
brcmf_fw_request_done(NULL, fwctx);
|
||||||
|
} else if (!async && fw) {
|
||||||
|
- brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path,
|
||||||
|
- fw ? "" : "not ");
|
||||||
|
- if (cur->type == BRCMF_FW_TYPE_BINARY)
|
||||||
|
- cur->binary = fw;
|
||||||
|
- else if (cur->type == BRCMF_FW_TYPE_NVRAM)
|
||||||
|
- brcmf_fw_request_nvram_done(fw, fwctx);
|
||||||
|
- else
|
||||||
|
- release_firmware(fw);
|
||||||
|
-
|
||||||
|
+ brcmf_fw_complete_request(fw, fwctx);
|
||||||
|
return -EAGAIN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
@@ -547,28 +567,8 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
|
||||||
|
cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
|
||||||
|
- brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path,
|
||||||
|
- fw ? "" : "not ");
|
||||||
|
-
|
||||||
|
- if (!fw)
|
||||||
|
- ret = -ENOENT;
|
||||||
|
-
|
||||||
|
- switch (cur->type) {
|
||||||
|
- case BRCMF_FW_TYPE_NVRAM:
|
||||||
|
- ret = brcmf_fw_request_nvram_done(fw, fwctx);
|
||||||
|
- break;
|
||||||
|
- case BRCMF_FW_TYPE_BINARY:
|
||||||
|
- cur->binary = fw;
|
||||||
|
- break;
|
||||||
|
- default:
|
||||||
|
- /* something fishy here so bail out early */
|
||||||
|
- brcmf_err("unknown fw type: %d\n", cur->type);
|
||||||
|
- release_firmware(fw);
|
||||||
|
- ret = -EINVAL;
|
||||||
|
- goto fail;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (ret < 0 && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
|
||||||
|
+ ret = brcmf_fw_complete_request(fw, fwctx);
|
||||||
|
+ if (ret < 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
do {
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
|
From a3c4b522bff976360fb21c9205fcb37a121d4074 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
Date: Wed, 10 Oct 2018 13:00:59 +0200
|
||||||
|
Subject: [PATCH 2/5] brcmfmac: Remove recursion from firmware load error
|
||||||
|
handling
|
||||||
|
|
||||||
|
Before this commit brcmf_fw_request_done would call
|
||||||
|
brcmf_fw_request_next_item to load the next item, which on an error would
|
||||||
|
call brcmf_fw_request_done, which if the error is recoverable (*) will
|
||||||
|
then continue calling brcmf_fw_request_next_item for the next item again
|
||||||
|
which on an error will call brcmf_fw_request_done again...
|
||||||
|
|
||||||
|
This does not blow up because we only have a limited number of items so
|
||||||
|
we never recurse too deep. But the recursion is still quite ugly and
|
||||||
|
frankly is giving me a headache, so lets fix this.
|
||||||
|
|
||||||
|
This commit fixes this by removing brcmf_fw_request_next_item and by
|
||||||
|
making brcmf_fw_get_firmwares and brcmf_fw_request_done directly call
|
||||||
|
firmware_request_nowait resp. firmware_request themselves.
|
||||||
|
|
||||||
|
*) brcmf_fw_request_nvram_done fallback path succeeds or
|
||||||
|
BRCMF_FW_REQF_OPTIONAL is set
|
||||||
|
|
||||||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
---
|
||||||
|
.../broadcom/brcm80211/brcmfmac/firmware.c | 65 ++++++-------------
|
||||||
|
1 file changed, 19 insertions(+), 46 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
index 784c84f0e9e7..08aaf99fee34 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
@@ -532,33 +532,6 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||||
|
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
|
||||||
|
-{
|
||||||
|
- struct brcmf_fw_item *cur;
|
||||||
|
- const struct firmware *fw = NULL;
|
||||||
|
- int ret;
|
||||||
|
-
|
||||||
|
- cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
-
|
||||||
|
- brcmf_dbg(TRACE, "%srequest for %s\n", async ? "async " : "",
|
||||||
|
- cur->path);
|
||||||
|
-
|
||||||
|
- if (async)
|
||||||
|
- ret = request_firmware_nowait(THIS_MODULE, true, cur->path,
|
||||||
|
- fwctx->dev, GFP_KERNEL, fwctx,
|
||||||
|
- brcmf_fw_request_done);
|
||||||
|
- else
|
||||||
|
- ret = request_firmware(&fw, cur->path, fwctx->dev);
|
||||||
|
-
|
||||||
|
- if (ret < 0) {
|
||||||
|
- brcmf_fw_request_done(NULL, fwctx);
|
||||||
|
- } else if (!async && fw) {
|
||||||
|
- brcmf_fw_complete_request(fw, fwctx);
|
||||||
|
- return -EAGAIN;
|
||||||
|
- }
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
{
|
||||||
|
struct brcmf_fw *fwctx = ctx;
|
||||||
|
@@ -568,26 +541,19 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
|
||||||
|
ret = brcmf_fw_complete_request(fw, fwctx);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto fail;
|
||||||
|
-
|
||||||
|
- do {
|
||||||
|
- if (++fwctx->curpos == fwctx->req->n_items) {
|
||||||
|
- ret = 0;
|
||||||
|
- goto done;
|
||||||
|
- }
|
||||||
|
|
||||||
|
- ret = brcmf_fw_request_next_item(fwctx, false);
|
||||||
|
- } while (ret == -EAGAIN);
|
||||||
|
-
|
||||||
|
- return;
|
||||||
|
+ while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
|
||||||
|
+ cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
+ request_firmware(&fw, cur->path, fwctx->dev);
|
||||||
|
+ ret = brcmf_fw_complete_request(fw, ctx);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
-fail:
|
||||||
|
- brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
|
||||||
|
- dev_name(fwctx->dev), cur->path);
|
||||||
|
- brcmf_fw_free_request(fwctx->req);
|
||||||
|
- fwctx->req = NULL;
|
||||||
|
-done:
|
||||||
|
+ if (ret) {
|
||||||
|
+ brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
|
||||||
|
+ dev_name(fwctx->dev), cur->path);
|
||||||
|
+ brcmf_fw_free_request(fwctx->req);
|
||||||
|
+ fwctx->req = NULL;
|
||||||
|
+ }
|
||||||
|
fwctx->done(fwctx->dev, ret, fwctx->req);
|
||||||
|
kfree(fwctx);
|
||||||
|
}
|
||||||
|
@@ -611,7 +577,9 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||||
|
void (*fw_cb)(struct device *dev, int err,
|
||||||
|
struct brcmf_fw_request *req))
|
||||||
|
{
|
||||||
|
+ struct brcmf_fw_item *first = &req->items[0];
|
||||||
|
struct brcmf_fw *fwctx;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||||
|
if (!fw_cb)
|
||||||
|
@@ -628,7 +596,12 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||||
|
fwctx->req = req;
|
||||||
|
fwctx->done = fw_cb;
|
||||||
|
|
||||||
|
- brcmf_fw_request_next_item(fwctx, true);
|
||||||
|
+ ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||||
|
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||||
|
+ brcmf_fw_request_done);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ brcmf_fw_request_done(NULL, fwctx);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
|
From c2c41d3f837ed492369607940af950ef554b8685 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
Date: Wed, 10 Oct 2018 13:01:00 +0200
|
||||||
|
Subject: [PATCH 3/5] brcmfmac: Add support for first trying to get a board
|
||||||
|
specific nvram file
|
||||||
|
|
||||||
|
The nvram files which some brcmfmac chips need are board-specific. To be
|
||||||
|
able to distribute these as part of linux-firmware, so that devices with
|
||||||
|
such a wifi chip will work OOTB, multiple (one per board) versions must
|
||||||
|
co-exist under /lib/firmware.
|
||||||
|
|
||||||
|
This commit adds support for callers of the brcmfmac/firmware.c code to
|
||||||
|
pass in a board_type parameter through the request structure.
|
||||||
|
|
||||||
|
If that parameter is set then the code will first try to load
|
||||||
|
chipmodel.board_type.txt before falling back to the old chipmodel.txt name.
|
||||||
|
|
||||||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
---
|
||||||
|
.../broadcom/brcm80211/brcmfmac/firmware.c | 27 ++++++++++++++++++-
|
||||||
|
.../broadcom/brcm80211/brcmfmac/firmware.h | 1 +
|
||||||
|
2 files changed, 27 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
index 08aaf99fee34..6755b2388fbc 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
@@ -532,6 +532,31 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||||
|
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||||
|
+ struct brcmf_fw *fwctx)
|
||||||
|
+{
|
||||||
|
+ struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ /* nvram files are board-specific, first try a board-specific path */
|
||||||
|
+ if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
|
||||||
|
+ char alt_path[BRCMF_FW_NAME_LEN];
|
||||||
|
+
|
||||||
|
+ strlcpy(alt_path, cur->path, BRCMF_FW_NAME_LEN);
|
||||||
|
+ /* strip .txt at the end */
|
||||||
|
+ alt_path[strlen(alt_path) - 4] = 0;
|
||||||
|
+ strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||||
|
+ strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
|
||||||
|
+ strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
|
||||||
|
+
|
||||||
|
+ ret = request_firmware(fw, alt_path, fwctx->dev);
|
||||||
|
+ if (ret == 0)
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return request_firmware(fw, cur->path, fwctx->dev);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
{
|
||||||
|
struct brcmf_fw *fwctx = ctx;
|
||||||
|
@@ -544,7 +569,7 @@ static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
|
||||||
|
while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
|
||||||
|
cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
- request_firmware(&fw, cur->path, fwctx->dev);
|
||||||
|
+ brcmf_fw_request_firmware(&fw, fwctx);
|
||||||
|
ret = brcmf_fw_complete_request(fw, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||||
|
index 2893e56910f0..a0834be8864e 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
|
||||||
|
@@ -70,6 +70,7 @@ struct brcmf_fw_request {
|
||||||
|
u16 domain_nr;
|
||||||
|
u16 bus_nr;
|
||||||
|
u32 n_items;
|
||||||
|
+ const char *board_type;
|
||||||
|
struct brcmf_fw_item items[0];
|
||||||
|
};
|
||||||
|
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
|
From 282477a8e4034ee2ea906d2eb234ce9c86f5685f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
Date: Sat, 17 Nov 2018 15:18:35 +0000
|
||||||
|
Subject: [PATCH 4/5] brcmfmac: Set board_type used for nvram file selection to
|
||||||
|
machine-compatible
|
||||||
|
|
||||||
|
For of/devicetree using machines, set the board_type used for nvram file
|
||||||
|
selection to the first string listed in the top-level's node compatible
|
||||||
|
string, aka the machine-compatible as used by of_machine_is_compatible().
|
||||||
|
|
||||||
|
The board_type setting is used to load the board-specific nvram file with
|
||||||
|
a board-specific name so that we can ship files for each supported board
|
||||||
|
in linux-firmware.
|
||||||
|
|
||||||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
Signed-off-by: Peter Robinson <pbrobinson@gmail.com>
|
||||||
|
---
|
||||||
|
.../broadcom/brcm80211/brcmfmac/Makefile | 2 +
|
||||||
|
.../broadcom/brcm80211/brcmfmac/common.c | 3 +-
|
||||||
|
.../broadcom/brcm80211/brcmfmac/common.h | 8 ++
|
||||||
|
.../broadcom/brcm80211/brcmfmac/dmi.c | 116 ++++++++++++++++++
|
||||||
|
.../wireless/broadcom/brcm80211/brcmfmac/of.c | 11 +-
|
||||||
|
.../broadcom/brcm80211/brcmfmac/pcie.c | 1 +
|
||||||
|
.../broadcom/brcm80211/brcmfmac/sdio.c | 1 +
|
||||||
|
7 files changed, 140 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||||
|
index 1f5a9b948abf..22fd95a736a8 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile
|
||||||
|
@@ -54,3 +54,5 @@ brcmfmac-$(CONFIG_BRCM_TRACING) += \
|
||||||
|
tracepoint.o
|
||||||
|
brcmfmac-$(CONFIG_OF) += \
|
||||||
|
of.o
|
||||||
|
+brcmfmac-$(CONFIG_DMI) += \
|
||||||
|
+ dmi.o
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||||
|
index cd3651069d0c..b93b1e797333 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
|
||||||
|
@@ -450,7 +450,8 @@ struct brcmf_mp_device *brcmf_get_module_param(struct device *dev,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
- /* No platform data for this device, try OF (Open Firwmare) */
|
||||||
|
+ /* No platform data for this device, try OF and DMI data */
|
||||||
|
+ brcmf_dmi_probe(settings, chip, chiprev);
|
||||||
|
brcmf_of_probe(dev, bus_type, settings);
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||||
|
index a34642cb4d2f..4ce56be90b74 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
|
||||||
|
@@ -59,6 +59,7 @@ struct brcmf_mp_device {
|
||||||
|
bool iapp;
|
||||||
|
bool ignore_probe_fail;
|
||||||
|
struct brcmfmac_pd_cc *country_codes;
|
||||||
|
+ const char *board_type;
|
||||||
|
union {
|
||||||
|
struct brcmfmac_sdio_pd sdio;
|
||||||
|
} bus;
|
||||||
|
@@ -74,4 +75,11 @@ void brcmf_release_module_param(struct brcmf_mp_device *module_param);
|
||||||
|
/* Sets dongle media info (drv_version, mac address). */
|
||||||
|
int brcmf_c_preinit_dcmds(struct brcmf_if *ifp);
|
||||||
|
|
||||||
|
+#ifdef CONFIG_DMI
|
||||||
|
+void brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev);
|
||||||
|
+#else
|
||||||
|
+static inline void
|
||||||
|
+brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev) {}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#endif /* BRCMFMAC_COMMON_H */
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..51d76ac45075
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c
|
||||||
|
@@ -0,0 +1,116 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright 2018 Hans de Goede <hdegoede@redhat.com>
|
||||||
|
+ *
|
||||||
|
+ * Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
+ * purpose with or without fee is hereby granted, provided that the above
|
||||||
|
+ * copyright notice and this permission notice appear in all copies.
|
||||||
|
+ *
|
||||||
|
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||||
|
+ * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||||
|
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||||
|
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/dmi.h>
|
||||||
|
+#include <linux/mod_devicetable.h>
|
||||||
|
+#include "core.h"
|
||||||
|
+#include "common.h"
|
||||||
|
+#include "brcm_hw_ids.h"
|
||||||
|
+
|
||||||
|
+/* The DMI data never changes so we can use a static buf for this */
|
||||||
|
+static char dmi_board_type[128];
|
||||||
|
+
|
||||||
|
+struct brcmf_dmi_data {
|
||||||
|
+ u32 chip;
|
||||||
|
+ u32 chiprev;
|
||||||
|
+ const char *board_type;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/* NOTE: Please keep all entries sorted alphabetically */
|
||||||
|
+
|
||||||
|
+static const struct brcmf_dmi_data gpd_win_pocket_data = {
|
||||||
|
+ BRCM_CC_4356_CHIP_ID, 2, "gpd-win-pocket"
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct brcmf_dmi_data jumper_ezpad_mini3_data = {
|
||||||
|
+ BRCM_CC_43430_CHIP_ID, 0, "jumper-ezpad-mini3"
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct brcmf_dmi_data meegopad_t08_data = {
|
||||||
|
+ BRCM_CC_43340_CHIP_ID, 2, "meegopad-t08"
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct dmi_system_id dmi_platform_data[] = {
|
||||||
|
+ {
|
||||||
|
+ /* Match for the GPDwin which unfortunately uses somewhat
|
||||||
|
+ * generic dmi strings, which is why we test for 4 strings.
|
||||||
|
+ * Comparing against 23 other byt/cht boards, board_vendor
|
||||||
|
+ * and board_name are unique to the GPDwin, where as only one
|
||||||
|
+ * other board has the same board_serial and 3 others have
|
||||||
|
+ * the same default product_name. Also the GPDwin is the
|
||||||
|
+ * only device to have both board_ and product_name not set.
|
||||||
|
+ */
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||||
|
+ DMI_MATCH(DMI_BOARD_NAME, "Default string"),
|
||||||
|
+ DMI_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
||||||
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
||||||
|
+ },
|
||||||
|
+ .driver_data = (void *)&gpd_win_pocket_data,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ /* Jumper EZpad mini3 */
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
|
||||||
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"),
|
||||||
|
+ /* jumperx.T87.KFBNEEA02 with the version-nr dropped */
|
||||||
|
+ DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"),
|
||||||
|
+ },
|
||||||
|
+ .driver_data = (void *)&jumper_ezpad_mini3_data,
|
||||||
|
+ },
|
||||||
|
+ {
|
||||||
|
+ /* Meegopad T08 */
|
||||||
|
+ .matches = {
|
||||||
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Default string"),
|
||||||
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
||||||
|
+ DMI_MATCH(DMI_BOARD_NAME, "T3 MRD"),
|
||||||
|
+ DMI_MATCH(DMI_BOARD_VERSION, "V1.1"),
|
||||||
|
+ },
|
||||||
|
+ .driver_data = (void *)&meegopad_t08_data,
|
||||||
|
+ },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+void brcmf_dmi_probe(struct brcmf_mp_device *settings, u32 chip, u32 chiprev)
|
||||||
|
+{
|
||||||
|
+ const struct dmi_system_id *match;
|
||||||
|
+ const struct brcmf_dmi_data *data;
|
||||||
|
+ const char *sys_vendor;
|
||||||
|
+ const char *product_name;
|
||||||
|
+
|
||||||
|
+ /* Some models have DMI strings which are too generic, e.g.
|
||||||
|
+ * "Default string", we use a quirk table for these.
|
||||||
|
+ */
|
||||||
|
+ for (match = dmi_first_match(dmi_platform_data);
|
||||||
|
+ match;
|
||||||
|
+ match = dmi_first_match(match + 1)) {
|
||||||
|
+ data = match->driver_data;
|
||||||
|
+
|
||||||
|
+ if (data->chip == chip && data->chiprev == chiprev) {
|
||||||
|
+ settings->board_type = data->board_type;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Not found in the quirk-table, use sys_vendor-product_name */
|
||||||
|
+ sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
|
||||||
|
+ product_name = dmi_get_system_info(DMI_PRODUCT_NAME);
|
||||||
|
+ if (sys_vendor && product_name) {
|
||||||
|
+ snprintf(dmi_board_type, sizeof(dmi_board_type), "%s-%s",
|
||||||
|
+ sys_vendor, product_name);
|
||||||
|
+ settings->board_type = dmi_board_type;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||||
|
index aee6e5937c41..84e3373289eb 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/of.c
|
||||||
|
@@ -27,11 +27,20 @@ void brcmf_of_probe(struct device *dev, enum brcmf_bus_type bus_type,
|
||||||
|
struct brcmf_mp_device *settings)
|
||||||
|
{
|
||||||
|
struct brcmfmac_sdio_pd *sdio = &settings->bus.sdio;
|
||||||
|
- struct device_node *np = dev->of_node;
|
||||||
|
+ struct device_node *root, *np = dev->of_node;
|
||||||
|
+ struct property *prop;
|
||||||
|
int irq;
|
||||||
|
u32 irqf;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
+ /* Set board-type to the first string of the machine compatible prop */
|
||||||
|
+ root = of_find_node_by_path("/");
|
||||||
|
+ if (root) {
|
||||||
|
+ prop = of_find_property(root, "compatible", NULL);
|
||||||
|
+ settings->board_type = of_prop_next_string(prop, NULL);
|
||||||
|
+ of_node_put(root);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!np || bus_type != BRCMF_BUSTYPE_SDIO ||
|
||||||
|
!of_device_is_compatible(np, "brcm,bcm4329-fmac"))
|
||||||
|
return;
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||||
|
index 4fffa6988087..b12f3e0ee69c 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
|
||||||
|
@@ -1785,6 +1785,7 @@ brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
|
||||||
|
fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||||
|
fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||||
|
fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
|
||||||
|
+ fwreq->board_type = devinfo->settings->board_type;
|
||||||
|
/* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
|
||||||
|
fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
|
||||||
|
fwreq->bus_nr = devinfo->pdev->bus->number;
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||||
|
index a907d7b065fa..3dbbbb117563 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
|
||||||
|
@@ -4177,6 +4177,7 @@ brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
|
||||||
|
|
||||||
|
fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
|
||||||
|
fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
|
||||||
|
+ fwreq->board_type = bus->sdiodev->settings->board_type;
|
||||||
|
|
||||||
|
return fwreq;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
||||||
|
From 6351ca678eb1391129cf5afccab518f376d57596 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
Date: Wed, 10 Oct 2018 13:01:03 +0200
|
||||||
|
Subject: [PATCH 5/5] brcmfmac: Cleanup brcmf_fw_request_done()
|
||||||
|
|
||||||
|
The "cur" variable is now only used for a debug print and we already
|
||||||
|
print the same info from brcmf_fw_complete_request(), so the debug print
|
||||||
|
does not provide any extra info and we can remove it.
|
||||||
|
|
||||||
|
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
---
|
||||||
|
.../net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 8 +-------
|
||||||
|
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
index 6755b2388fbc..b38c4b40b235 100644
|
||||||
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||||
|
@@ -560,22 +560,16 @@ static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||||
|
static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
|
||||||
|
{
|
||||||
|
struct brcmf_fw *fwctx = ctx;
|
||||||
|
- struct brcmf_fw_item *cur;
|
||||||
|
- int ret = 0;
|
||||||
|
-
|
||||||
|
- cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
ret = brcmf_fw_complete_request(fw, fwctx);
|
||||||
|
|
||||||
|
while (ret == 0 && ++fwctx->curpos < fwctx->req->n_items) {
|
||||||
|
- cur = &fwctx->req->items[fwctx->curpos];
|
||||||
|
brcmf_fw_request_firmware(&fw, fwctx);
|
||||||
|
ret = brcmf_fw_complete_request(fw, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
- brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
|
||||||
|
- dev_name(fwctx->dev), cur->path);
|
||||||
|
brcmf_fw_free_request(fwctx->req);
|
||||||
|
fwctx->req = NULL;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.19.1
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
configs/build_configs.sh
|
149
check-kabi
149
check-kabi
|
@ -1,149 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
#
|
|
||||||
# check-kabi - Red Hat kABI reference checking tool
|
|
||||||
#
|
|
||||||
# We use this script to check against reference Module.kabi files.
|
|
||||||
#
|
|
||||||
# Author: Jon Masters <jcm@redhat.com>
|
|
||||||
# Copyright (C) 2007-2009 Red Hat, Inc.
|
|
||||||
#
|
|
||||||
# This software may be freely redistributed under the terms of the GNU
|
|
||||||
# General Public License (GPL).
|
|
||||||
|
|
||||||
# Changelog:
|
|
||||||
#
|
|
||||||
# 2018/06/01 - Update for python3 by Petr Oros.
|
|
||||||
# 2009/08/15 - Updated for use in RHEL6.
|
|
||||||
# 2007/06/13 - Initial rewrite in python by Jon Masters.
|
|
||||||
|
|
||||||
__author__ = "Jon Masters <jcm@redhat.com>"
|
|
||||||
__version__ = "2.0"
|
|
||||||
__date__ = "2009/08/15"
|
|
||||||
__copyright__ = "Copyright (C) 2007-2009 Red Hat, Inc"
|
|
||||||
__license__ = "GPL"
|
|
||||||
|
|
||||||
import getopt
|
|
||||||
import string
|
|
||||||
import sys
|
|
||||||
|
|
||||||
true = 1
|
|
||||||
false = 0
|
|
||||||
|
|
||||||
|
|
||||||
def load_symvers(symvers, filename):
|
|
||||||
"""Load a Module.symvers file."""
|
|
||||||
|
|
||||||
symvers_file = open(filename, "r")
|
|
||||||
|
|
||||||
while true:
|
|
||||||
in_line = symvers_file.readline()
|
|
||||||
if in_line == "":
|
|
||||||
break
|
|
||||||
if in_line == "\n":
|
|
||||||
continue
|
|
||||||
checksum, symbol, directory, type = in_line.split()
|
|
||||||
|
|
||||||
symvers[symbol] = in_line[0:-1]
|
|
||||||
|
|
||||||
|
|
||||||
def load_kabi(kabi, filename):
|
|
||||||
"""Load a Module.kabi file."""
|
|
||||||
|
|
||||||
kabi_file = open(filename, "r")
|
|
||||||
|
|
||||||
while true:
|
|
||||||
in_line = kabi_file.readline()
|
|
||||||
if in_line == "":
|
|
||||||
break
|
|
||||||
if in_line == "\n":
|
|
||||||
continue
|
|
||||||
checksum, symbol, directory, type = in_line.split()
|
|
||||||
|
|
||||||
kabi[symbol] = in_line[0:-1]
|
|
||||||
|
|
||||||
|
|
||||||
def check_kabi(symvers, kabi):
|
|
||||||
"""Check Module.kabi and Module.symvers files."""
|
|
||||||
|
|
||||||
fail = 0
|
|
||||||
warn = 0
|
|
||||||
changed_symbols = []
|
|
||||||
moved_symbols = []
|
|
||||||
|
|
||||||
for symbol in kabi:
|
|
||||||
abi_hash, abi_sym, abi_dir, abi_type = kabi[symbol].split()
|
|
||||||
if symbol in symvers:
|
|
||||||
sym_hash, sym_sym, sym_dir, sym_type = symvers[symbol].split()
|
|
||||||
if abi_hash != sym_hash:
|
|
||||||
fail = 1
|
|
||||||
changed_symbols.append(symbol)
|
|
||||||
|
|
||||||
if abi_dir != sym_dir:
|
|
||||||
warn = 1
|
|
||||||
moved_symbols.append(symbol)
|
|
||||||
else:
|
|
||||||
fail = 1
|
|
||||||
changed_symbols.append(symbol)
|
|
||||||
|
|
||||||
if fail:
|
|
||||||
print("*** ERROR - ABI BREAKAGE WAS DETECTED ***")
|
|
||||||
print("")
|
|
||||||
print("The following symbols have been changed (this will cause an ABI breakage):")
|
|
||||||
print("")
|
|
||||||
for symbol in changed_symbols:
|
|
||||||
print(symbol)
|
|
||||||
print("")
|
|
||||||
|
|
||||||
if warn:
|
|
||||||
print("*** WARNING - ABI SYMBOLS MOVED ***")
|
|
||||||
print("")
|
|
||||||
print("The following symbols moved (typically caused by moving a symbol from being")
|
|
||||||
print("provided by the kernel vmlinux out to a loadable module):")
|
|
||||||
print("")
|
|
||||||
for symbol in moved_symbols:
|
|
||||||
print(symbol)
|
|
||||||
print("")
|
|
||||||
|
|
||||||
"""Halt the build, if we got errors and/or warnings. In either case,
|
|
||||||
double-checkig is required to avoid introducing / concealing
|
|
||||||
KABI inconsistencies."""
|
|
||||||
if fail or warn:
|
|
||||||
sys.exit(1)
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
|
|
||||||
def usage():
|
|
||||||
print("""
|
|
||||||
check-kabi: check Module.kabi and Module.symvers files.
|
|
||||||
|
|
||||||
check-kabi [ -k Module.kabi ] [ -s Module.symvers ]
|
|
||||||
|
|
||||||
""")
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
|
|
||||||
symvers_file = ""
|
|
||||||
kabi_file = ""
|
|
||||||
|
|
||||||
opts, args = getopt.getopt(sys.argv[1:], 'hk:s:')
|
|
||||||
|
|
||||||
for o, v in opts:
|
|
||||||
if o == "-s":
|
|
||||||
symvers_file = v
|
|
||||||
if o == "-h":
|
|
||||||
usage()
|
|
||||||
sys.exit(0)
|
|
||||||
if o == "-k":
|
|
||||||
kabi_file = v
|
|
||||||
|
|
||||||
if (symvers_file == "") or (kabi_file == ""):
|
|
||||||
usage()
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
symvers = {}
|
|
||||||
kabi = {}
|
|
||||||
|
|
||||||
load_symvers(symvers, symvers_file)
|
|
||||||
load_kabi(kabi, kabi_file)
|
|
||||||
check_kabi(symvers, kabi)
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/awk -f
|
||||||
|
|
||||||
|
/is not set/ {
|
||||||
|
split ($0, a, "#");
|
||||||
|
split(a[2], b);
|
||||||
|
if (NR==FNR) {
|
||||||
|
configs[b[1]]="is not set";
|
||||||
|
} else {
|
||||||
|
if (configs[b[1]] != "" && configs[b[1]] != "is not set")
|
||||||
|
print "Found # "b[1] " is not set, after generation, had " b[1] " " configs[b[1]] " in Fedora tree";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/=/ {
|
||||||
|
split ($0, a, "=");
|
||||||
|
if (NR==FNR) {
|
||||||
|
configs[a[1]]=a[2];
|
||||||
|
} else {
|
||||||
|
if (configs[a[1]] != "" && configs[a[1]] != a[2])
|
||||||
|
print "Found "a[1]"="configs[a[1]]" after generation, had " a[1]"="a[2]" in Fedora tree";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,201 @@
|
||||||
|
# https://github.com/riscv/riscv-qemu/commit/039dbd521277bc0aab672203a1a199e4519094da
|
||||||
|
CONFIG_SERIAL_8250=y
|
||||||
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
|
|
||||||
|
# https://github.com/riscv/riscv-qemu/commit/3446cee04256753a29c45b033d643fcdea24fc72
|
||||||
|
CONFIG_RISCV_PLIC=y
|
||||||
|
CONFIG_HVC_RISCV_SBI=y
|
||||||
|
CONFIG_VIRTIO=y
|
||||||
|
CONFIG_VIRTIO_MMIO=y
|
||||||
|
CONFIG_VIRTIO_PCI=y
|
||||||
|
CONFIG_VIRTIO_BLK=y
|
||||||
|
CONFIG_VIRTIO_NET=y
|
||||||
|
CONFIG_VIRTIO_CONSOLE=y
|
||||||
|
CONFIG_SCSI_VIRTIO=y
|
||||||
|
CONFIG_DRM_VIRTIO_GPU=y
|
||||||
|
|
||||||
|
# Loopback lets us build the stage4 disk.
|
||||||
|
CONFIG_BLK_DEV=y
|
||||||
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
|
||||||
|
# The stage4 root filesystem is ext4.
|
||||||
|
CONFIG_EXT4_FS=y
|
||||||
|
|
||||||
|
# Needed to avoid cap_set_file errors when installing RPMs.
|
||||||
|
CONFIG_EXT4_FS_SECURITY=y
|
||||||
|
|
||||||
|
CONFIG_FILE_LOCKING=y
|
||||||
|
CONFIG_NET_CORE=y
|
||||||
|
CONFIG_NETDEVICES=y
|
||||||
|
|
||||||
|
# iptables supported, needed for mock.
|
||||||
|
CONFIG_NETFILTER=y
|
||||||
|
CONFIG_NETFILTER_ADVANCED=y
|
||||||
|
CONFIG_NETFILTER_XTABLES=y
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_STATE=y
|
||||||
|
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
|
||||||
|
CONFIG_NF_IPTABLES=y
|
||||||
|
CONFIG_NF_NAT=y
|
||||||
|
CONFIG_NF_NAT_IPV4=y
|
||||||
|
CONFIG_NF_NAT_IPV6=y
|
||||||
|
CONFIG_NF_CONNTRACK=y
|
||||||
|
CONFIG_NF_CONNTRACK_IPV4=y
|
||||||
|
CONFIG_NF_CONNTRACK_IPV6=y
|
||||||
|
CONFIG_NF_SOCKET_IPV4=y
|
||||||
|
CONFIG_NF_SOCKET_IPV6=y
|
||||||
|
CONFIG_IP_NF_NAT=y
|
||||||
|
CONFIG_IP_NF_FILTER=y
|
||||||
|
CONFIG_IP_NF_IPTABLES=y
|
||||||
|
CONFIG_IP_NF_TARGET_REJECT=y
|
||||||
|
CONFIG_IP_NF_RAW=y
|
||||||
|
CONFIG_IP6_NF_NAT=y
|
||||||
|
CONFIG_IP6_NF_FILTER=y
|
||||||
|
CONFIG_IP6_NF_IPTABLES=y
|
||||||
|
CONFIG_IP6_NF_TARGET_REJECT=y
|
||||||
|
CONFIG_IP6_NF_RAW=y
|
||||||
|
|
||||||
|
# For systemd:
|
||||||
|
# https://cgit.freedesktop.org/systemd/systemd/tree/README
|
||||||
|
CONFIG_TMPFS=y
|
||||||
|
CONFIG_TMPFS_XATTR=y
|
||||||
|
CONFIG_SYSFS=y
|
||||||
|
CONFIG_DEVTMPFS=y
|
||||||
|
CONFIG_CGROUPS=y
|
||||||
|
CONFIG_INOTIFY_USER=y
|
||||||
|
CONFIG_SIGNALFD=y
|
||||||
|
CONFIG_TIMERFD=y
|
||||||
|
CONFIG_EPOLL=y
|
||||||
|
CONFIG_NET=y
|
||||||
|
CONFIG_PROC_FS=y
|
||||||
|
CONFIG_FHANDLE=y
|
||||||
|
CONFIG_SYSFS_DEPRECATED=n
|
||||||
|
CONFIG_UEVENT_HELPER_PATH=""
|
||||||
|
CONFIG_FW_LOADER_USER_HELPER=n
|
||||||
|
CONFIG_DMIID=y
|
||||||
|
CONFIG_BLK_DEV_BSG=y
|
||||||
|
CONFIG_NET_NS=y
|
||||||
|
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
|
||||||
|
CONFIG_AUTOFS4_FS=y
|
||||||
|
CONFIG_TMPFS_XATTR=y
|
||||||
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
|
CONFIG_EXT4_POSIX_ACL=y
|
||||||
|
CONFIG_XFS_POSIX_ACL=y
|
||||||
|
CONFIG_BTRFS_FS_POSIX_ACL=y
|
||||||
|
CONFIG_SECCOMP=y
|
||||||
|
CONFIG_SECCOMP_FILTER=y
|
||||||
|
CONFIG_CHECKPOINT_RESTORE=y
|
||||||
|
CONFIG_CGROUP_SCHED=y
|
||||||
|
CONFIG_FAIR_GROUP_SCHED=y
|
||||||
|
CONFIG_CFS_BANDWIDTH=y
|
||||||
|
CONFIG_EFIVAR_FS=y
|
||||||
|
CONFIG_EFI_PARTITION=y
|
||||||
|
CONFIG_RT_GROUP_SCHED=n
|
||||||
|
CONFIG_AUDIT=n
|
||||||
|
|
||||||
|
# Networking:
|
||||||
|
CONFIG_NET=y
|
||||||
|
CONFIG_PACKET=y
|
||||||
|
CONFIG_UNIX=y
|
||||||
|
CONFIG_INET=y
|
||||||
|
CONFIG_BRIDGE=y
|
||||||
|
CONFIG_IPV6=y
|
||||||
|
|
||||||
|
# NFS client.
|
||||||
|
CONFIG_NFS_FS=y
|
||||||
|
CONFIG_NFS_V3=y
|
||||||
|
CONFIG_NFS_V3_ACL=y
|
||||||
|
CONFIG_NFS_V4=y
|
||||||
|
CONFIG_NFS_V4_1=y
|
||||||
|
CONFIG_NFS_V4_2=y
|
||||||
|
CONFIG_NFS_FSCACHE=y
|
||||||
|
CONFIG_ROOT_NFS=y
|
||||||
|
|
||||||
|
# SysV IPC needed by GnuPG.
|
||||||
|
CONFIG_SYSVIPC=y
|
||||||
|
CONFIG_SYSVIPC_SYSCTL=y
|
||||||
|
|
||||||
|
# Add XFS for running xfstests (to test libaio).
|
||||||
|
CONFIG_XFS_FS=y
|
||||||
|
CONFIG_XFS_QUOTA=y
|
||||||
|
CONFIG_XFS_POSIX_ACL=y
|
||||||
|
|
||||||
|
# For mock, avoids:
|
||||||
|
# WARNING: tcmsg: [Errno 2] No such file or directory: '/proc/net/psched'
|
||||||
|
# WARNING: the tc subsystem functionality is limited
|
||||||
|
CONFIG_NET_SCHED=y
|
||||||
|
|
||||||
|
# For NBD booting.
|
||||||
|
CONFIG_BLK_DEV_NBD=y
|
||||||
|
|
||||||
|
# Debugging.
|
||||||
|
CONFIG_STACKTRACE=y
|
||||||
|
|
||||||
|
# Device mapper support.
|
||||||
|
CONFIG_MD=y
|
||||||
|
CONFIG_MD_AUTODETECT=y
|
||||||
|
CONFIG_BLK_DEV_DM=y
|
||||||
|
CONFIG_BLK_DEV_DM_BUILTIN=y
|
||||||
|
|
||||||
|
CONFIG_DM_DEBUG=y
|
||||||
|
CONFIG_DM_BUFIO=y
|
||||||
|
CONFIG_DM_DEBUG_BLOCK_MANAGER_LOCKING=y
|
||||||
|
CONFIG_DM_BIO_PRISON=y
|
||||||
|
CONFIG_DM_PERSISTENT_DATA=y
|
||||||
|
CONFIG_DM_UNSTRIPED=y
|
||||||
|
CONFIG_DM_CRYPT=y
|
||||||
|
CONFIG_DM_SNAPSHOT=y
|
||||||
|
CONFIG_DM_THIN_PROVISIONING=y
|
||||||
|
CONFIG_DM_CACHE=y
|
||||||
|
CONFIG_DM_CACHE_SMQ=y
|
||||||
|
CONFIG_DM_MIRROR=y
|
||||||
|
CONFIG_DM_LOG_USERSPACE=y
|
||||||
|
CONFIG_DM_RAID=y
|
||||||
|
CONFIG_DM_ZERO=y
|
||||||
|
CONFIG_DM_MULTIPATH=y
|
||||||
|
CONFIG_DM_MULTIPATH_QL=y
|
||||||
|
CONFIG_DM_MULTIPATH_ST=y
|
||||||
|
CONFIG_DM_DELAY=y
|
||||||
|
CONFIG_DM_UEVENT=y
|
||||||
|
CONFIG_DM_FLAKEY=y
|
||||||
|
CONFIG_DM_VERITY=y
|
||||||
|
CONFIG_DM_VERITY_FEC=y
|
||||||
|
CONFIG_DM_SWITCH=y
|
||||||
|
CONFIG_DM_LOG_WRITES=y
|
||||||
|
CONFIG_DM_INTEGRITY=y
|
||||||
|
CONFIG_DM_ZONED=y
|
||||||
|
|
||||||
|
# Magic SysRQ key.
|
||||||
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
|
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x0
|
||||||
|
CONFIG_MAGIC_SYSRQ_SERIAL=y
|
||||||
|
|
||||||
|
# Crypto user API.
|
||||||
|
CONFIG_CRYPTO_USER=y
|
||||||
|
CONFIG_CRYPTO_USER_API=y
|
||||||
|
CONFIG_CRYPTO_USER_API_HASH=y
|
||||||
|
CONFIG_CRYPTO_USER_API_SKCIPHER=y
|
||||||
|
CONFIG_CRYPTO_USER_API_RNG=y
|
||||||
|
CONFIG_CRYPTO_USER_API_AEAD=y
|
||||||
|
|
||||||
|
# Enable remaining PCIe features (NB: some of these are specific to
|
||||||
|
# the microsemi PCIe hardware and not used by qemu).
|
||||||
|
CONFIG_HOTPLUG_PCI_PCIE=y
|
||||||
|
CONFIG_HOTPLUG_PCI=y
|
||||||
|
CONFIG_MEDIA_PCI_SUPPORT=y
|
||||||
|
CONFIG_PCI_ATS=y
|
||||||
|
CONFIG_PCI_DEBUG=y
|
||||||
|
CONFIG_PCIEAER=y
|
||||||
|
CONFIG_PCIEASPM_DEFAULT=y
|
||||||
|
CONFIG_PCIEASPM=y
|
||||||
|
CONFIG_PCI_ECAM=y
|
||||||
|
CONFIG_PCIE_MICROSEMI=y
|
||||||
|
CONFIG_PCI_ENDPOINT=y
|
||||||
|
CONFIG_PCIEPORTBUS=y
|
||||||
|
CONFIG_PCI_HOST_COMMON=y
|
||||||
|
CONFIG_PCI_HOST_GENERIC=y
|
||||||
|
CONFIG_PCI_IOV=y
|
||||||
|
CONFIG_PCI_PASID=y
|
||||||
|
CONFIG_PCI_PRI=y
|
||||||
|
CONFIG_PCI_SW_SWITCHTEC=y
|
||||||
|
CONFIG_USB_BDC_PCI=y
|
|
@ -0,0 +1 @@
|
||||||
|
configs/config_generation
|
|
@ -0,0 +1,139 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# This script merges together the hierarchy of CONFIG_* files under generic
|
||||||
|
# and debug to form the necessary $PACKAGE_NAME<version>-<arch>-<variant>.config
|
||||||
|
# files for building RHEL kernels, based on the contents of a control file
|
||||||
|
|
||||||
|
PACKAGE_NAME="${1:-kernel}" # defines the package name used
|
||||||
|
KVERREL="${2:-}"
|
||||||
|
SUBARCH="${3:-}" # defines a specific arch
|
||||||
|
SCRIPT="$(readlink -f $0)"
|
||||||
|
OUTPUT_DIR="$PWD"
|
||||||
|
SCRIPT_DIR="$(dirname $SCRIPT)"
|
||||||
|
|
||||||
|
LANG=en_US.UTF-8
|
||||||
|
|
||||||
|
# to handle this script being a symlink
|
||||||
|
cd $SCRIPT_DIR
|
||||||
|
|
||||||
|
set errexit
|
||||||
|
set nounset
|
||||||
|
|
||||||
|
control_file="config_generation"
|
||||||
|
|
||||||
|
cleanup()
|
||||||
|
{
|
||||||
|
rm -f config-*
|
||||||
|
}
|
||||||
|
|
||||||
|
die()
|
||||||
|
{
|
||||||
|
echo "$1"
|
||||||
|
cleanup
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function combine_config_layer()
|
||||||
|
{
|
||||||
|
dir=$1
|
||||||
|
file="config-$(echo $dir | sed -e 's|/|-|g')"
|
||||||
|
|
||||||
|
if [ $(ls $dir/ | grep -c "^CONFIG_") -eq 0 ]; then
|
||||||
|
touch $file
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat $dir/CONFIG_* > $file
|
||||||
|
}
|
||||||
|
|
||||||
|
function merge_configs()
|
||||||
|
{
|
||||||
|
archvar=$1
|
||||||
|
arch=$(echo "$archvar" | cut -f1 -d"-")
|
||||||
|
configs=$2
|
||||||
|
order=$3
|
||||||
|
name=$OUTPUT_DIR/$PACKAGE_NAME-$archvar.config
|
||||||
|
echo -n "Building $name ... "
|
||||||
|
touch config-merging config-merged
|
||||||
|
|
||||||
|
# apply based on order
|
||||||
|
skip_if_missing=""
|
||||||
|
for o in $order
|
||||||
|
do
|
||||||
|
for config in $(echo $configs | sed -e 's/:/ /g')
|
||||||
|
do
|
||||||
|
cfile="config-$o-$config"
|
||||||
|
|
||||||
|
test -n "$skip_if_missing" && test ! -e $cfile && continue
|
||||||
|
|
||||||
|
perl merge.pl $cfile config-merging > config-merged
|
||||||
|
if [ ! $? -eq 0 ]; then
|
||||||
|
die "Failed to merge $cfile"
|
||||||
|
fi
|
||||||
|
mv config-merged config-merging
|
||||||
|
done
|
||||||
|
|
||||||
|
# first configs in $order is baseline, all files should be
|
||||||
|
# there. second pass is overrides and can be missing.
|
||||||
|
skip_if_missing="1"
|
||||||
|
done
|
||||||
|
if [ "x$arch" == "xaarch64" ]; then
|
||||||
|
echo "# arm64" > $name
|
||||||
|
elif [ "x$arch" == "xppc64le" ]; then
|
||||||
|
echo "# powerpc" > $name
|
||||||
|
elif [ "x$arch" == "xriscv64" ]; then
|
||||||
|
echo "# riscv" > $name
|
||||||
|
elif [ "x$arch" == "xs390x" ]; then
|
||||||
|
echo "# s390" > $name
|
||||||
|
elif [ "x$arch" == "xarmv7hl" ]; then
|
||||||
|
echo "# arm" > $name
|
||||||
|
elif [ "x$arch" == "xi686" ]; then
|
||||||
|
echo "# i386" > $name
|
||||||
|
else
|
||||||
|
echo "# $arch" > $name
|
||||||
|
fi
|
||||||
|
sort config-merging >> $name
|
||||||
|
rm -f config-merged config-merging
|
||||||
|
echo "done"
|
||||||
|
}
|
||||||
|
|
||||||
|
while read line
|
||||||
|
do
|
||||||
|
if [ $(echo "$line" | grep -c "^#") -ne 0 ]; then
|
||||||
|
continue
|
||||||
|
elif [ $(echo "$line" | grep -c "^$") -ne 0 ]; then
|
||||||
|
continue
|
||||||
|
elif [ $(echo "$line" | grep -c "^ORDER") -ne 0 ]; then
|
||||||
|
order=$(echo "$line" | cut -f2 -d"=")
|
||||||
|
for o in $order
|
||||||
|
do
|
||||||
|
glist=$(find $o -type d)
|
||||||
|
for d in $glist
|
||||||
|
do
|
||||||
|
combine_config_layer $d
|
||||||
|
done
|
||||||
|
done
|
||||||
|
else
|
||||||
|
arch=$(echo "$line" | cut -f1 -d"=")
|
||||||
|
configs=$(echo "$line" | cut -f2 -d"=")
|
||||||
|
|
||||||
|
if [ -n "$SUBARCH" -a "$SUBARCH" != "$arch" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
merge_configs $arch $configs "$order"
|
||||||
|
fi
|
||||||
|
done < $control_file
|
||||||
|
|
||||||
|
# A passed in kernel version implies copy to final location
|
||||||
|
# otherwise defer to another script
|
||||||
|
if test -n "$KVERREL"
|
||||||
|
then
|
||||||
|
for i in kernel-*.config
|
||||||
|
do
|
||||||
|
NEW="$(echo $i | sed "s/$PACKAGE_NAME-$SUBARCH/$PACKAGE_NAME-$KVERREL-$SUBARCH/")"
|
||||||
|
mv $i $NEW
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
cleanup
|
|
@ -0,0 +1,39 @@
|
||||||
|
# config-variant=config:config:config
|
||||||
|
# kernel.config files are build on the fly based on this config,
|
||||||
|
# the first arg is arch and variant, the second is a hierarchy of
|
||||||
|
# config options, lowest priority to highest
|
||||||
|
|
||||||
|
# tells the build_configs.sh which order to build the configs.
|
||||||
|
# this is useful when providing a separate overrides directory.
|
||||||
|
# do not use quotes and space separate the directories.
|
||||||
|
ORDER=fedora
|
||||||
|
|
||||||
|
# x86_64
|
||||||
|
x86_64=generic:generic-x86:generic-x86-x86_64
|
||||||
|
x86_64-debug=generic:generic-x86:generic-x86-x86_64:debug:debug-x86:debug-x86-x86_64
|
||||||
|
|
||||||
|
# i686
|
||||||
|
i686=generic:generic-x86:generic-x86-i686
|
||||||
|
i686-debug=generic:generic-x86:generic-x86-i686:debug:debug-x86
|
||||||
|
|
||||||
|
# ppc64le
|
||||||
|
ppc64le=generic:generic-powerpc:generic-powerpc-powerpc64le
|
||||||
|
ppc64le-debug=generic:generic-powerpc:generic-powerpc-powerpc64le:debug
|
||||||
|
|
||||||
|
# s390x
|
||||||
|
s390x=generic:generic-s390x
|
||||||
|
s390x-debug=generic:generic-s390x:debug
|
||||||
|
|
||||||
|
# aarch64
|
||||||
|
aarch64=generic:generic-arm:generic-arm-aarch64
|
||||||
|
aarch64-debug=generic:generic-arm:generic-arm-aarch64:debug:debug-arm
|
||||||
|
|
||||||
|
# riscv64
|
||||||
|
riscv64=generic:generic-riscv:generic-riscv-riscv64
|
||||||
|
riscv64-debug=generic:generic-riscv:generic-riscv-riscv64:debug
|
||||||
|
|
||||||
|
# arm
|
||||||
|
armv7hl=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-armv7
|
||||||
|
armv7hl-debug=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-armv7:debug:debug-arm
|
||||||
|
armv7hl-lpae=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-lpae
|
||||||
|
armv7hl-lpae-debug=generic:generic-arm:generic-arm-armv7:generic-arm-armv7-lpae:debug:debug-arm
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_ACPI_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_ARM_PTDUMP_DEBUGFS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_ATH_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_B43LEGACY_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_B43_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_BPF_KPROBE_OVERRIDE=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_CAN_DEBUG_DEVICES=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_CARL9170_DEBUGFS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_CEPH_LIB_PRETTYDEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_BLK_CGROUP=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_CREDENTIALS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_KMEMLEAK=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_LOCK_ALLOC=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_MUTEXES=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_NOTIFIERS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS_FREE=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS_TIMERS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_OBJECTS_WORK=y
|
|
@ -0,0 +1 @@
|
||||||
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_PERF_USE_VMALLOC=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_PER_CPU_MAPS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_PI_LIST=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_RT_MUTEXES=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_RWSEMS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_SG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_SLAB=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_SPINLOCK=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_STACK_USAGE=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_VM=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_VM_PGFLAGS=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DEBUG_WW_MUTEX_SLOWPATH=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DETECT_HUNG_TASK=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DMADEVICES_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
# CONFIG_DMADEVICES_VDEBUG is not set
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DMA_API_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_DRBD_FAULT_INJECTION=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_EFI_PGT_DUMP=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_EXT4_DEBUG=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAILSLAB=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAIL_FUNCTION=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAIL_IO_TIMEOUT=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAIL_MAKE_REQUEST=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAIL_MMC_REQUEST=y
|
|
@ -0,0 +1 @@
|
||||||
|
CONFIG_FAIL_PAGE_ALLOC=y
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue