mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-11 07:30:06 +00:00
Preliminary support for FA Nanopi M3 ... kernel 4.11.12, at this moment. Building part currently relies on blobed u-boot and will be later adjusted to the one from sources, which is building but need to be signed with naopi-load tool: https://github.com/rafaello7/bl1-nanopi-m3#embedding-u-boot Thanks to @rafaello7 who made the hard steps ... https://github.com/friendlyarm/linux-3.4.y/issues/3
This commit is contained in:
parent
1e54241c86
commit
c66f4319ad
19 changed files with 20137 additions and 1 deletions
20
config/boards/nanopim3.csc
Normal file
20
config/boards/nanopim3.csc
Normal file
|
@ -0,0 +1,20 @@
|
|||
# S5P6818 octa core 1Gb SoC
|
||||
BOARD_NAME="NanoPi M3"
|
||||
LINUXFAMILY="s5p6818"
|
||||
BOOTCONFIG="nanopim3_defconfig"
|
||||
#
|
||||
MODULES=""
|
||||
MODULES_NEXT=""
|
||||
CPUMIN="400000"
|
||||
CPUMAX="1400000"
|
||||
#
|
||||
KERNEL_TARGET="dev"
|
||||
CLI_TARGET="xenial:dev"
|
||||
DESKTOP_TARGET="xenial:dev"
|
||||
#
|
||||
RECOMMENDED="Ubuntu_xenial_default:90,Ubuntu_xenial_default_desktop:90"
|
||||
#
|
||||
BOARDRATING=""
|
||||
CHIP=""
|
||||
HARDWARE="http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M3"
|
||||
FORUMS="https://forum.armbian.com/index.php?/forum/25-peer-to-peer-technical-support"
|
3
config/bootscripts/boot-s5p6818.cmd
Normal file
3
config/bootscripts/boot-s5p6818.cmd
Normal file
|
@ -0,0 +1,3 @@
|
|||
# DO NOT EDIT THIS FILE
|
||||
# Recompile with:
|
||||
# mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
|
5001
config/kernel/linux-s5p6818-dev.config
Normal file
5001
config/kernel/linux-s5p6818-dev.config
Normal file
File diff suppressed because it is too large
Load diff
38
config/sources/s5p6818.conf
Normal file
38
config/sources/s5p6818.conf
Normal file
|
@ -0,0 +1,38 @@
|
|||
BOOTSOURCE='https://github.com/rafaello7/u-boot-nanopi-m3'
|
||||
BOOTBRANCH='branch:master'
|
||||
BOOTDIR='u-boot-s5p6818'
|
||||
BOOTSCRIPT='boot-s5p6818.cmd:boot.cmd'
|
||||
BOOTENV_FILE='s5p6818-default.txt'
|
||||
|
||||
|
||||
UBOOT_TARGET_MAP=";;$SRC/packages/blobs/nanopim3/bl1-drone.bin $SRC/packages/blobs/nanopim3/u-boot-nsih.bin"
|
||||
|
||||
UBOOT_USE_GCC='> 6.0'
|
||||
UBOOT_COMPILER='aarch64-linux-gnu-'
|
||||
|
||||
KERNELSOURCE='https://github.com/rafaello7/linux-nanopi-m3'
|
||||
KERNELBRANCH='branch:master'
|
||||
KERNELDIR='linux-s5p6818'
|
||||
|
||||
ARCH=arm64
|
||||
KERNEL_IMAGE_TYPE=Image
|
||||
|
||||
KERNEL_USE_GCC='< 5.0'
|
||||
|
||||
CAN_BUILD_STRETCH=no
|
||||
|
||||
HAS_UUID_SUPPORT=yes
|
||||
|
||||
GOVERNOR=interactive
|
||||
|
||||
write_uboot_platform()
|
||||
{
|
||||
dd if=$1/bl1-drone.bin of=$2 seek=1 status=noxfer > /dev/null 2>&1
|
||||
dd if=$1/u-boot-nsih.bin of=$2 seek=64 status=noxfer > /dev/null 2>&1
|
||||
}
|
||||
|
||||
family_tweaks()
|
||||
{
|
||||
echo "#Serial console allow root" >> $SDCARD/etc/securetty
|
||||
echo "ttySAC0" >> $SDCARD/etc/securetty
|
||||
}
|
BIN
packages/blobs/nanopim3/bl1-drone.bin
Normal file
BIN
packages/blobs/nanopim3/bl1-drone.bin
Normal file
Binary file not shown.
BIN
packages/blobs/nanopim3/nanopi-load
Normal file
BIN
packages/blobs/nanopim3/nanopi-load
Normal file
Binary file not shown.
BIN
packages/blobs/nanopim3/u-boot-nsih.bin
Normal file
BIN
packages/blobs/nanopim3/u-boot-nsih.bin
Normal file
Binary file not shown.
|
@ -250,7 +250,7 @@ case "$1" in
|
|||
echo "ethaddr=$(cat /sys/class/net/eth0/address)" >> /boot/armbianEnv.txt
|
||||
fi
|
||||
;;
|
||||
rockchip|odroidc2)
|
||||
rockchip|odroidc2|nanopim3)
|
||||
# set MAC for eth0
|
||||
MACADDR=$(printf 'da:42:ea:%02X:%02X:%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256])
|
||||
sed -i "s/^\#[^ tab]\+hwaddress ether/\thwaddress ether $MACADDR/" /etc/network/interfaces
|
||||
|
|
3875
patch/kernel/s5p6818-dev/01-patch-4.11.6-7.patch.patch
Normal file
3875
patch/kernel/s5p6818-dev/01-patch-4.11.6-7.patch.patch
Normal file
File diff suppressed because it is too large
Load diff
2517
patch/kernel/s5p6818-dev/01-patch-4.11.7-8.patch.patch
Normal file
2517
patch/kernel/s5p6818-dev/01-patch-4.11.7-8.patch.patch
Normal file
File diff suppressed because it is too large
Load diff
3721
patch/kernel/s5p6818-dev/01-patch-4.11.8-9.patch.patch
Normal file
3721
patch/kernel/s5p6818-dev/01-patch-4.11.8-9.patch.patch
Normal file
File diff suppressed because it is too large
Load diff
1069
patch/kernel/s5p6818-dev/01-patch-4.11.9-10.patch.patch
Normal file
1069
patch/kernel/s5p6818-dev/01-patch-4.11.9-10.patch.patch
Normal file
File diff suppressed because it is too large
Load diff
344
patch/kernel/s5p6818-dev/02-patch-4.11.10-11.patch
Normal file
344
patch/kernel/s5p6818-dev/02-patch-4.11.10-11.patch
Normal file
|
@ -0,0 +1,344 @@
|
|||
diff --git a/Makefile b/Makefile
|
||||
index 64f73757916f..cf28e431b68a 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 11
|
||||
-SUBLEVEL = 10
|
||||
+SUBLEVEL = 11
|
||||
EXTRAVERSION =
|
||||
NAME = Fearless Coyote
|
||||
|
||||
diff --git a/arch/x86/include/asm/pat.h b/arch/x86/include/asm/pat.h
|
||||
index 0b1ff4c1c14e..fffb2794dd89 100644
|
||||
--- a/arch/x86/include/asm/pat.h
|
||||
+++ b/arch/x86/include/asm/pat.h
|
||||
@@ -7,6 +7,7 @@
|
||||
bool pat_enabled(void);
|
||||
void pat_disable(const char *reason);
|
||||
extern void pat_init(void);
|
||||
+extern void init_cache_modes(void);
|
||||
|
||||
extern int reserve_memtype(u64 start, u64 end,
|
||||
enum page_cache_mode req_pcm, enum page_cache_mode *ret_pcm);
|
||||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
|
||||
index 4bf0c8926a1c..11beda5a691b 100644
|
||||
--- a/arch/x86/kernel/setup.c
|
||||
+++ b/arch/x86/kernel/setup.c
|
||||
@@ -1080,6 +1080,13 @@ void __init setup_arch(char **cmdline_p)
|
||||
max_possible_pfn = max_pfn;
|
||||
|
||||
/*
|
||||
+ * This call is required when the CPU does not support PAT. If
|
||||
+ * mtrr_bp_init() invoked it already via pat_init() the call has no
|
||||
+ * effect.
|
||||
+ */
|
||||
+ init_cache_modes();
|
||||
+
|
||||
+ /*
|
||||
* Define random base addresses for memory sections after max_pfn is
|
||||
* defined and before each memory section base is used.
|
||||
*/
|
||||
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
|
||||
index efc32bc6862b..0ad3f71c55f8 100644
|
||||
--- a/arch/x86/mm/pat.c
|
||||
+++ b/arch/x86/mm/pat.c
|
||||
@@ -36,14 +36,14 @@
|
||||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) "" fmt
|
||||
|
||||
-static bool boot_cpu_done;
|
||||
-
|
||||
-static int __read_mostly __pat_enabled = IS_ENABLED(CONFIG_X86_PAT);
|
||||
-static void init_cache_modes(void);
|
||||
+static bool __read_mostly boot_cpu_done;
|
||||
+static bool __read_mostly pat_disabled = !IS_ENABLED(CONFIG_X86_PAT);
|
||||
+static bool __read_mostly pat_initialized;
|
||||
+static bool __read_mostly init_cm_done;
|
||||
|
||||
void pat_disable(const char *reason)
|
||||
{
|
||||
- if (!__pat_enabled)
|
||||
+ if (pat_disabled)
|
||||
return;
|
||||
|
||||
if (boot_cpu_done) {
|
||||
@@ -51,10 +51,8 @@ void pat_disable(const char *reason)
|
||||
return;
|
||||
}
|
||||
|
||||
- __pat_enabled = 0;
|
||||
+ pat_disabled = true;
|
||||
pr_info("x86/PAT: %s\n", reason);
|
||||
-
|
||||
- init_cache_modes();
|
||||
}
|
||||
|
||||
static int __init nopat(char *str)
|
||||
@@ -66,7 +64,7 @@ early_param("nopat", nopat);
|
||||
|
||||
bool pat_enabled(void)
|
||||
{
|
||||
- return !!__pat_enabled;
|
||||
+ return pat_initialized;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pat_enabled);
|
||||
|
||||
@@ -204,6 +202,8 @@ static void __init_cache_modes(u64 pat)
|
||||
update_cache_mode_entry(i, cache);
|
||||
}
|
||||
pr_info("x86/PAT: Configuration [0-7]: %s\n", pat_msg);
|
||||
+
|
||||
+ init_cm_done = true;
|
||||
}
|
||||
|
||||
#define PAT(x, y) ((u64)PAT_ ## y << ((x)*8))
|
||||
@@ -224,6 +224,7 @@ static void pat_bsp_init(u64 pat)
|
||||
}
|
||||
|
||||
wrmsrl(MSR_IA32_CR_PAT, pat);
|
||||
+ pat_initialized = true;
|
||||
|
||||
__init_cache_modes(pat);
|
||||
}
|
||||
@@ -241,10 +242,9 @@ static void pat_ap_init(u64 pat)
|
||||
wrmsrl(MSR_IA32_CR_PAT, pat);
|
||||
}
|
||||
|
||||
-static void init_cache_modes(void)
|
||||
+void init_cache_modes(void)
|
||||
{
|
||||
u64 pat = 0;
|
||||
- static int init_cm_done;
|
||||
|
||||
if (init_cm_done)
|
||||
return;
|
||||
@@ -286,8 +286,6 @@ static void init_cache_modes(void)
|
||||
}
|
||||
|
||||
__init_cache_modes(pat);
|
||||
-
|
||||
- init_cm_done = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -305,10 +303,8 @@ void pat_init(void)
|
||||
u64 pat;
|
||||
struct cpuinfo_x86 *c = &boot_cpu_data;
|
||||
|
||||
- if (!pat_enabled()) {
|
||||
- init_cache_modes();
|
||||
+ if (pat_disabled)
|
||||
return;
|
||||
- }
|
||||
|
||||
if ((c->x86_vendor == X86_VENDOR_INTEL) &&
|
||||
(((c->x86 == 0x6) && (c->x86_model <= 0xd)) ||
|
||||
diff --git a/crypto/rsa-pkcs1pad.c b/crypto/rsa-pkcs1pad.c
|
||||
index 8baab4307f7b..7830d304dff6 100644
|
||||
--- a/crypto/rsa-pkcs1pad.c
|
||||
+++ b/crypto/rsa-pkcs1pad.c
|
||||
@@ -496,7 +496,7 @@ static int pkcs1pad_verify_complete(struct akcipher_request *req, int err)
|
||||
goto done;
|
||||
pos++;
|
||||
|
||||
- if (memcmp(out_buf + pos, digest_info->data, digest_info->size))
|
||||
+ if (crypto_memneq(out_buf + pos, digest_info->data, digest_info->size))
|
||||
goto done;
|
||||
|
||||
pos += digest_info->size;
|
||||
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c
|
||||
index 9bc80eb06934..b4e3f4ef5c05 100644
|
||||
--- a/drivers/crypto/caam/caamalg.c
|
||||
+++ b/drivers/crypto/caam/caamalg.c
|
||||
@@ -1474,8 +1474,7 @@ static struct ablkcipher_edesc *ablkcipher_edesc_alloc(struct ablkcipher_request
|
||||
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
|
||||
struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
|
||||
struct device *jrdev = ctx->jrdev;
|
||||
- gfp_t flags = (req->base.flags & (CRYPTO_TFM_REQ_MAY_BACKLOG |
|
||||
- CRYPTO_TFM_REQ_MAY_SLEEP)) ?
|
||||
+ gfp_t flags = (req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP) ?
|
||||
GFP_KERNEL : GFP_ATOMIC;
|
||||
int src_nents, mapped_src_nents, dst_nents = 0, mapped_dst_nents = 0;
|
||||
struct ablkcipher_edesc *edesc;
|
||||
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
|
||||
index 8deac8d9225d..13a3e505d4fc 100644
|
||||
--- a/drivers/staging/comedi/comedi_fops.c
|
||||
+++ b/drivers/staging/comedi/comedi_fops.c
|
||||
@@ -2901,6 +2901,7 @@ static int __init comedi_init(void)
|
||||
dev = comedi_alloc_board_minor(NULL);
|
||||
if (IS_ERR(dev)) {
|
||||
comedi_cleanup_board_minors();
|
||||
+ class_destroy(comedi_class);
|
||||
cdev_del(&comedi_cdev);
|
||||
unregister_chrdev_region(MKDEV(COMEDI_MAJOR, 0),
|
||||
COMEDI_NUM_MINORS);
|
||||
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c
|
||||
index 9e074e9daf4e..e2422f2aa843 100644
|
||||
--- a/drivers/staging/vt6656/main_usb.c
|
||||
+++ b/drivers/staging/vt6656/main_usb.c
|
||||
@@ -523,6 +523,9 @@ static int vnt_start(struct ieee80211_hw *hw)
|
||||
goto free_all;
|
||||
}
|
||||
|
||||
+ if (vnt_key_init_table(priv))
|
||||
+ goto free_all;
|
||||
+
|
||||
priv->int_interval = 1; /* bInterval is set to 1 */
|
||||
|
||||
vnt_int_start_interrupt(priv);
|
||||
diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c
|
||||
index 42145be5c6b4..5dc655e410b4 100644
|
||||
--- a/fs/ext4/sysfs.c
|
||||
+++ b/fs/ext4/sysfs.c
|
||||
@@ -100,7 +100,7 @@ static ssize_t reserved_clusters_store(struct ext4_attr *a,
|
||||
int ret;
|
||||
|
||||
ret = kstrtoull(skip_spaces(buf), 0, &val);
|
||||
- if (!ret || val >= clusters)
|
||||
+ if (ret || val >= clusters)
|
||||
return -EINVAL;
|
||||
|
||||
atomic64_set(&sbi->s_resv_clusters, val);
|
||||
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
|
||||
index c5ae09b6c726..18694598bebf 100644
|
||||
--- a/fs/proc/internal.h
|
||||
+++ b/fs/proc/internal.h
|
||||
@@ -67,7 +67,7 @@ struct proc_inode {
|
||||
struct proc_dir_entry *pde;
|
||||
struct ctl_table_header *sysctl;
|
||||
struct ctl_table *sysctl_entry;
|
||||
- struct list_head sysctl_inodes;
|
||||
+ struct hlist_node sysctl_inodes;
|
||||
const struct proc_ns_operations *ns_ops;
|
||||
struct inode vfs_inode;
|
||||
};
|
||||
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
|
||||
index d04ea4349909..4353faa9d416 100644
|
||||
--- a/fs/proc/proc_sysctl.c
|
||||
+++ b/fs/proc/proc_sysctl.c
|
||||
@@ -191,7 +191,7 @@ static void init_header(struct ctl_table_header *head,
|
||||
head->set = set;
|
||||
head->parent = NULL;
|
||||
head->node = node;
|
||||
- INIT_LIST_HEAD(&head->inodes);
|
||||
+ INIT_HLIST_HEAD(&head->inodes);
|
||||
if (node) {
|
||||
struct ctl_table *entry;
|
||||
for (entry = table; entry->procname; entry++, node++)
|
||||
@@ -261,25 +261,42 @@ static void unuse_table(struct ctl_table_header *p)
|
||||
complete(p->unregistering);
|
||||
}
|
||||
|
||||
-/* called under sysctl_lock */
|
||||
static void proc_sys_prune_dcache(struct ctl_table_header *head)
|
||||
{
|
||||
- struct inode *inode, *prev = NULL;
|
||||
+ struct inode *inode;
|
||||
struct proc_inode *ei;
|
||||
+ struct hlist_node *node;
|
||||
+ struct super_block *sb;
|
||||
|
||||
rcu_read_lock();
|
||||
- list_for_each_entry_rcu(ei, &head->inodes, sysctl_inodes) {
|
||||
- inode = igrab(&ei->vfs_inode);
|
||||
- if (inode) {
|
||||
- rcu_read_unlock();
|
||||
- iput(prev);
|
||||
- prev = inode;
|
||||
- d_prune_aliases(inode);
|
||||
+ for (;;) {
|
||||
+ node = hlist_first_rcu(&head->inodes);
|
||||
+ if (!node)
|
||||
+ break;
|
||||
+ ei = hlist_entry(node, struct proc_inode, sysctl_inodes);
|
||||
+ spin_lock(&sysctl_lock);
|
||||
+ hlist_del_init_rcu(&ei->sysctl_inodes);
|
||||
+ spin_unlock(&sysctl_lock);
|
||||
+
|
||||
+ inode = &ei->vfs_inode;
|
||||
+ sb = inode->i_sb;
|
||||
+ if (!atomic_inc_not_zero(&sb->s_active))
|
||||
+ continue;
|
||||
+ inode = igrab(inode);
|
||||
+ rcu_read_unlock();
|
||||
+ if (unlikely(!inode)) {
|
||||
+ deactivate_super(sb);
|
||||
rcu_read_lock();
|
||||
+ continue;
|
||||
}
|
||||
+
|
||||
+ d_prune_aliases(inode);
|
||||
+ iput(inode);
|
||||
+ deactivate_super(sb);
|
||||
+
|
||||
+ rcu_read_lock();
|
||||
}
|
||||
rcu_read_unlock();
|
||||
- iput(prev);
|
||||
}
|
||||
|
||||
/* called under sysctl_lock, will reacquire if has to wait */
|
||||
@@ -465,7 +482,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
|
||||
}
|
||||
ei->sysctl = head;
|
||||
ei->sysctl_entry = table;
|
||||
- list_add_rcu(&ei->sysctl_inodes, &head->inodes);
|
||||
+ hlist_add_head_rcu(&ei->sysctl_inodes, &head->inodes);
|
||||
head->count++;
|
||||
spin_unlock(&sysctl_lock);
|
||||
|
||||
@@ -493,7 +510,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
|
||||
void proc_sys_evict_inode(struct inode *inode, struct ctl_table_header *head)
|
||||
{
|
||||
spin_lock(&sysctl_lock);
|
||||
- list_del_rcu(&PROC_I(inode)->sysctl_inodes);
|
||||
+ hlist_del_init_rcu(&PROC_I(inode)->sysctl_inodes);
|
||||
if (!--head->count)
|
||||
kfree_rcu(head, rcu);
|
||||
spin_unlock(&sysctl_lock);
|
||||
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h
|
||||
index b7e82049fec7..0e5cc33b9b25 100644
|
||||
--- a/include/linux/sysctl.h
|
||||
+++ b/include/linux/sysctl.h
|
||||
@@ -143,7 +143,7 @@ struct ctl_table_header
|
||||
struct ctl_table_set *set;
|
||||
struct ctl_dir *parent;
|
||||
struct ctl_node *node;
|
||||
- struct list_head inodes; /* head for proc_inode->sysctl_inodes */
|
||||
+ struct hlist_head inodes; /* head for proc_inode->sysctl_inodes */
|
||||
};
|
||||
|
||||
struct ctl_dir {
|
||||
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
|
||||
index e8d41ff57241..a6ced9e07e1c 100644
|
||||
--- a/ipc/mqueue.c
|
||||
+++ b/ipc/mqueue.c
|
||||
@@ -1253,8 +1253,10 @@ SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
|
||||
|
||||
timeo = MAX_SCHEDULE_TIMEOUT;
|
||||
ret = netlink_attachskb(sock, nc, &timeo, NULL);
|
||||
- if (ret == 1)
|
||||
+ if (ret == 1) {
|
||||
+ sock = NULL;
|
||||
goto retry;
|
||||
+ }
|
||||
if (ret) {
|
||||
sock = NULL;
|
||||
nc = NULL;
|
||||
diff --git a/kernel/locking/rwsem-spinlock.c b/kernel/locking/rwsem-spinlock.c
|
||||
index c65f7989f850..20819df98125 100644
|
||||
--- a/kernel/locking/rwsem-spinlock.c
|
||||
+++ b/kernel/locking/rwsem-spinlock.c
|
||||
@@ -231,8 +231,8 @@ int __sched __down_write_common(struct rw_semaphore *sem, int state)
|
||||
|
||||
out_nolock:
|
||||
list_del(&waiter.list);
|
||||
- if (!list_empty(&sem->wait_list))
|
||||
- __rwsem_do_wake(sem, 1);
|
||||
+ if (!list_empty(&sem->wait_list) && sem->count >= 0)
|
||||
+ __rwsem_do_wake(sem, 0);
|
||||
raw_spin_unlock_irqrestore(&sem->wait_lock, flags);
|
||||
|
||||
return -EINTR;
|
3153
patch/kernel/s5p6818-dev/02-patch-4.11.11-12.patch
Normal file
3153
patch/kernel/s5p6818-dev/02-patch-4.11.11-12.patch
Normal file
File diff suppressed because it is too large
Load diff
11
patch/kernel/s5p6818-dev/bash_to_afterinstall.patch
Normal file
11
patch/kernel/s5p6818-dev/bash_to_afterinstall.patch
Normal file
|
@ -0,0 +1,11 @@
|
|||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -218,7 +218,7 @@
|
||||
for script in postinst postrm preinst prerm ; do
|
||||
mkdir -p "$tmpdir$debhookdir/$script.d"
|
||||
cat <<EOF > "$tmpdir/DEBIAN/$script"
|
||||
-#!/bin/sh
|
||||
+#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
|
@ -0,0 +1,198 @@
|
|||
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
|
||||
index 807c9cd..9b9435f 100755
|
||||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -29,6 +29,28 @@ create_package() {
|
||||
# in case we are in a restrictive umask environment like 0077
|
||||
chmod -R a+rX "$pdir"
|
||||
|
||||
+ # Create preinstall and post install script to remove dtb
|
||||
+ if [[ "$1" == *dtb* ]]; then
|
||||
+ echo "if [ -d /boot/dtb-$version ]; then mv /boot/dtb-$version /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/preinst
|
||||
+ echo "if [ -d /boot/dtb.old ]; then rm -rf /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst
|
||||
+ echo "if [ -d /dtb ]; then mv /dtb /dtb.old; fi" >> $pdir/DEBIAN/preinst
|
||||
+ echo "if [ -d /boot/dtb ]; then mv /boot/dtb /boot/dtb.old; fi" >> $pdir/DEBIAN/preinst
|
||||
+ echo "exit 0" >> $pdir/DEBIAN/preinst
|
||||
+ chmod 775 $pdir/DEBIAN/preinst
|
||||
+ #
|
||||
+ echo "if [ -d /boot/dtb-$version.old ]; then rm -rf /boot/dtb-$version.old; fi" >> $pdir/DEBIAN/postinst
|
||||
+ echo "ln -sf dtb-$version /boot/dtb > /dev/null 2>&1 || mv /boot/dtb-$version /boot/dtb" >> $pdir/DEBIAN/postinst
|
||||
+ echo "exit 0" >> $pdir/DEBIAN/postinst
|
||||
+ chmod 775 $pdir/DEBIAN/postinst
|
||||
+ fi
|
||||
+
|
||||
+ # Create postinstall script for headers
|
||||
+ if [[ "$1" == *headers* ]]; then
|
||||
+ echo "cd /usr/src/linux-headers-$version; echo \"Compiling headers - please wait ...\"; make -s scripts >/dev/null 2>&1" >> $pdir/DEBIAN/postinst
|
||||
+ echo "exit 0" >> $pdir/DEBIAN/postinst
|
||||
+ chmod 775 $pdir/DEBIAN/postinst
|
||||
+ fi
|
||||
+
|
||||
# Create the package
|
||||
dpkg-gencontrol $forcearch -Vkernel:debarch="${debarch}" -p$pname -P"$pdir"
|
||||
dpkg --build "$pdir" ..
|
||||
@@ -95,11 +117,13 @@ tmpdir="$objtree/debian/tmp"
|
||||
fwdir="$objtree/debian/fwtmp"
|
||||
kernel_headers_dir="$objtree/debian/hdrtmp"
|
||||
libc_headers_dir="$objtree/debian/headertmp"
|
||||
+dtb_dir="$objtree/debian/dtbtmp"
|
||||
dbg_dir="$objtree/debian/dbgtmp"
|
||||
-packagename=linux-image-$version
|
||||
-fwpackagename=linux-firmware-image-$version
|
||||
-kernel_headers_packagename=linux-headers-$version
|
||||
-libc_headers_packagename=linux-libc-dev
|
||||
+packagename=linux-image-dev"$LOCALVERSION"
|
||||
+fwpackagename=linux-firmware-image-dev"$LOCALVERSION"
|
||||
+kernel_headers_packagename=linux-headers-dev"$LOCALVERSION"
|
||||
+dtb_packagename=linux-dtb-dev"$LOCALVERSION"
|
||||
+libc_headers_packagename=linux-libc-dev-dev"$LOCALVERSION"
|
||||
dbg_packagename=$packagename-dbg
|
||||
debarch=
|
||||
forcearch=
|
||||
@@ -126,7 +150,9 @@ esac
|
||||
BUILD_DEBUG="$(grep -s '^CONFIG_DEBUG_INFO=y' $KCONFIG_CONFIG || true)"
|
||||
|
||||
# Setup the directory structure
|
||||
-rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" $objtree/debian/files
|
||||
+rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir" "$dbg_dir" "$dtb_dir" $objtree/debian/files
|
||||
+mkdir -m 755 -p "$dtb_dir/DEBIAN"
|
||||
+mkdir -p "$dtb_dir/boot/dtb-$version" "$dtb_dir/usr/share/doc/$dtb_packagename"
|
||||
mkdir -m 755 -p "$tmpdir/DEBIAN"
|
||||
mkdir -p "$tmpdir/lib" "$tmpdir/boot"
|
||||
mkdir -p "$fwdir/lib/firmware/$version/"
|
||||
@@ -180,6 +206,11 @@ if grep -q '^CONFIG_MODULES=y' $KCONFIG_CONFIG ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
+if grep -q '^CONFIG_OF=y' $KCONFIG_CONFIG ; then
|
||||
+ #mkdir -p "$tmpdir/boot/dtb"
|
||||
+ INSTALL_DTBS_PATH="$dtb_dir/boot/dtb-$version" $MAKE KBUILD_SRC= dtbs_install
|
||||
+fi
|
||||
+
|
||||
if [ "$ARCH" != "um" ]; then
|
||||
$MAKE headers_check KBUILD_SRC=
|
||||
$MAKE headers_install KBUILD_SRC= INSTALL_HDR_PATH="$libc_headers_dir/usr"
|
||||
@@ -192,7 +223,7 @@ fi
|
||||
# so do we; recent versions of dracut and initramfs-tools will obey this.
|
||||
debhookdir=${KDEB_HOOKDIR:-/etc/kernel}
|
||||
if grep -q '^CONFIG_BLK_DEV_INITRD=y' $KCONFIG_CONFIG; then
|
||||
- want_initrd=Yes
|
||||
+ want_initrd=Yes
|
||||
else
|
||||
want_initrd=No
|
||||
fi
|
||||
@@ -204,9 +235,11 @@ for script in postinst postrm preinst prerm ; do
|
||||
set -e
|
||||
|
||||
# Pass maintainer script parameters to hook scripts
|
||||
+
|
||||
export DEB_MAINT_PARAMS="\$*"
|
||||
|
||||
# Tell initramfs builder whether it's wanted
|
||||
+
|
||||
export INITRD=$want_initrd
|
||||
|
||||
test -d $debhookdir/$script.d && run-parts --arg="$version" --arg="/$installed_image_path" $debhookdir/$script.d
|
||||
@@ -215,6 +248,55 @@ EOF
|
||||
chmod 755 "$tmpdir/DEBIAN/$script"
|
||||
done
|
||||
|
||||
+##
|
||||
+## Create sym link to kernel image
|
||||
+##
|
||||
+sed -e "s/set -e//g" -i $tmpdir/DEBIAN/postinst
|
||||
+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/postinst
|
||||
+cat >> $tmpdir/DEBIAN/postinst <<EOT
|
||||
+if [ "\$(grep nand /proc/partitions)" != "" ] && [ "\$(grep mmc /proc/partitions)" = "" ]; then
|
||||
+mkimage -A arm -O linux -T kernel -C none -a "0x40008000" -e "0x40008000" -n "Linux kernel" -d /$installed_image_path /boot/uImage > /dev/null 2>&1
|
||||
+cp /boot/uImage /tmp/uImage
|
||||
+sync
|
||||
+mountpoint -q /boot || mount /boot
|
||||
+cp /tmp/uImage /boot/uImage
|
||||
+rm -f /$installed_image_path
|
||||
+else
|
||||
+ln -sf $(basename $installed_image_path) /boot/zImage > /dev/null 2>&1 || mv /$installed_image_path /boot/zImage
|
||||
+fi
|
||||
+touch /boot/.next
|
||||
+exit 0
|
||||
+EOT
|
||||
+##
|
||||
+## FAT install workaround
|
||||
+##
|
||||
+sed -e "s/set -e//g" -i $tmpdir/DEBIAN/preinst
|
||||
+sed -e "s/exit 0//g" -i $tmpdir/DEBIAN/preinst
|
||||
+cat >> $tmpdir/DEBIAN/preinst <<EOT
|
||||
+# exit if we are running chroot
|
||||
+if [ "\$(stat -c %d:%i /)" != "\$(stat -c %d:%i /proc/1/root/.)" ]; then exit 0; fi
|
||||
+
|
||||
+check_and_unmount (){
|
||||
+boot_device=\$(mountpoint -d /boot)
|
||||
+
|
||||
+for file in /dev/* ; do
|
||||
+ CURRENT_DEVICE=\$(printf "%d:%d" \$(stat --printf="0x%t 0x%T" \$file))
|
||||
+ if [[ "\$CURRENT_DEVICE" = "\$boot_device" ]]; then
|
||||
+ boot_partition=\$file
|
||||
+ break;
|
||||
+ fi
|
||||
+done
|
||||
+
|
||||
+bootfstype=\$(blkid -s TYPE -o value \$boot_partition)
|
||||
+if [ "\$bootfstype" = "vfat" ]; then
|
||||
+umount /boot;
|
||||
+rm -f /boot/System.map* /boot/config* /boot/vmlinuz* /boot/zImage /boot/uImage
|
||||
+fi
|
||||
+}
|
||||
+mountpoint -q /boot && check_and_unmount
|
||||
+EOT
|
||||
+echo "exit 0" >> $tmpdir/DEBIAN/preinst
|
||||
+
|
||||
# Try to determine maintainer and email values
|
||||
if [ -n "$DEBEMAIL" ]; then
|
||||
email=$DEBEMAIL
|
||||
@@ -329,12 +411,20 @@ if grep -q '^CONFIG_GCC_PLUGINS=y' $KCONFIG_CONFIG ; then
|
||||
fi
|
||||
destdir=$kernel_headers_dir/usr/src/linux-headers-$version
|
||||
mkdir -p "$destdir"
|
||||
+######################## headers patch
|
||||
+ZACNI=$(pwd)
|
||||
+cd $destdir
|
||||
+patch -p1 < /tmp/headers-debian-byteshift.patch
|
||||
+cd $ZACNI
|
||||
+######################## headers patch
|
||||
(cd $srctree; tar -c -f - -T -) < "$objtree/debian/hdrsrcfiles" | (cd $destdir; tar -xf -)
|
||||
(cd $objtree; tar -c -f - -T -) < "$objtree/debian/hdrobjfiles" | (cd $destdir; tar -xf -)
|
||||
(cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be
|
||||
ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build"
|
||||
rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles"
|
||||
|
||||
+(cd "$destdir"; make M=scripts clean)
|
||||
+
|
||||
cat <<EOF >> debian/control
|
||||
|
||||
Package: $kernel_headers_packagename
|
||||
@@ -363,6 +453,16 @@ fi
|
||||
|
||||
cat <<EOF >> debian/control
|
||||
|
||||
+Package: $dtb_packagename
|
||||
+Architecture: any
|
||||
+Description: Linux DTB, version $version
|
||||
+ This package contains device blobs from the Linux kernel, version $version.
|
||||
+EOF
|
||||
+
|
||||
+create_package "$dtb_packagename" "$dtb_dir"
|
||||
+
|
||||
+cat <<EOF >> debian/control
|
||||
+
|
||||
Package: $libc_headers_packagename
|
||||
Section: devel
|
||||
Provides: linux-kernel-headers
|
||||
@@ -374,7 +474,7 @@ EOF
|
||||
|
||||
if [ "$ARCH" != "um" ]; then
|
||||
create_package "$kernel_headers_packagename" "$kernel_headers_dir"
|
||||
- create_package "$libc_headers_packagename" "$libc_headers_dir"
|
||||
+# create_package "$libc_headers_packagename" "$libc_headers_dir"
|
||||
fi
|
||||
|
||||
create_package "$packagename" "$tmpdir"
|
13
patch/kernel/s5p6818-dev/packaging-4.x-odroid.patch
Normal file
13
patch/kernel/s5p6818-dev/packaging-4.x-odroid.patch
Normal file
|
@ -0,0 +1,13 @@
|
|||
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
|
||||
index 750d70e..8fc16c9 100755
|
||||
--- a/scripts/package/builddeb
|
||||
+++ b/scripts/package/builddeb
|
||||
@@ -267,7 +267,7 @@ mountpoint -q /boot || mount /boot
|
||||
cp /tmp/uImage /boot/uImage
|
||||
rm -f /$installed_image_path
|
||||
else
|
||||
-ln -sf $(basename $installed_image_path) /boot/zImage > /dev/null 2>&1 || mv /$installed_image_path /boot/zImage
|
||||
+rm -f /boot/zImage;gunzip -c /boot/$(basename $installed_image_path) > /boot/Image
|
||||
fi
|
||||
touch /boot/.next
|
||||
exit 0
|
35
patch/u-boot/u-boot-s5p6818/environment.patch
Normal file
35
patch/u-boot/u-boot-s5p6818/environment.patch
Normal file
|
@ -0,0 +1,35 @@
|
|||
diff --git a/include/configs/s5p6818_nanopim3.h b/include/configs/s5p6818_nanopim3.h
|
||||
old mode 100644
|
||||
new mode 100755
|
||||
index 060f405..c570b7f
|
||||
--- a/include/configs/s5p6818_nanopim3.h
|
||||
+++ b/include/configs/s5p6818_nanopim3.h
|
||||
@@ -296,12 +296,13 @@
|
||||
"stderr=serial,vga"
|
||||
|
||||
#define CONFIG_BOOTARGS \
|
||||
- "console=ttySAC0,115200n8 initrd=0x49000000,0x2000000"
|
||||
+ "console=ttySAC0,115200n8 initrd=0x49000000,0x400000 root=/dev/mmcblk2p1 console=tty1"
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
- "echo Waiting for environment...;" \
|
||||
- "udown 0x48000000; " \
|
||||
- "env import -t -r 0x48000000; " \
|
||||
- "run bootcmd2"
|
||||
+ "ext4load mmc 1:1 0x48000000 boot/Image; " \
|
||||
+ "mw 0x49000000 0 0x400000; " \
|
||||
+ "ext4load mmc 1:1 0x49000000 boot/uInitrd; " \
|
||||
+ "ext4load mmc 1:1 0x4a000000 boot/dtb/nexell/s5p6818-nanopi-m3.dtb; " \
|
||||
+ "booti 0x48000000 0x49000000 0x4a000000"
|
||||
|
||||
#endif /* __CONFIG_H__ */
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -873,6 +873,7 @@ u-boot.bin: u-boot FORCE
|
||||
$(call if_changed,objcopy)
|
||||
$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
|
||||
$(BOARD_SIZE_CHECK)
|
||||
+ ./nanopi-load -o u-boot-nsih.bin u-boot.bin 0x43bffe00
|
||||
|
||||
u-boot.ldr: u-boot
|
||||
$(CREATE_LDR_ENV)
|
138
patch/u-boot/u-boot-s5p6818/nanopi-load.patch
Normal file
138
patch/u-boot/u-boot-s5p6818/nanopi-load.patch
Normal file
|
@ -0,0 +1,138 @@
|
|||
diff --git a/nanopi-load b/nanopi-load
|
||||
new file mode 100755
|
||||
index 0000000000000000000000000000000000000000..2210623e849f9cfc79ef9cd29519f3986d2eb221
|
||||
GIT binary patch
|
||||
literal 18488
|
||||
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
|
||||
R^$*sf0O`4`0h3+-e*vH(yygG^
|
||||
|
||||
literal 0
|
||||
HcmV?d00001
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue