Commit 8785072b authored by jan.koester's avatar jan.koester
Browse files

bugfixes ppc

parent 0ac3ecb8
Loading
Loading
Loading
Loading
+1 −0
Changes for .gitignore: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
build/*
build-cross/
build-*/
.vs/*
.out/*
+160 −0
Changes for boards/nas-itx/kernel.config: 160 added lines, 0 removed lines.
Original line number Diff line number Diff line
# FenrirOS kernel options for the Inventronics NAS ITX (P1010, e500v2).
# Merged over the kernel's mpc85xx_defconfig (85xx-32bit + 85xx-hw +
# mpc85xx_base) by build-cross.sh.

# --- platform: P1010 only, e500v2 ---
CONFIG_P1010_RDB=y
CONFIG_SMP=n
CONFIG_HIGHMEM=y
CONFIG_PPC_DISABLE_WERROR=y
# userland is soft-float (no SPE instructions), and the SPE context switch
# in head_85xx.S (`cmpi 0,r5,0`) does not assemble with LLVM's integrated
# assembler -- needs `cmpwi r5,0` before CONFIG_SPE can come back
CONFIG_SPE=n
# clang has no CPU "8540" (GCC's name for e500, CONFIG_E500_CPU's
# TARGET_CPU): build for the toolchain's default CPU instead -- the kernel
# uses its own barrier/atomic assembly (msync on e500), not compiler ones
CONFIG_TOOLCHAIN_DEFAULT_CPU=y

# A relocatable ppc32 kernel is linked -pie with -z notext: lld has no
# dynamic relocations for R_PPC_ADDR16_HA/LO (GNU ld emits them), so no
# RELOCATABLE -- and with it no kdump (CRASH_DUMP selects it); kexec stays
CONFIG_CRASH_DUMP=n
CONFIG_RELOCATABLE=n

# --- console ---
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_OF_PLATFORM=y

# --- NAND: IFC controller, UBI + UBIFS root ---
CONFIG_MTD=y
CONFIG_MTD_OF_PARTS=y
CONFIG_MTD_BLOCK=n
CONFIG_MTD_RAW_NAND=y
CONFIG_MTD_NAND_FSL_IFC=y
CONFIG_MTD_UBI=y
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_LIMIT=20
CONFIG_UBIFS_FS=y
CONFIG_UBIFS_FS_ZSTD=y
CONFIG_UBIFS_FS_LZO=y
CONFIG_UBIFS_FS_ZLIB=y
CONFIG_UBIFS_FS_XATTR=y
CONFIG_UBIFS_FS_SECURITY=n

# --- SATA: on-chip controller, SiI port multipliers ---
CONFIG_ATA=y
CONFIG_SATA_FSL=y
CONFIG_SATA_PMP=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
CONFIG_SENSORS_DRIVETEMP=m

# --- Ethernet: eTSEC SGMII + Lantiq PEF7071 ---
CONFIG_NETDEVICES=y
CONFIG_ETHERNET=y
CONFIG_NET_VENDOR_FREESCALE=y
CONFIG_GIANFAR=y
CONFIG_FSL_PQ_MDIO=y
CONFIG_PHYLIB=y
CONFIG_INTEL_XWAY_PHY=y
CONFIG_FIXED_PHY=y

# --- I2C (SiI management bus, ID EEPROM), GPIO ---
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_MPC=y
CONFIG_EEPROM_AT24=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_MPC8XXX=y
CONFIG_GPIO_CDEV=y

# --- watchdog ---
CONFIG_WATCHDOG=y
CONFIG_BOOKE_WDT=y

# --- what FenrirOS userland needs (same as the x86_64 kernel) ---
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_OVERLAY_FS=y
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_ZSTD=y
CONFIG_SQUASHFS_XATTR=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_CGROUPS=y
CONFIG_MEMCG=y
CONFIG_BPF_SYSCALL=y
CONFIG_CGROUP_BPF=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_COMPRESS=y
CONFIG_MODULE_COMPRESS_ZSTD=y
CONFIG_MODULE_COMPRESS_ALL=y
CONFIG_MODULE_DECOMPRESS=y
CONFIG_FW_LOADER_COMPRESS=y
CONFIG_FW_LOADER_COMPRESS_ZSTD=y
CONFIG_MODPROBE_PATH="/bin/modprobe"
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA3=y
CONFIG_INOTIFY_USER=y
CONFIG_FANOTIFY=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IPV6=y
CONFIG_PACKET=y

# --- NAS services (as on x86_64: modules) ---
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_SMB_SERVER=m
CONFIG_NFSD=m
CONFIG_NFSD_V4=y
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
CONFIG_BLK_DEV_DM=m
CONFIG_CONFIGFS_FS=m
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_ISCSI_TARGET=m
CONFIG_NETFILTER=y
CONFIG_NF_TABLES=m
CONFIG_NF_TABLES_INET=y
CONFIG_NF_TABLES_IPV4=y
CONFIG_NF_TABLES_IPV6=y
CONFIG_NFT_CT=m
CONFIG_NFT_NAT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_BRIDGE=m
CONFIG_VLAN_8021Q=m
CONFIG_BONDING=m
CONFIG_WIREGUARD=m
CONFIG_VETH=m
CONFIG_USB_SUPPORT=n
CONFIG_EXFAT_FS=m
CONFIG_NTFS3_FS=m
CONFIG_VFAT_FS=m
CONFIG_NLS_UTF8=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y

# --- test target: QEMU's ppce500 machine (qemu-system-ppc -M ppce500
#     -cpu e500v2); only probed on its own compatible, harmless on the board
CONFIG_PPC_QEMU_E500=y
CONFIG_PCI=y
CONFIG_VIRTIO=y
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BLK=y
CONFIG_VIRTIO_NET=y
+148 −0
Changes for boards/nas-itx/nas-itx.dts: 148 added lines, 0 removed lines.
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Inventronics NAS ITX (Freescale/NXP P1010, e500v2) -- Linux device tree
 *
 * Built against the kernel's arch/powerpc/boot/dts/fsl include files
 * (dtc -i arch/powerpc/boot/dts/fsl). The machine is driven by the
 * P1010RDB platform code (arch/powerpc/platforms/85xx/p1010rdb.c), which
 * matches "fsl,P1010RDB-PB"; nothing in it is RDB specific.
 *
 * Board (schematic NAS_ITX v2.0, PCB v1.1, U-Boot reports rev 2.1):
 *  - 2 GiB DDR3 (filled in by U-Boot)
 *  - IFC CS0: Micron MT29F32G08CBACA MLC NAND, 4 GiB, 4 KiB pages,
 *    1 MiB blocks; boot device. Bad block table on flash (the U-Boot
 *    format, "Bbt0"/"1tbB" in the last blocks)
 *  - eTSEC1/eTSEC2: SGMII (SerDes1 lanes 1/2) to 2x Lantiq PEF7071 on
 *    the shared MDIO bus of eTSEC1
 *  - SerDes2: SATA1/SATA2, each behind a SiI port multiplier
 *  - UART0: console (115200 8N1)
 *  - no PCIe, USB, eSDHC, NOR, SPI flash; eTSEC3 not connected
 */

/include/ "p1010si-pre.dtsi"

/ {
	model = "Inventronics NAS ITX";
	compatible = "inventronics,nas-itx", "fsl,P1010RDB-PB";

	aliases {
		ethernet0 = &enet0;
		ethernet1 = &enet1;
	};

	chosen {
		stdout-path = "serial0:115200n8";
	};

	/include/ "p1010rdb_32b.dtsi"
};

/include/ "p1010si-post.dtsi"

&board_ifc {
	/* only CS0 (NAND) is used; no NOR (CS0 window of the RDB), no CPLD */
	ranges = <0x0 0x0 0x0 0xff800000 0x00010000>;

	nand@0,0 {
		compatible = "fsl,ifc-nand";
		reg = <0x0 0x0 0x10000>;

		partitions {
			compatible = "fixed-partitions";
			#address-cells = <1>;
			#size-cells = <1>;

			/* same layout as U-Boot's mtdparts (nas_itx_NAND_defconfig) */
			partition@0 {
				/* SPL, TPL and U-Boot */
				reg = <0x00000000 0x00100000>;
				label = "uboot";
				read-only;
			};

			partition@100000 {
				reg = <0x00100000 0x00100000>;
				label = "env";
			};

			partition@200000 {
				reg = <0x00200000 0x00100000>;
				label = "dtb";
			};

			partition@300000 {
				/* uImage, up to 16 MiB */
				reg = <0x00300000 0x01000000>;
				label = "kernel";
			};

			partition@1300000 {
				/* UBI: volume "rootfs" (UBIFS) */
				reg = <0x01300000 0xfed00000>;
				label = "fs";
			};
		};
	};
};

&board_soc {
	mdio@24000 {
		phy0: ethernet-phy@0 {
			reg = <0x0>;
		};

		phy1: ethernet-phy@1 {
			reg = <0x1>;
		};

		/* eTSEC1 SGMII TBI */
		tbi0: tbi-phy@1f {
			device_type = "tbi-phy";
			reg = <0x1f>;
		};
	};

	mdio@25000 {
		tbi1: tbi-phy@1f {
			device_type = "tbi-phy";
			reg = <0x1f>;
		};
	};

	enet0: ethernet@b0000 {
		phy-handle = <&phy0>;
		tbi-handle = <&tbi0>;
		phy-connection-type = "sgmii";
	};

	enet1: ethernet@b1000 {
		phy-handle = <&phy1>;
		tbi-handle = <&tbi1>;
		phy-connection-type = "sgmii";
	};

	ethernet@b2000 {
		status = "disabled";
	};

	/* SPI pins are GPIO_6..9 here: the SiI port multiplier resets */
	spi@7000 {
		status = "disabled";
	};

	usb@22000 {
		status = "disabled";
	};

	sdhc@2e000 {
		status = "disabled";
	};
};

&pci0 {
	status = "disabled";
};

&pci1 {
	status = "disabled";
};

build-cross.sh

0 → 100755
+509 −0

File added.

Preview size limit exceeded, changes collapsed.

+4 −2
Changes for src/linux/alloc.cpp: 4 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -151,7 +151,9 @@ namespace sys {
                    unsigned long total = size + sizeof(block_header);
                    block_header* h = (block_header*)mmap(0, total, PROT_READ | PROT_WRITE,
                                                           MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
                    if ((long)h < 0) return nullptr;
                    /* MAP_FAILED, not "negative": on 32-bit targets user
                     * addresses above 2 GiB are negative as a long */
                    if (h == MAP_FAILED) return nullptr;
                    h->size_class = LARGE_SENTINEL;
                    h->size = size;
                    return (void*)(h + 1);
@@ -274,7 +276,7 @@ namespace sys {

                char* raw = (char*)mmap(0, total, PROT_READ | PROT_WRITE,
                                         MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
                if ((long)raw < 0) return false;
                if (raw == (char*)MAP_FAILED) return false;  /* not "< 0": see alloc() */

                for (unsigned long i = 0; i < count; i++) {
                    block_header* h = (block_header*)(raw + i * stride);