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:
Igor Pecovnik 2017-08-14 22:06:34 +02:00
parent 1e54241c86
commit c66f4319ad
19 changed files with 20137 additions and 1 deletions

View 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"

View 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

File diff suppressed because it is too large Load diff

View 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
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -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

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View 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;

File diff suppressed because it is too large Load diff

View 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

View file

@ -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"

View 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

View 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)

View 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