MediaTek Helio P23 (MT6763)

MT6763 (or Helio P23) is a mid-range ARMv8.0-A (64-bit) MediaTek SoC released in 2017.
== Devices ==
=== Helio P23 (MT6763V) ===
== Mainline fork ==
There is a mainline kernel fork on GitLab @ mtk-mainline/mt6763/linux where development is currently (2022-11-14 / v6.1-rc5) active.
== Booting ==
Currently this SoC can only boot with maxcpus=1 present in kernel cmdline; enabling SMP causes kernel panic and a huge amount of log spam.
== Early bringup ==
At the very start of MediaTek SoC mainline bringup to minimize variables you should boot with a minimal .config with either UART or simplefb earlycon setup and use a downstream DTB + DTBO combo, and yes you heard me right. This way we can find exactly what nodes the bootloader looks for (or needs to display things / have working buttons for fastboot etc. navigation before kernel loads) by the process of elimination by chunks of device tree nodes at a time from the known working downstream DTBs.
== DTBO ==
If your device has a dtbo partition like the Volla Phone (volla-yggdrasil) you'll have to figure out the bare minimum DTBO contents required to boot mainline with minimal DTS changes which typically consists of grabbing at least the gpio_init_default from the decompiled downstream /sys/firmware/fdt flattened DTB and making a minimal DTBO for usage with mainline.
To figure out the bare minimum DTBO contents follow a similar process to the early bringup steps but instead with the DTB that eventually gets used for mkdtboimg to create the flashable dtbo.img.
== Reserved memory ==
All mblock-* entries in downstream FDT /reserved-memory are automagically added by the bootloader and SHOULD NOT be reserved again in mainline DTS to avoid conflicting with the bootloader adding them.
As an example mblock-6-framebuffer @ 0x7dca0000 is ready to use for simplefb earlycon already!
== UART ==
UART output from the kernel can be enabled by setting CONFIG_SERIAL_8250_MT6577=y in your config and including earlycon=mtk8250,0x11002000 console=ttyS0,921600n1 on the cmdline.
== Minimal .config ==
A minimal kernel config you should get some output over UART with starts with a make allnoconfig and setting the following (via e.g. make menuconfig):
 CONFIG_ARCH_MEDIATEK=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
 CONFIG_SERIAL_8250_MT6577=y
 CONFIG_SERIAL_OF_PLATFORM=y
== simplefb earlycon ==
No UART? No problem (probably)! With a currently (2022-07-24) out-of-tree driver from Nergzd723 you can get very early logging from the kernel directly on the display framebuffer!
One change to the driver is required however, that patch sets the color_white alpha to 0 essentially making the text invisible:
 --- a/drivers/video/fbdev/earlycon.c
 +++ b/drivers/video/fbdev/earlycon.c
 @@ -107,7 +107,7 @@ static void simplefb_earlycon_scroll_up(void)
 static void simplefb_earlycon_write_char(u32 *dst, unsigned char c, unsigned int h)
 {
 	const u32 color_black = 0x00000000;
 -	const u32 color_white = 0x00ffffff; // a8r8g8b8
 +	const u32 color_white = 0xffffffff; // a8r8g8b8
 	const u8 *src;
 	int m, n, bytes;
 	u8 x;
Next simply enable the driver in your .config (along with the ones from MediaTek_Helio_P23_(MT6763)#Minimal .config section just above):
 CONFIG_FB_EARLY=y
Then just add earlycon=simplefb,0x7dca0000,<width>,<height> console=simplefb to your cmdline where <width> and <height> match your display resolution width and height respectively.
In case of Volla Phone (with display resolution of 1080x2340) this still resulted in garbled output on the display, try adding or subtracting from the width if this happens. The final earlycon value that worked was simplefb,0x7dca0000,1088,2340, so simply adding 8 to the width made it work as expected.
== Minimal DTS ==
Minimal "booting" devicetree (excluding potential DTBO requirements) should look something like this:
 /dts-v1/;
 
 / {
 	/* NOTE: if /model is defined the bootloader replaces it with "MT6763*" forcefully */
 
 	chosen {
 		/* /chosen/bootargs has to exist even if unused or bootloader will be unhappy */
 		bootargs = "";
 	};
 
 	/* /reserved-memory has to exist even if practically empty or bootloader will be unhappy */
 	reserved-memory {
 		#address-cells = <2>;
 		#size-cells = <2>;
 		ranges;
 	};
 };
== Mainline workflow ==
With UART hooked up simply plugging in USB as well powers on the device automatically. By pairing this with flashing using mtkclient you easily at any point after flashing power off the device by just unplugging the USB cable, and reboot it by plugging it in again.
To power off without flashing anything you can run e.g. mtk printgpt and unplug the device after successful execution of the command.
Letting the ATF (ARM Trusted Firmware) watchdog still strategically reboot the device automatically ~10 seconds after booting can also be helpful with the quick flash, test and repeat cycle while getting all the logs you'd want over UART; you can add initcall_blacklist=mtk_wdt_driver_init (CONFIG_MEDIATEK_WATCHDOG=y) or modprobe.blacklist=mtk_wdt (CONFIG_MEDIATEK_WATCHDOG=m) to cmdline to prevent loading the watchdog driver.
== Pending patches ==
# MediaTek Helio P23 (MT6763) SoC uses the MT6370 PMIC which there is a pending patch series for on the linux-mediatek mailing list that seems to include plenty of great functionality (yet to be tested on MT6763), CONFIG_MFD_MT6370 available in v6.1-rc1
# CPUXGPT timer patch, now in linux-next (might not actually be relevant? needs further confirmation)
== Relevant downstream sources ==
MT6356 PMIC dtsi for regulators
MT6356 PMIC battery fuel gauge driver
== Who's working on it ==
* User:Deathmist
* User:Cvbnm90i
* User:eriki73
== See also ==
*