mirror of https://github.com/OpenIPC/firmware.git
78 lines
2.3 KiB
Diff
78 lines
2.3 KiB
Diff
diff -drupN a/drivers/mtd/aw-spinand/sunxi-common.c b/drivers/mtd/aw-spinand/sunxi-common.c
|
|
--- a/drivers/mtd/aw-spinand/sunxi-common.c 1970-01-01 03:00:00.000000000 +0300
|
|
+++ b/drivers/mtd/aw-spinand/sunxi-common.c 2022-06-12 05:28:14.000000000 +0300
|
|
@@ -0,0 +1,73 @@
|
|
+/*
|
|
+ * sunxi-nftl-core.c for sunxi spi nand base on nftl.
|
|
+ *
|
|
+ * Copyright (C) 2019 Allwinner.
|
|
+ * SPDX-License-Identifier: GPL-2.0
|
|
+ */
|
|
+
|
|
+#define pr_fmt(fmt) "sunxi-spinand: " fmt
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/mtd/mtd.h>
|
|
+#include <linux/mtd/partitions.h>
|
|
+#include <linux/of.h>
|
|
+#include <linux/spi/spi.h>
|
|
+#include <linux/sunxi-sid.h>
|
|
+#include <linux/uaccess.h>
|
|
+
|
|
+#include "sunxi-spinand.h"
|
|
+
|
|
+static int ubootblks = -1;
|
|
+module_param(ubootblks, int, 0400);
|
|
+MODULE_PARM_DESC(ubootblks, "block count for uboot");
|
|
+
|
|
+void aw_spinand_uboot_blknum(struct aw_spinand *spinand, unsigned int *start,
|
|
+ unsigned int *end)
|
|
+{
|
|
+ struct aw_spinand_chip *chip = spinand_to_chip(spinand);
|
|
+ struct aw_spinand_info *info = chip->info;
|
|
+ unsigned int blksize = info->phy_block_size(chip);
|
|
+ unsigned int pagecnt = blksize / info->phy_page_size(chip);
|
|
+ unsigned int _start, _end;
|
|
+
|
|
+ /* small nand:block size < 1MB; reserve 4M for uboot */
|
|
+ if (blksize <= SZ_128K) {
|
|
+ _start = UBOOT_START_BLOCK_SMALLNAND;
|
|
+ _end = _start + 32;
|
|
+ } else if (blksize <= SZ_256K) {
|
|
+ _start = UBOOT_START_BLOCK_SMALLNAND;
|
|
+ _end = _start + 16;
|
|
+ } else if (blksize <= SZ_512K) {
|
|
+ _start = UBOOT_START_BLOCK_SMALLNAND;
|
|
+ _end = _start + 8;
|
|
+ } else if (blksize <= SZ_1M && pagecnt <= 128) {
|
|
+ _start = UBOOT_START_BLOCK_SMALLNAND;
|
|
+ _end = _start + 4;
|
|
+ /* big nand; reserve at least 20M for uboot */
|
|
+ } else if (blksize <= SZ_1M && pagecnt > 128) {
|
|
+ _start = UBOOT_START_BLOCK_BIGNAND;
|
|
+ _end = _start + 20;
|
|
+ } else if (blksize <= SZ_2M) {
|
|
+ _start = UBOOT_START_BLOCK_BIGNAND;
|
|
+ _end = _start + 10;
|
|
+ } else {
|
|
+ _start = UBOOT_START_BLOCK_BIGNAND;
|
|
+ _end = _start + 8;
|
|
+ }
|
|
+
|
|
+ if (ubootblks > 0)
|
|
+ _end = _start + ubootblks;
|
|
+ else
|
|
+ /* update parameter to /sys */
|
|
+ ubootblks = _end - _start;
|
|
+
|
|
+ if (start)
|
|
+ *start = _start;
|
|
+ if (end)
|
|
+ *end = _end;
|
|
+}
|
|
+EXPORT_SYMBOL(aw_spinand_uboot_blknum);
|
|
+
|
|
+MODULE_AUTHOR("cuizhikui <cuizhikui@allwinnertech.com>");
|
|
+MODULE_DESCRIPTION("Allwinner's spinand mtd and nftl driver common port");
|