diff --git a/Makefile b/Makefile index c5229b6449..a26a9e2803 100644 --- a/Makefile +++ b/Makefile @@ -17,22 +17,6 @@ noobs: amlpkg: ./scripts/image amlpkg -# legacy sequential build targets -system-st: - ./scripts/image_st - -release-st: - ./scripts/image_st release - -image-st: - ./scripts/image_st mkimage - -noobs-st: - ./scripts/image_st noobs - -amlpkg-st: - ./scripts/image_st amlpkg - clean: rm -rf $(BUILD_DIRS)/* $(BUILD_DIRS)/.stamps diff --git a/config/show_config b/config/show_config index c8d27265ea..d0ed8af74d 100644 --- a/config/show_config +++ b/config/show_config @@ -104,10 +104,6 @@ show_config() { config_message="$config_message\n - OEM Support:\t\t\t\t $OEM_SUPPORT" config_message="$config_message\n - Default ROOT Password:\t\t $ROOT_PASSWORD" config_message="$config_message\n - Bootloader:\t\t\t\t $BOOTLOADER" - if [ "$BOOTLOADER" = "u-boot" ]; then - config_message="$config_message\n - U-Boot configuration:\t\t $UBOOT_CONFIG" - config_message="$config_message\n - U-Boot config file:\t\t $UBOOT_CONFIGFILE" - fi config_message="$config_message\n - UDevil support:\t\t\t $UDEVIL" config_message="$config_message\n - Installer support:\t\t\t $INSTALLER_SUPPORT" for config_package in $ADDITIONAL_PACKAGES; do diff --git a/packages/databases/mariadb-connector-c/package.mk b/packages/databases/mariadb-connector-c/package.mk index f191780f68..2f0c31bd3a 100644 --- a/packages/databases/mariadb-connector-c/package.mk +++ b/packages/databases/mariadb-connector-c/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="mariadb-connector-c" -PKG_VERSION="3.1.0" -PKG_SHA256="feb82b124fd492264a07ca9618bf68d65487ec4a39c8375015f6b0f58c0ab17c" +PKG_VERSION="3.1.1" +PKG_SHA256="63a0ecfa3c87ba0361aef3b2c849abe280f7371030e84f41ce0dc4466db85637" PKG_LICENSE="LGPL" PKG_SITE="https://mariadb.org/" PKG_URL="https://github.com/MariaDB/mariadb-connector-c/archive/v$PKG_VERSION.tar.gz" diff --git a/packages/devel/binutils/package.mk b/packages/devel/binutils/package.mk index ea5f57e296..91a90e9227 100644 --- a/packages/devel/binutils/package.mk +++ b/packages/devel/binutils/package.mk @@ -66,10 +66,12 @@ make_target() { make configure-host make -C libiberty make -C bfd + make -C opcodes } makeinstall_target() { mkdir -p $SYSROOT_PREFIX/usr/lib cp libiberty/libiberty.a $SYSROOT_PREFIX/usr/lib make DESTDIR="$SYSROOT_PREFIX" -C bfd install + make DESTDIR="$SYSROOT_PREFIX" -C opcodes install } diff --git a/packages/graphics/libmali/package.mk b/packages/graphics/libmali/package.mk index cfcbd17abd..e8d4acf481 100644 --- a/packages/graphics/libmali/package.mk +++ b/packages/graphics/libmali/package.mk @@ -2,26 +2,42 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmali" -PKG_VERSION="ad56ed30985471c0950a654cc9db1e86310650d5" -PKG_SHA256="72438ea73cf6c2e8e770545872386b66ccad200c568261e5304845547099c9ed" +PKG_VERSION="4cbf211cfd9b07854aab4978e50b1151052c6d4c" +PKG_SHA256="d3c5dd43ee0830feada4a86d32b9c794cddab29a863dfd1dddb3954f380086c5" PKG_ARCH="arm aarch64" PKG_LICENSE="nonfree" PKG_SITE="https://github.com/LibreELEC/libmali" PKG_URL="https://github.com/LibreELEC/libmali/archive/$PKG_VERSION.tar.gz" PKG_LONGDESC="OpenGL ES user-space binary for the ARM Mali GPU family" +PKG_STAMP="$MALI_FAMILY" PKG_DEPENDS_TARGET="libdrm" -if [ "$MALI_FAMILY" = "t620" -o "$MALI_FAMILY" = "t720" -o "$MALI_FAMILY" = "g52" ]; then +if listcontains "$MALI_FAMILY" "(t620|t720)"; then PKG_DEPENDS_TARGET+=" wayland" fi -PKG_CMAKE_OPTS_TARGET="-DMALI_VARIANT=$MALI_FAMILY" - -if [ -n "$MALI_REVISION" ]; then - PKG_CMAKE_OPTS_TARGET+=" -DMALI_REVISION=$MALI_REVISION" +if [ "$LINUX" != "rockchip-4.4" ]; then + listcontains "$MALI_FAMILY" "4[0-9]+" && PKG_DEPENDS_TARGET+=" mali-utgard" + listcontains "$MALI_FAMILY" "t[0-9]+" && PKG_DEPENDS_TARGET+=" mali-midgard" + listcontains "$MALI_FAMILY" "g[0-9]+" && PKG_DEPENDS_TARGET+=" mali-bifrost" fi +PKG_CMAKE_OPTS_TARGET="-DMALI_VARIANT=${MALI_FAMILY// /;}" + if [ "$TARGET_ARCH" = "aarch64" ]; then PKG_CMAKE_OPTS_TARGET+=" -DMALI_ARCH=aarch64-linux-gnu" fi + +post_makeinstall_target() { + mkdir -p $INSTALL/usr/bin + cp -v $PKG_DIR/scripts/libmali-setup $INSTALL/usr/bin + + if [ $(ls -1q $INSTALL/usr/lib/libmali-*.so | wc -l) -gt 1 ]; then + ln -sfv /var/lib/libmali/libmali.so $INSTALL/usr/lib/libmali.so + fi +} + +post_install() { + enable_service libmali-setup.service +} diff --git a/packages/graphics/libmali/scripts/libmali-setup b/packages/graphics/libmali/scripts/libmali-setup new file mode 100755 index 0000000000..0061695cde --- /dev/null +++ b/packages/graphics/libmali/scripts/libmali-setup @@ -0,0 +1,44 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +GPUINFO=/sys/kernel/debug/mali/version +[ ! -f "$GPUINFO" ] && GPUINFO=$(find /sys/devices/platform -name gpuinfo) + +echo "GPUINFO: $GPUINFO" +[ ! -f "$GPUINFO" ] && exit + +GPU=$(cat $GPUINFO) +echo "GPU: $GPU" + +case $GPU in + Mali-400*) LIB="libmali-utgard-400-*.so" ;; + Mali-450*) LIB="libmali-utgard-450-*.so" ;; + Mali-T60x*) LIB="libmali-midgard-t60x-*.so" ;; + Mali-T62x*) LIB="libmali-midgard-t620-*.so" ;; + Mali-T72x*) LIB="libmali-midgard-t720-*.so" ;; + Mali-T76x*r0p0*) LIB="libmali-midgard-t76x-*-r0p0-*.so" ;; + Mali-T76x*r1p0*) LIB="libmali-midgard-t76x-*-r1p0-*.so" ;; + Mali-T82x*) LIB="libmali-midgard-t82x-*.so" ;; + Mali-T83x*) LIB="libmali-midgard-t83x-*.so" ;; + Mali-T86x*) LIB="libmali-midgard-t86x-*.so" ;; + Mali-T88x*) LIB="libmali-midgard-t88x-*.so" ;; + Mali-G31*) LIB="libmali-bifrost-g31-*.so" ;; + Mali-G51*) LIB="libmali-bifrost-g51-*.so" ;; + Mali-G52*) LIB="libmali-bifrost-g52-*.so" ;; + Mali-G71*) LIB="libmali-bifrost-g71-*.so" ;; + Mali-G72*) LIB="libmali-bifrost-g72-*.so" ;; + Mali-G76*) LIB="libmali-bifrost-g76-*.so" ;; +esac + +echo "LIB: $LIB" +[ -z "$LIB" ] && exit + +LIBMALI=$(find /usr/lib -name $LIB) + +echo "LIBMALI: $LIBMALI" +[ ! -f "$LIBMALI" ] && exit + +mkdir -p /var/lib/libmali +ln -sf $LIBMALI /var/lib/libmali/libmali.so diff --git a/packages/graphics/libmali/system.d/libmali-setup.service b/packages/graphics/libmali/system.d/libmali-setup.service new file mode 100644 index 0000000000..b1eb1b42d0 --- /dev/null +++ b/packages/graphics/libmali/system.d/libmali-setup.service @@ -0,0 +1,12 @@ +[Unit] +Description=Setup symlink for ARM Mali library +Before=graphical.target +After=multi-user.target + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/bin/libmali-setup + +[Install] +WantedBy=multi-user.target diff --git a/packages/linux-driver-addons/dvb/crazycat/package.mk b/packages/linux-driver-addons/dvb/crazycat/package.mk index b0c02b198b..8889791b6e 100644 --- a/packages/linux-driver-addons/dvb/crazycat/package.mk +++ b/packages/linux-driver-addons/dvb/crazycat/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="crazycat" -PKG_VERSION="c59ee3624b7f6bf5bdaeec7c73c69ef4938d3952" -PKG_SHA256="00b9fade221327e1aed8f06ef0477f2761b57cc5fe6310c4536e361b17a595d1" +PKG_VERSION="532599d255411a24f93b585a92b1b0c49e2012f7" +PKG_SHA256="0e3addc3562057a77edefdde0052a78aec145c4dd5b737b53dd25ce389b95093" PKG_LICENSE="GPL" PKG_SITE="https://bitbucket.org/CrazyCat/media_build" PKG_URL="https://bitbucket.org/CrazyCat/media_build/get/$PKG_VERSION.tar.gz" diff --git a/packages/linux-driver-addons/dvb/depends/media_tree/package.mk b/packages/linux-driver-addons/dvb/depends/media_tree/package.mk index ae3fd907a6..cb01052f26 100644 --- a/packages/linux-driver-addons/dvb/depends/media_tree/package.mk +++ b/packages/linux-driver-addons/dvb/depends/media_tree/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree" -PKG_VERSION="2019-01-10-15d90a6ae98e" -PKG_SHA256="cf170bfc0e78959c6b289db6f4cf7ec7b400dd4704f45909e1535a935702e8bc" +PKG_VERSION="2017-08-20-3b6471c7becd" +PKG_SHA256="7fa8d0be68991d1bc6a244888cf2308d2f6152748c1d417efa0784d101ba262b" PKG_LICENSE="GPL" PKG_SITE="https://git.linuxtv.org/media_tree.git" PKG_URL="http://linuxtv.org/downloads/drivers/linux-media-${PKG_VERSION}.tar.bz2" diff --git a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-hauppauge.patch b/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-hauppauge.patch index 21294e3191..458849c01b 100644 --- a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-hauppauge.patch +++ b/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-01-hauppauge.patch @@ -2,7 +2,7 @@ Combined patches from https://github.com/b-rad-NDi/Ubuntu-media-tree-kernel-buil to support all kind of Hauppauge DVB cards. diff --git a/drivers/media/dvb-frontends/lgdt3306a.c b/drivers/media/dvb-frontends/lgdt3306a.c -index 0e1f5da..409db8e 100644 +index 99c6289..ceaf617 100644 --- a/drivers/media/dvb-frontends/lgdt3306a.c +++ b/drivers/media/dvb-frontends/lgdt3306a.c @@ -855,6 +855,7 @@ static int lgdt3306a_fe_sleep(struct dvb_frontend *fe) @@ -48,7 +48,7 @@ index 0e1f5da..409db8e 100644 return ret; } diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c -index 324493e..4d43424 100644 +index 17301c6..9b021ac 100644 --- a/drivers/media/dvb-frontends/si2168.c +++ b/drivers/media/dvb-frontends/si2168.c @@ -18,6 +18,10 @@ @@ -420,7 +420,7 @@ index 324493e..4d43424 100644 cmd.wlen = 6; cmd.rlen = 4; ret = si2168_cmd_execute(client, &cmd); -@@ -714,6 +960,11 @@ static const struct dvb_frontend_ops si2168_ops = { +@@ -717,6 +963,11 @@ static const struct dvb_frontend_ops si2168_ops = { .set_frontend = si2168_set_frontend, .read_status = si2168_read_status, @@ -433,40 +433,30 @@ index 324493e..4d43424 100644 static int si2168_probe(struct i2c_client *client, diff --git a/drivers/media/i2c/cx25840/cx25840-core.c b/drivers/media/i2c/cx25840/cx25840-core.c -index b168bf3..1f06119 100644 +index f071a94..14ce009 100644 --- a/drivers/media/i2c/cx25840/cx25840-core.c +++ b/drivers/media/i2c/cx25840/cx25840-core.c -@@ -684,14 +684,14 @@ static void cx23885_initialize(struct i2c_client *client) - */ - cx25840_write4(client, 0x404, 0x0010253e); - -- /* CC on - Undocumented Register */ -+ /* CC on - VBI_LINE_CTRL3, FLD_VBI_MD_LINE12 */ - cx25840_write(client, state->vbi_regs_offset + 0x42f, 0x66); - - /* HVR-1250 / HVR1850 DIF related */ - /* Power everything up */ - cx25840_write4(client, 0x130, 0x0); - -- /* Undocumented */ -+ /* SRC_COMB_CFG */ - if (is_cx23888(state)) - cx25840_write4(client, 0x454, 0x6628021F); - else -@@ -1127,16 +1127,25 @@ static int set_input(struct i2c_client *client, enum cx25840_video_input vid_inp +@@ -1495,23 +1495,25 @@ static int set_input(struct i2c_client *client, cx25840_write4(client, 0x410, 0xffff0dbf); cx25840_write4(client, 0x414, 0x00137d03); -- cx25840_write4(client, state->vbi_regs_offset + 0x42c, 0x42600000); -- cx25840_write4(client, state->vbi_regs_offset + 0x430, 0x0000039b); -- cx25840_write4(client, state->vbi_regs_offset + 0x438, 0x00000000); -- -- cx25840_write4(client, state->vbi_regs_offset + 0x440, 0xF8E3E824); -- cx25840_write4(client, state->vbi_regs_offset + 0x444, 0x401040dc); -- cx25840_write4(client, state->vbi_regs_offset + 0x448, 0xcd3f02a0); -- cx25840_write4(client, state->vbi_regs_offset + 0x44c, 0x161f1000); -- cx25840_write4(client, state->vbi_regs_offset + 0x450, 0x00000802); +- cx25840_write4(client, state->vbi_regs_offset + 0x42c, +- 0x42600000); +- cx25840_write4(client, state->vbi_regs_offset + 0x430, +- 0x0000039b); +- cx25840_write4(client, state->vbi_regs_offset + 0x438, +- 0x00000000); - +- cx25840_write4(client, state->vbi_regs_offset + 0x440, +- 0xF8E3E824); +- cx25840_write4(client, state->vbi_regs_offset + 0x444, +- 0x401040dc); +- cx25840_write4(client, state->vbi_regs_offset + 0x448, +- 0xcd3f02a0); +- cx25840_write4(client, state->vbi_regs_offset + 0x44c, +- 0x161f1000); +- cx25840_write4(client, state->vbi_regs_offset + 0x450, +- 0x00000802); + /* These are not VBI controls */ + if (is_cx23888(state)) { + /* 888 MISC_TIM_CTRL */ @@ -486,17 +476,9 @@ index b168bf3..1f06119 100644 + /* 888 HTL_CTRL */ + cx25840_write4(client, 0x450, 0x00000802); + } + cx25840_write4(client, 0x91c, 0x01000000); cx25840_write4(client, 0x8e0, 0x03063870); - cx25840_write4(client, 0x8d4, 0x7FFF0024); -@@ -1743,6 +1752,7 @@ static int cx25840_s_stream(struct v4l2_subdev *sd, int enable) - if (is_cx2388x(state) || is_cx231xx(state)) - return 0; - -+ /* PIN_CTRL1 */ - if (enable) { - v = cx25840_read(client, 0x115) | 0x0c; - cx25840_write(client, 0x115, v); diff --git a/drivers/media/pci/cx23885/cx23885-cards.c b/drivers/media/pci/cx23885/cx23885-cards.c index ed3210d..9598b99 100644 --- a/drivers/media/pci/cx23885/cx23885-cards.c @@ -589,10 +571,10 @@ index ed3210d..9598b99 100644 .vmux = CX25840_VIN7_CH3 | CX25840_VIN4_CH2 | diff --git a/drivers/media/pci/cx23885/cx23885-dvb.c b/drivers/media/pci/cx23885/cx23885-dvb.c -index 0d0929c..0366c4d 100644 +index e2e63f0..aea7738 100644 --- a/drivers/media/pci/cx23885/cx23885-dvb.c +++ b/drivers/media/pci/cx23885/cx23885-dvb.c -@@ -2382,6 +2382,16 @@ static int dvb_register(struct cx23885_tsport *port) +@@ -2383,6 +2383,16 @@ static int dvb_register(struct cx23885_tsport *port) goto frontend_detach; } port->i2c_client_tuner = client_tuner; @@ -609,7 +591,7 @@ index 0d0929c..0366c4d 100644 break; /* port c - terrestrial/cable */ -@@ -2471,6 +2481,16 @@ static int dvb_register(struct cx23885_tsport *port) +@@ -2472,6 +2482,16 @@ static int dvb_register(struct cx23885_tsport *port) goto frontend_detach; } port->i2c_client_tuner = client_tuner; @@ -626,7 +608,7 @@ index 0d0929c..0366c4d 100644 break; /* port c - terrestrial/cable */ -@@ -2542,6 +2562,11 @@ static int dvb_register(struct cx23885_tsport *port) +@@ -2543,6 +2563,11 @@ static int dvb_register(struct cx23885_tsport *port) goto frontend_detach; } port->i2c_client_tuner = client_tuner; @@ -768,7 +750,7 @@ index 168178c..6d6e7fb 100644 break; default: diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c -index d389f1f..b93f333 100644 +index d389f1f..2563ab4 100644 --- a/drivers/media/tuners/si2157.c +++ b/drivers/media/tuners/si2157.c @@ -1,5 +1,5 @@ @@ -833,7 +815,25 @@ index d389f1f..b93f333 100644 /* power up */ if (dev->chiptype == SI2157_CHIPTYPE_SI2146) { memcpy(cmd.args, "\xc0\x05\x01\x00\x00\x0b\x00\x00\x01", 9); -@@ -230,6 +235,45 @@ skip_fw_download: +@@ -138,6 +143,7 @@ static int si2157_init(struct dvb_frontend *fe) + chip_id = cmd.args[1] << 24 | cmd.args[2] << 16 | cmd.args[3] << 8 | + cmd.args[4] << 0; + ++ #define SI2177_A30 ('A' << 24 | 77 << 16 | '3' << 8 | '0' << 0) + #define SI2158_A20 ('A' << 24 | 58 << 16 | '2' << 8 | '0' << 0) + #define SI2148_A20 ('A' << 24 | 48 << 16 | '2' << 8 | '0' << 0) + #define SI2157_A30 ('A' << 24 | 57 << 16 | '3' << 8 | '0' << 0) +@@ -153,6 +159,9 @@ static int si2157_init(struct dvb_frontend *fe) + case SI2141_A10: + fw_name = SI2141_A10_FIRMWARE; + break; ++ case SI2177_A30: ++ fw_name = SI2157_A30_FIRMWARE; ++ break; + case SI2157_A30: + case SI2147_A30: + case SI2146_A10: +@@ -230,6 +239,45 @@ skip_fw_download: dev_info(&client->dev, "firmware version: %c.%c.%d\n", cmd.args[6], cmd.args[7], cmd.args[8]); @@ -879,7 +879,7 @@ index d389f1f..b93f333 100644 warm: /* init statistics in order signal app which are supported */ c->strength.len = 1; -@@ -274,6 +318,84 @@ err: +@@ -274,6 +322,84 @@ err: return ret; } @@ -964,7 +964,7 @@ index d389f1f..b93f333 100644 static int si2157_set_params(struct dvb_frontend *fe) { struct i2c_client *client = fe->tuner_priv; -@@ -344,7 +466,7 @@ static int si2157_set_params(struct dvb_frontend *fe) +@@ -344,7 +470,7 @@ static int si2157_set_params(struct dvb_frontend *fe) if (ret) goto err; @@ -973,7 +973,7 @@ index d389f1f..b93f333 100644 if (if_frequency != dev->if_frequency) { memcpy(cmd.args, "\x14\x00\x06\x07", 4); cmd.args[4] = (if_frequency / 1000) & 0xff; -@@ -358,7 +480,7 @@ static int si2157_set_params(struct dvb_frontend *fe) +@@ -358,7 +484,7 @@ static int si2157_set_params(struct dvb_frontend *fe) dev->if_frequency = if_frequency; } @@ -982,7 +982,7 @@ index d389f1f..b93f333 100644 memcpy(cmd.args, "\x41\x00\x00\x00\x00\x00\x00\x00", 8); cmd.args[4] = (c->frequency >> 0) & 0xff; cmd.args[5] = (c->frequency >> 8) & 0xff; -@@ -370,24 +492,298 @@ static int si2157_set_params(struct dvb_frontend *fe) +@@ -370,24 +496,298 @@ static int si2157_set_params(struct dvb_frontend *fe) if (ret) goto err; @@ -991,15 +991,15 @@ index d389f1f..b93f333 100644 + + si2157_tune_wait(client, 1); /* wait to complete, ignore any errors */ + -+ return 0; -+err: + return 0; + err: + dev->bandwidth = 0; + dev->frequency = 0; + dev->if_frequency = 0; -+ dev_dbg(&client->dev, "failed=%d\n", ret); -+ return ret; -+} -+ + dev_dbg(&client->dev, "failed=%d\n", ret); + return ret; + } + +static int si2157_set_analog_params(struct dvb_frontend *fe, + struct analog_parameters *params) +{ @@ -1202,15 +1202,15 @@ index d389f1f..b93f333 100644 + + si2157_tune_wait(client, 0); /* wait to complete, ignore any errors */ + - return 0; - err: ++ return 0; ++err: + dev->bandwidth = 0; + dev->frequency = 0; + dev->if_frequency = 0; - dev_dbg(&client->dev, "failed=%d\n", ret); - return ret; - } - ++ dev_dbg(&client->dev, "failed=%d\n", ret); ++ return ret; ++} ++ +static int si2157_get_frequency(struct dvb_frontend *fe, u32 *frequency) +{ + struct i2c_client *client = fe->tuner_priv; @@ -1283,7 +1283,7 @@ index d389f1f..b93f333 100644 .frequency_min_hz = 42 * MHz, .frequency_max_hz = 870 * MHz, }, -@@ -395,7 +791,12 @@ static const struct dvb_tuner_ops si2157_ops = { +@@ -395,7 +795,12 @@ static const struct dvb_tuner_ops si2157_ops = { .init = si2157_init, .sleep = si2157_sleep, .set_params = si2157_set_params, @@ -1297,7 +1297,7 @@ index d389f1f..b93f333 100644 }; static void si2157_stat_work(struct work_struct *work) -@@ -455,7 +856,7 @@ static int si2157_probe(struct i2c_client *client, +@@ -455,7 +860,7 @@ static int si2157_probe(struct i2c_client *client, cmd.wlen = 0; cmd.rlen = 1; ret = si2157_cmd_execute(client, &cmd); @@ -1306,8 +1306,21 @@ index d389f1f..b93f333 100644 goto err_kfree; memcpy(&fe->ops.tuner_ops, &si2157_ops, sizeof(struct dvb_tuner_ops)); +@@ -529,6 +934,7 @@ static const struct i2c_device_id si2157_id_table[] = { + {"si2157", SI2157_CHIPTYPE_SI2157}, + {"si2146", SI2157_CHIPTYPE_SI2146}, + {"si2141", SI2157_CHIPTYPE_SI2141}, ++ {"si2177", SI2157_CHIPTYPE_SI2177}, + {} + }; + MODULE_DEVICE_TABLE(i2c, si2157_id_table); +@@ -550,3 +956,4 @@ MODULE_AUTHOR("Antti Palosaari "); + MODULE_LICENSE("GPL"); + MODULE_FIRMWARE(SI2158_A20_FIRMWARE); + MODULE_FIRMWARE(SI2141_A10_FIRMWARE); ++MODULE_FIRMWARE(SI2157_A30_FIRMWARE); diff --git a/drivers/media/tuners/si2157_priv.h b/drivers/media/tuners/si2157_priv.h -index 50f8630..1e5ce5b 100644 +index 50f8630..84ed808 100644 --- a/drivers/media/tuners/si2157_priv.h +++ b/drivers/media/tuners/si2157_priv.h @@ -37,6 +37,8 @@ struct si2157_dev { @@ -1319,11 +1332,26 @@ index 50f8630..1e5ce5b 100644 struct delayed_work stat_work; #if defined(CONFIG_MEDIA_CONTROLLER) +@@ -50,6 +52,7 @@ struct si2157_dev { + #define SI2157_CHIPTYPE_SI2157 0 + #define SI2157_CHIPTYPE_SI2146 1 + #define SI2157_CHIPTYPE_SI2141 2 ++#define SI2157_CHIPTYPE_SI2177 3 + + /* firmware command struct */ + #define SI2157_ARGLEN 30 +@@ -61,5 +64,5 @@ struct si2157_cmd { + + #define SI2158_A20_FIRMWARE "dvb-tuner-si2158-a20-01.fw" + #define SI2141_A10_FIRMWARE "dvb-tuner-si2141-a10-01.fw" +- ++#define SI2157_A30_FIRMWARE "dvb-tuner-si2157-a30-05.fw" + #endif diff --git a/drivers/media/usb/cx231xx/cx231xx-avcore.c b/drivers/media/usb/cx231xx/cx231xx-avcore.c -index fdd3c22..25aa7bb 100644 +index d417b5f..f575ae0 100644 --- a/drivers/media/usb/cx231xx/cx231xx-avcore.c +++ b/drivers/media/usb/cx231xx/cx231xx-avcore.c -@@ -599,14 +599,27 @@ int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input) +@@ -587,14 +587,27 @@ int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input) return status; } } @@ -1354,7 +1382,7 @@ index fdd3c22..25aa7bb 100644 break; default: -@@ -1205,12 +1218,22 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev, +@@ -1193,12 +1206,22 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev, cx231xx_set_field(FLD_SIF_EN, 0)); break; default: @@ -1381,10 +1409,10 @@ index fdd3c22..25aa7bb 100644 break; diff --git a/drivers/media/usb/cx231xx/cx231xx-video.c b/drivers/media/usb/cx231xx/cx231xx-video.c -index 0d451c4..d5e51a5 100644 +index f882047..77c118b 100644 --- a/drivers/media/usb/cx231xx/cx231xx-video.c +++ b/drivers/media/usb/cx231xx/cx231xx-video.c -@@ -1293,7 +1293,7 @@ int cx231xx_s_frequency(struct file *file, void *priv, +@@ -1281,7 +1281,7 @@ int cx231xx_s_frequency(struct file *file, void *priv, struct cx231xx_fh *fh = priv; struct cx231xx *dev = fh->dev; struct v4l2_frequency new_freq = *f; @@ -1393,7 +1421,7 @@ index 0d451c4..d5e51a5 100644 u32 if_frequency = 5400000; dev_dbg(dev->dev, -@@ -1310,14 +1310,30 @@ int cx231xx_s_frequency(struct file *file, void *priv, +@@ -1298,14 +1298,30 @@ int cx231xx_s_frequency(struct file *file, void *priv, /* set pre channel change settings in DIF first */ rc = cx231xx_tuner_pre_channel_change(dev); @@ -1428,7 +1456,7 @@ index 0d451c4..d5e51a5 100644 if (dev->norm & (V4L2_STD_MN | V4L2_STD_NTSC_443)) if_frequency = 5400000; /*5.4MHz */ else if (dev->norm & V4L2_STD_B) -@@ -1584,8 +1600,19 @@ int cx231xx_querycap(struct file *file, void *priv, +@@ -1572,8 +1588,19 @@ int cx231xx_querycap(struct file *file, void *priv, else cap->device_caps |= V4L2_CAP_VIDEO_CAPTURE; } @@ -1449,7 +1477,7 @@ index 0d451c4..d5e51a5 100644 cap->capabilities = cap->device_caps | V4L2_CAP_READWRITE | V4L2_CAP_VBI_CAPTURE | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS; -@@ -2191,10 +2218,20 @@ static void cx231xx_vdev_init(struct cx231xx *dev, +@@ -2179,10 +2206,20 @@ static void cx231xx_vdev_init(struct cx231xx *dev, video_set_drvdata(vfd, dev); if (dev->tuner_type == TUNER_ABSENT) { @@ -1474,6 +1502,582 @@ index 0d451c4..d5e51a5 100644 } } +diff --git a/drivers/media/usb/pvrusb2/Kconfig b/drivers/media/usb/pvrusb2/Kconfig +index 64f9df0..e6a4f73 100644 +--- a/drivers/media/usb/pvrusb2/Kconfig ++++ b/drivers/media/usb/pvrusb2/Kconfig +@@ -41,6 +41,8 @@ config VIDEO_PVRUSB2_DVB + select DVB_S5H1409 if MEDIA_SUBDRV_AUTOSELECT + select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT + select DVB_TDA10048 if MEDIA_SUBDRV_AUTOSELECT ++ select DVB_LGDT3306A if MEDIA_SUBDRV_AUTOSELECT ++ select DVB_SI2168 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_SIMPLE if MEDIA_SUBDRV_AUTOSELECT + select MEDIA_TUNER_TDA8290 if MEDIA_SUBDRV_AUTOSELECT +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.c b/drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.c +index d5bec0f..36016ab 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-cx2584x-v4l.c +@@ -111,10 +111,35 @@ static const struct routing_scheme routing_defav400 = { + .cnt = ARRAY_SIZE(routing_schemeav400), + }; + ++static const struct routing_scheme_item routing_scheme160xxx[] = { ++ [PVR2_CVAL_INPUT_TV] = { ++ .vid = CX25840_COMPOSITE7, ++ .aud = CX25840_AUDIO8, ++ }, ++ [PVR2_CVAL_INPUT_RADIO] = { ++ .vid = CX25840_COMPOSITE4, ++ .aud = CX25840_AUDIO6, ++ }, ++ [PVR2_CVAL_INPUT_COMPOSITE] = { ++ .vid = CX25840_COMPOSITE3, ++ .aud = CX25840_AUDIO_SERIAL, ++ }, ++ [PVR2_CVAL_INPUT_SVIDEO] = { ++ .vid = CX25840_SVIDEO1, ++ .aud = CX25840_AUDIO_SERIAL, ++ }, ++}; ++ ++static const struct routing_scheme routing_def160xxx = { ++ .def = routing_scheme160xxx, ++ .cnt = ARRAY_SIZE(routing_scheme160xxx), ++}; ++ + static const struct routing_scheme *routing_schemes[] = { + [PVR2_ROUTING_SCHEME_HAUPPAUGE] = &routing_def0, + [PVR2_ROUTING_SCHEME_GOTVIEW] = &routing_defgv, + [PVR2_ROUTING_SCHEME_AV400] = &routing_defav400, ++ [PVR2_ROUTING_SCHEME_HAUP160XXX] = &routing_def160xxx, + }; + + void pvr2_cx25840_subdev_update(struct pvr2_hdw *hdw, struct v4l2_subdev *sd) +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-devattr.c b/drivers/media/usb/pvrusb2/pvrusb2-devattr.c +index 06de1c8..97b4fc8 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-devattr.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-devattr.c +@@ -37,6 +37,9 @@ pvr2_device_desc structures. + #include "tda18271.h" + #include "tda8290.h" + #include "tuner-simple.h" ++#include "si2157.h" ++#include "lgdt3306a.h" ++#include "si2168.h" + #endif + + +@@ -188,10 +191,10 @@ static struct lgdt330x_config pvr2_lgdt3303_config = { + + static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap) + { +- adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config, +- 0x0e, +- &adap->channel.hdw->i2c_adap); +- if (adap->fe) ++ adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3303_config, ++ 0x0e, ++ &adap->channel.hdw->i2c_adap); ++ if (adap->fe[0]) + return 0; + + return -EIO; +@@ -199,7 +202,7 @@ static int pvr2_lgdt3303_attach(struct pvr2_dvb_adapter *adap) + + static int pvr2_lgh06xf_attach(struct pvr2_dvb_adapter *adap) + { +- dvb_attach(simple_tuner_attach, adap->fe, ++ dvb_attach(simple_tuner_attach, adap->fe[0], + &adap->channel.hdw->i2c_adap, 0x61, + TUNER_LG_TDVS_H06XF); + +@@ -248,10 +251,10 @@ static struct lgdt330x_config pvr2_lgdt3302_config = { + + static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap) + { +- adap->fe = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config, ++ adap->fe[0] = dvb_attach(lgdt330x_attach, &pvr2_lgdt3302_config, + 0x0e, + &adap->channel.hdw->i2c_adap); +- if (adap->fe) ++ if (adap->fe[0]) + return 0; + + return -EIO; +@@ -259,7 +262,7 @@ static int pvr2_lgdt3302_attach(struct pvr2_dvb_adapter *adap) + + static int pvr2_fcv1236d_attach(struct pvr2_dvb_adapter *adap) + { +- dvb_attach(simple_tuner_attach, adap->fe, ++ dvb_attach(simple_tuner_attach, adap->fe[0], + &adap->channel.hdw->i2c_adap, 0x61, + TUNER_PHILIPS_FCV1236D); + +@@ -335,9 +338,9 @@ static struct tda18271_config hauppauge_tda18271_dvb_config = { + + static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap) + { +- adap->fe = dvb_attach(tda10048_attach, &hauppauge_tda10048_config, ++ adap->fe[0] = dvb_attach(tda10048_attach, &hauppauge_tda10048_config, + &adap->channel.hdw->i2c_adap); +- if (adap->fe) ++ if (adap->fe[0]) + return 0; + + return -EIO; +@@ -345,10 +348,10 @@ static int pvr2_tda10048_attach(struct pvr2_dvb_adapter *adap) + + static int pvr2_73xxx_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) + { +- dvb_attach(tda829x_attach, adap->fe, ++ dvb_attach(tda829x_attach, adap->fe[0], + &adap->channel.hdw->i2c_adap, 0x42, + &tda829x_no_probe); +- dvb_attach(tda18271_attach, adap->fe, 0x60, ++ dvb_attach(tda18271_attach, adap->fe[0], 0x60, + &adap->channel.hdw->i2c_adap, + &hauppauge_tda18271_dvb_config); + +@@ -433,9 +436,9 @@ static struct tda18271_config hauppauge_tda18271_config = { + + static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap) + { +- adap->fe = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config, ++ adap->fe[0] = dvb_attach(s5h1409_attach, &pvr2_s5h1409_config, + &adap->channel.hdw->i2c_adap); +- if (adap->fe) ++ if (adap->fe[0]) + return 0; + + return -EIO; +@@ -443,9 +446,9 @@ static int pvr2_s5h1409_attach(struct pvr2_dvb_adapter *adap) + + static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap) + { +- adap->fe = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config, ++ adap->fe[0] = dvb_attach(s5h1411_attach, &pvr2_s5h1411_config, + &adap->channel.hdw->i2c_adap); +- if (adap->fe) ++ if (adap->fe[0]) + return 0; + + return -EIO; +@@ -453,10 +456,10 @@ static int pvr2_s5h1411_attach(struct pvr2_dvb_adapter *adap) + + static int pvr2_tda18271_8295_attach(struct pvr2_dvb_adapter *adap) + { +- dvb_attach(tda829x_attach, adap->fe, ++ dvb_attach(tda829x_attach, adap->fe[0], + &adap->channel.hdw->i2c_adap, 0x42, + &tda829x_no_probe); +- dvb_attach(tda18271_attach, adap->fe, 0x60, ++ dvb_attach(tda18271_attach, adap->fe[0], 0x60, + &adap->channel.hdw->i2c_adap, + &hauppauge_tda18271_config); + +@@ -525,7 +528,164 @@ static const struct pvr2_device_desc pvr2_device_751xx = { + #endif + }; + ++/*------------------------------------------------------------------------*/ ++/* Hauppauge PVR-USB2 Model 160000 / 160111 -- HVR-1955 / HVR-1975 */ ++ ++#ifdef CONFIG_VIDEO_PVRUSB2_DVB ++static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap); ++static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap); ++static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap); ++static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap); ++ ++static const struct pvr2_dvb_props pvr2_160000_dvb_props = { ++ .frontend_attach = pvr2_dual_fe_attach, ++ .tuner_attach = pvr2_si2157_attach, ++}; ++static const struct pvr2_dvb_props pvr2_160111_dvb_props = { ++ .frontend_attach = pvr2_lgdt3306a_attach, ++ .tuner_attach = pvr2_si2157_attach, ++}; ++ ++static int pvr2_si2157_attach(struct pvr2_dvb_adapter *adap) ++{ ++ struct si2157_config si2157_config = {}; ++ ++ si2157_config.inversion = 1; ++ si2157_config.fe = adap->fe[0]; ++ ++ adap->i2c_client_tuner = dvb_module_probe("si2157", "si2177", ++ &adap->channel.hdw->i2c_adap, ++ 0x60, &si2157_config); ++ ++ if (!adap->i2c_client_tuner) ++ return -ENODEV; ++ ++ return 0; ++} ++ ++static int pvr2_si2168_attach(struct pvr2_dvb_adapter *adap) ++{ ++ struct si2168_config si2168_config = {}; ++ struct i2c_adapter *adapter; ++ ++ pr_debug("%s()\n", __func__); ++ ++ si2168_config.fe = &adap->fe[1]; ++ si2168_config.i2c_adapter = &adapter; ++ si2168_config.ts_mode = SI2168_TS_PARALLEL; /*2, 1-serial, 2-parallel.*/ ++ si2168_config.ts_clock_gapped = 1; /*0-disabled, 1-enabled.*/ ++ si2168_config.ts_clock_inv = 0; /*0-not-invert, 1-invert*/ ++ si2168_config.spectral_inversion = 1; /*0-not-invert, 1-invert*/ ++ ++ adap->i2c_client_demod[1] = dvb_module_probe("si2168", NULL, ++ &adap->channel.hdw->i2c_adap, ++ 0x64, &si2168_config); ++ ++ if (!adap->i2c_client_demod[1]) ++ return -ENODEV; ++ ++ return 0; ++} ++ ++static int pvr2_lgdt3306a_attach(struct pvr2_dvb_adapter *adap) ++{ ++ struct lgdt3306a_config lgdt3306a_config; ++ struct i2c_adapter *adapter; ++ ++ pr_debug("%s()\n", __func__); ++ ++ lgdt3306a_config.fe = &adap->fe[0]; ++ lgdt3306a_config.i2c_adapter = &adapter; ++ lgdt3306a_config.deny_i2c_rptr = 1; ++ lgdt3306a_config.spectral_inversion = 1; ++ lgdt3306a_config.qam_if_khz = 4000; ++ lgdt3306a_config.vsb_if_khz = 3250; ++ lgdt3306a_config.mpeg_mode = LGDT3306A_MPEG_PARALLEL; ++ lgdt3306a_config.tpclk_edge = LGDT3306A_TPCLK_FALLING_EDGE; ++ lgdt3306a_config.tpvalid_polarity = LGDT3306A_TP_VALID_LOW; ++ lgdt3306a_config.xtalMHz = 25, /* demod clock MHz; 24/25 supported */ ++ ++ adap->i2c_client_demod[0] = dvb_module_probe("lgdt3306a", NULL, ++ &adap->channel.hdw->i2c_adap, ++ 0x59, &lgdt3306a_config); ++ ++ if (!adap->i2c_client_demod[0]) ++ return -ENODEV; ++ ++ return 0; ++} ++ ++static int pvr2_dual_fe_attach(struct pvr2_dvb_adapter *adap) ++{ ++ pr_debug("%s()\n", __func__); ++ ++ if (pvr2_lgdt3306a_attach(adap) != 0) ++ return -ENODEV; ++ ++ if (pvr2_si2168_attach(adap) != 0) { ++ dvb_module_release(adap->i2c_client_demod[0]); ++ return -ENODEV; ++ } + ++ return 0; ++} ++#endif ++ ++#define PVR2_FIRMWARE_160xxx "v4l-pvrusb2-160xxx-01.fw" ++static const char *pvr2_fw1_names_160xxx[] = { ++ PVR2_FIRMWARE_160xxx, ++}; ++ ++static const struct pvr2_device_client_desc pvr2_cli_160xxx[] = { ++ { .module_id = PVR2_CLIENT_ID_CX25840 }, ++}; ++ ++static const struct pvr2_device_desc pvr2_device_160000 = { ++ .description = "WinTV HVR-1975 Model 160000", ++ .shortname = "160000", ++ .client_table.lst = pvr2_cli_160xxx, ++ .client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx), ++ .fx2_firmware.lst = pvr2_fw1_names_160xxx, ++ .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx), ++ .default_tuner_type = TUNER_ABSENT, ++ .flag_has_cx25840 = !0, ++ .flag_has_hauppauge_rom = !0, ++ .flag_has_analogtuner = !0, ++ .flag_has_composite = !0, ++ .flag_has_svideo = !0, ++ .flag_fx2_16kb = !0, ++ .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, ++ .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, ++ .default_std_mask = V4L2_STD_NTSC_M, ++ .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, ++ .ir_scheme = PVR2_IR_SCHEME_ZILOG, ++#ifdef CONFIG_VIDEO_PVRUSB2_DVB ++ .dvb_props = &pvr2_160000_dvb_props, ++#endif ++}; ++static const struct pvr2_device_desc pvr2_device_160111 = { ++ .description = "WinTV HVR-1955 Model 160111", ++ .shortname = "160111", ++ .client_table.lst = pvr2_cli_160xxx, ++ .client_table.cnt = ARRAY_SIZE(pvr2_cli_160xxx), ++ .fx2_firmware.lst = pvr2_fw1_names_160xxx, ++ .fx2_firmware.cnt = ARRAY_SIZE(pvr2_fw1_names_160xxx), ++ .default_tuner_type = TUNER_ABSENT, ++ .flag_has_cx25840 = !0, ++ .flag_has_hauppauge_rom = !0, ++ .flag_has_analogtuner = !0, ++ .flag_has_composite = !0, ++ .flag_has_svideo = !0, ++ .flag_fx2_16kb = !0, ++ .signal_routing_scheme = PVR2_ROUTING_SCHEME_HAUPPAUGE, ++ .digital_control_scheme = PVR2_DIGITAL_SCHEME_HAUPPAUGE, ++ .default_std_mask = V4L2_STD_NTSC_M, ++ .led_scheme = PVR2_LED_SCHEME_HAUPPAUGE, ++ .ir_scheme = PVR2_IR_SCHEME_ZILOG, ++#ifdef CONFIG_VIDEO_PVRUSB2_DVB ++ .dvb_props = &pvr2_160111_dvb_props, ++#endif ++}; + + /*------------------------------------------------------------------------*/ + +@@ -552,6 +712,10 @@ struct usb_device_id pvr2_device_table[] = { + .driver_info = (kernel_ulong_t)&pvr2_device_751xx}, + { USB_DEVICE(0x0ccd, 0x0039), + .driver_info = (kernel_ulong_t)&pvr2_device_av400}, ++ { USB_DEVICE(0x2040, 0x7502), ++ .driver_info = (kernel_ulong_t)&pvr2_device_160111}, ++ { USB_DEVICE(0x2040, 0x7510), ++ .driver_info = (kernel_ulong_t)&pvr2_device_160000}, + { } + }; + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-devattr.h b/drivers/media/usb/pvrusb2/pvrusb2-devattr.h +index c1e7d48..ea0b2bf 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-devattr.h ++++ b/drivers/media/usb/pvrusb2/pvrusb2-devattr.h +@@ -66,6 +66,7 @@ struct pvr2_string_table { + #define PVR2_ROUTING_SCHEME_GOTVIEW 1 + #define PVR2_ROUTING_SCHEME_ONAIR 2 + #define PVR2_ROUTING_SCHEME_AV400 3 ++#define PVR2_ROUTING_SCHEME_HAUP160XXX 4 + + #define PVR2_DIGITAL_SCHEME_NONE 0 + #define PVR2_DIGITAL_SCHEME_HAUPPAUGE 1 +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-dvb.c b/drivers/media/usb/pvrusb2/pvrusb2-dvb.c +index 4b32b21..8f492ec 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-dvb.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-dvb.c +@@ -343,26 +343,19 @@ static int pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap) + goto done; + } + +- if ((dvb_props->frontend_attach(adap) == 0) && (adap->fe)) { +- +- if (dvb_register_frontend(&adap->dvb_adap, adap->fe)) { ++ if (dvb_props->frontend_attach(adap) == 0 && adap->fe[0]) { ++ if (dvb_register_frontend(&adap->dvb_adap, adap->fe[0])) { + pvr2_trace(PVR2_TRACE_ERROR_LEGS, + "frontend registration failed!"); +- dvb_frontend_detach(adap->fe); +- adap->fe = NULL; + ret = -ENODEV; +- goto done; ++ goto fail_frontend0; + } ++ if (adap->fe[0]->ops.analog_ops.standby) ++ adap->fe[0]->ops.analog_ops.standby(adap->fe[0]); + +- if (dvb_props->tuner_attach) +- dvb_props->tuner_attach(adap); +- +- if (adap->fe->ops.analog_ops.standby) +- adap->fe->ops.analog_ops.standby(adap->fe); +- +- /* Ensure all frontends negotiate bus access */ +- adap->fe->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl; +- ++ pvr2_trace(PVR2_TRACE_INFO, "transferring fe[%d] ts_bus_ctrl() to pvr2_dvb_bus_ctrl()", ++ adap->fe[0]->id); ++ adap->fe[0]->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl; + } else { + pvr2_trace(PVR2_TRACE_ERROR_LEGS, + "no frontend was attached!"); +@@ -370,17 +363,74 @@ static int pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap) + return ret; + } + +- done: ++ if (dvb_props->tuner_attach && dvb_props->tuner_attach(adap)) { ++ pvr2_trace(PVR2_TRACE_ERROR_LEGS, "tuner attach failed"); ++ ret = -ENODEV; ++ goto fail_tuner; ++ } ++ ++ if (adap->fe[1]) { ++ adap->fe[1]->id = 1; ++ adap->fe[1]->tuner_priv = adap->fe[0]->tuner_priv; ++ memcpy(&adap->fe[1]->ops.tuner_ops, ++ &adap->fe[0]->ops.tuner_ops, ++ sizeof(struct dvb_tuner_ops)); ++ ++ if (dvb_register_frontend(&adap->dvb_adap, adap->fe[1])) { ++ pvr2_trace(PVR2_TRACE_ERROR_LEGS, ++ "frontend registration failed!"); ++ ret = -ENODEV; ++ goto fail_frontend1; ++ } ++ /* MFE lock */ ++ adap->dvb_adap.mfe_shared = 1; ++ ++ if (adap->fe[1]->ops.analog_ops.standby) ++ adap->fe[1]->ops.analog_ops.standby(adap->fe[1]); ++ ++ pvr2_trace(PVR2_TRACE_INFO, "transferring fe[%d] ts_bus_ctrl() to pvr2_dvb_bus_ctrl()", ++ adap->fe[1]->id); ++ adap->fe[1]->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl; ++ } ++done: + pvr2_channel_limit_inputs(&adap->channel, 0); + return ret; ++ ++fail_frontend1: ++ dvb_frontend_detach(adap->fe[1]); ++ adap->fe[1] = NULL; ++fail_tuner: ++ dvb_unregister_frontend(adap->fe[0]); ++fail_frontend0: ++ dvb_frontend_detach(adap->fe[0]); ++ adap->fe[0] = NULL; ++ dvb_module_release(adap->i2c_client_tuner); ++ dvb_module_release(adap->i2c_client_demod[1]); ++ dvb_module_release(adap->i2c_client_demod[0]); ++ ++ return ret; + } + + static int pvr2_dvb_frontend_exit(struct pvr2_dvb_adapter *adap) + { +- if (adap->fe != NULL) { +- dvb_unregister_frontend(adap->fe); +- dvb_frontend_detach(adap->fe); ++ if (adap->fe[1]) { ++ dvb_unregister_frontend(adap->fe[1]); ++ dvb_frontend_detach(adap->fe[1]); ++ adap->fe[1] = NULL; ++ } ++ if (adap->fe[0]) { ++ dvb_unregister_frontend(adap->fe[0]); ++ dvb_frontend_detach(adap->fe[0]); ++ adap->fe[0] = NULL; + } ++ ++ dvb_module_release(adap->i2c_client_tuner); ++ adap->i2c_client_tuner = NULL; ++ dvb_module_release(adap->i2c_client_demod[1]); ++ adap->i2c_client_demod[1] = NULL; ++ dvb_module_release(adap->i2c_client_demod[0]); ++ adap->i2c_client_demod[0] = NULL; ++ + return 0; + } + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-dvb.h b/drivers/media/usb/pvrusb2/pvrusb2-dvb.h +index e7f71fb..c0b27f5 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-dvb.h ++++ b/drivers/media/usb/pvrusb2/pvrusb2-dvb.h +@@ -18,7 +18,10 @@ struct pvr2_dvb_adapter { + struct dmxdev dmxdev; + struct dvb_demux demux; + struct dvb_net dvb_net; +- struct dvb_frontend *fe; ++ struct dvb_frontend *fe[2]; ++ ++ struct i2c_client *i2c_client_demod[2]; ++ struct i2c_client *i2c_client_tuner; + + int feedcount; + int max_feed_count; +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-fx2-cmd.h b/drivers/media/usb/pvrusb2/pvrusb2-fx2-cmd.h +index 0a01de4..640b033 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-fx2-cmd.h ++++ b/drivers/media/usb/pvrusb2/pvrusb2-fx2-cmd.h +@@ -38,6 +38,10 @@ + + #define FX2CMD_FWPOST1 0x52u + ++/* These 2 only exist on Model 160xxx */ ++#define FX2CMD_HCW_DEMOD_RESET_PIN 0xd4u ++#define FX2CMD_HCW_MAKO_SLEEP_PIN 0xd5u ++ + #define FX2CMD_POWER_OFF 0xdcu + #define FX2CMD_POWER_ON 0xdeu + +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +index 1914391..63916ca 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +@@ -316,6 +316,8 @@ static const struct pvr2_fx2cmd_descdef pvr2_fx2cmd_desc[] = { + {FX2CMD_ONAIR_DTV_STREAMING_OFF, "onair dtv stream off"}, + {FX2CMD_ONAIR_DTV_POWER_ON, "onair dtv power on"}, + {FX2CMD_ONAIR_DTV_POWER_OFF, "onair dtv power off"}, ++ {FX2CMD_HCW_DEMOD_RESET_PIN, "hcw demod reset pin"}, ++ {FX2CMD_HCW_MAKO_SLEEP_PIN, "hcw mako sleep pin"}, + }; + + +@@ -2139,10 +2141,28 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw) + ((0) << 16)); + } + +- // This step MUST happen after the earlier powerup step. ++ /* This step MUST happen after the earlier powerup step */ + pvr2_i2c_core_init(hdw); + if (!pvr2_hdw_dev_ok(hdw)) return; + ++ /* Reset demod only on Hauppauge 160xxx platform */ ++ if (hdw->usb_dev->descriptor.idVendor == 0x2040 && ++ (hdw->usb_dev->descriptor.idProduct == 0x7502 || ++ hdw->usb_dev->descriptor.idProduct == 0x7510)) { ++ pr_info("%s(): resetting 160xxx demod\n", __func__); ++ /* TODO: not sure this is proper place to reset once only */ ++ pvr2_issue_simple_cmd(hdw, ++ FX2CMD_HCW_DEMOD_RESET_PIN | ++ (1 << 8) | ++ ((0) << 16)); ++ msleep(10); ++ pvr2_issue_simple_cmd(hdw, ++ FX2CMD_HCW_DEMOD_RESET_PIN | ++ (1 << 8) | ++ ((1) << 16)); ++ msleep(10); ++ } ++ + pvr2_hdw_load_modules(hdw); + if (!pvr2_hdw_dev_ok(hdw)) return; + +@@ -4012,6 +4032,20 @@ int pvr2_hdw_cmd_decoder_reset(struct pvr2_hdw *hdw) + static int pvr2_hdw_cmd_hcw_demod_reset(struct pvr2_hdw *hdw, int onoff) + { + hdw->flag_ok = !0; ++ ++ /* Use this for Hauppauge 160xxx only */ ++ if (hdw->usb_dev->descriptor.idVendor == 0x2040 && ++ (hdw->usb_dev->descriptor.idProduct == 0x7502 || ++ hdw->usb_dev->descriptor.idProduct == 0x7510)) { ++ pr_debug("%s(): resetting demod on Hauppauge 160xxx platform skipped\n", ++ __func__); ++ /* Can't reset 160xxx or it will trash Demod tristate */ ++ return pvr2_issue_simple_cmd(hdw, ++ FX2CMD_HCW_MAKO_SLEEP_PIN | ++ (1 << 8) | ++ ((onoff ? 1 : 0) << 16)); ++ } ++ + return pvr2_issue_simple_cmd(hdw, + FX2CMD_HCW_DEMOD_RESETIN | + (1 << 8) | -- 2.17.1 diff --git a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-02-add-t230c2.patch b/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-02-add-t230c2.patch deleted file mode 100644 index c67b37845a..0000000000 --- a/packages/linux-driver-addons/dvb/depends/media_tree/patches/media_tree-02-add-t230c2.patch +++ /dev/null @@ -1,217 +0,0 @@ -From: Thomas Hollstegge -[v3] media: dvbsky: Add support for MyGica T230C v2 -https://lore.kernel.org/patchwork/cover/904817/ - -diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c -index 4d43424..3402b96 100644 ---- a/drivers/media/dvb-frontends/si2168.c -+++ b/drivers/media/dvb-frontends/si2168.c -@@ -96,13 +96,15 @@ static int si2168_ts_bus_ctrl(struct dvb_frontend *fe, int acquire) - dev_dbg(&client->dev, "%s acquire: %d\n", __func__, acquire); - - /* set TS_MODE property */ -- memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6); -+ memcpy(cmd.args, "\x14\x00\x01\x10\x00\x00", 6); - if (acquire) - cmd.args[4] |= dev->ts_mode; - else - cmd.args[4] |= SI2168_TS_TRISTATE; - if (dev->ts_clock_gapped) - cmd.args[4] |= 0x40; -+ cmd.args[4] |= (dev->ts_clock_mode & 0x03) << 4; -+ - cmd.wlen = 6; - cmd.rlen = 4; - ret = si2168_cmd_execute(client, &cmd); -@@ -644,6 +646,18 @@ static int si2168_set_frontend(struct dvb_frontend *fe) - if (ret) - goto err; - -+ /* set TS frequency */ -+ if (dev->ts_clock_freq) { -+ memcpy(cmd.args, "\x14\x00\x0d\x10", 4); -+ cmd.args[4] = ((dev->ts_clock_freq / 10000) >> 0) & 0xff; -+ cmd.args[5] = ((dev->ts_clock_freq / 10000) >> 8) & 0xff; -+ cmd.wlen = 6; -+ cmd.rlen = 4; -+ ret = si2168_cmd_execute(client, &cmd); -+ if (ret) -+ goto err; -+ } -+ - memcpy(cmd.args, "\x14\x00\x08\x10\xd7\x05", 6); - cmd.args[5] |= dev->ts_clock_inv ? 0x00 : 0x10; - cmd.wlen = 6; -@@ -1057,6 +1071,10 @@ static int si2168_probe(struct i2c_client *client, - dev->ts_mode = config->ts_mode; - dev->ts_clock_inv = config->ts_clock_inv; - dev->ts_clock_gapped = config->ts_clock_gapped; -+ dev->ts_clock_mode = config->ts_clock_mode; -+ if (dev->ts_clock_mode == 0) -+ dev->ts_clock_mode = SI2168_TS_CLOCK_MODE_AUTO_ADAPT; -+ dev->ts_clock_freq = config->ts_clock_freq; - dev->spectral_inversion = config->spectral_inversion; - - dev_info(&client->dev, "Silicon Labs Si2168-%c%d%d successfully identified\n", -diff --git a/drivers/media/dvb-frontends/si2168.h b/drivers/media/dvb-frontends/si2168.h -index d519edd..3f52ee8 100644 ---- a/drivers/media/dvb-frontends/si2168.h -+++ b/drivers/media/dvb-frontends/si2168.h -@@ -47,6 +47,14 @@ struct si2168_config { - /* TS clock gapped */ - bool ts_clock_gapped; - -+ /* TS clock mode */ -+#define SI2168_TS_CLOCK_MODE_AUTO_ADAPT 0x01 -+#define SI2168_TS_CLOCK_MODE_MANUAL 0x02 -+ u8 ts_clock_mode; -+ -+ /* TS clock frequency (for manual mode) */ -+ u32 ts_clock_freq; -+ - /* Inverted spectrum */ - bool spectral_inversion; - }; -diff --git a/drivers/media/dvb-frontends/si2168_priv.h b/drivers/media/dvb-frontends/si2168_priv.h -index 2d362e1..8173d6c 100644 ---- a/drivers/media/dvb-frontends/si2168_priv.h -+++ b/drivers/media/dvb-frontends/si2168_priv.h -@@ -48,6 +48,8 @@ struct si2168_dev { - u8 ts_mode; - bool ts_clock_inv; - bool ts_clock_gapped; -+ u8 ts_clock_mode; -+ u32 ts_clock_freq; - bool spectral_inversion; - }; - -diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c -index e28bd88..4a4c6ae 100644 ---- a/drivers/media/usb/dvb-usb-v2/dvbsky.c -+++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c -@@ -583,6 +583,66 @@ static int dvbsky_mygica_t230c_attach(struct dvb_usb_adapter *adap) - return 0; - } - -+static int dvbsky_mygica_t230c_v2_attach(struct dvb_usb_adapter *adap) -+{ -+ struct dvbsky_state *state = adap_to_priv(adap); -+ struct dvb_usb_device *d = adap_to_d(adap); -+ struct i2c_adapter *i2c_adapter; -+ struct i2c_client *client_demod, *client_tuner; -+ struct i2c_board_info info; -+ struct si2168_config si2168_config; -+ struct si2157_config si2157_config; -+ -+ /* attach demod */ -+ memset(&si2168_config, 0, sizeof(si2168_config)); -+ si2168_config.i2c_adapter = &i2c_adapter; -+ si2168_config.fe = &adap->fe[0]; -+ si2168_config.ts_mode = SI2168_TS_PARALLEL; -+ si2168_config.ts_clock_inv = 1; -+ si2168_config.ts_clock_mode = SI2168_TS_CLOCK_MODE_MANUAL; -+ si2168_config.ts_clock_freq = 10000000; -+ memset(&info, 0, sizeof(struct i2c_board_info)); -+ strlcpy(info.type, "si2168", sizeof(info.type)); -+ info.addr = 0x64; -+ info.platform_data = &si2168_config; -+ -+ request_module("si2168"); -+ client_demod = i2c_new_device(&d->i2c_adap, &info); -+ if (!client_demod || !client_demod->dev.driver) -+ goto fail_demod_device; -+ if (!try_module_get(client_demod->dev.driver->owner)) -+ goto fail_demod_module; -+ -+ /* attach tuner */ -+ memset(&si2157_config, 0, sizeof(si2157_config)); -+ si2157_config.fe = adap->fe[0]; -+ si2157_config.if_port = 0; -+ memset(&info, 0, sizeof(struct i2c_board_info)); -+ strlcpy(info.type, "si2141", sizeof(info.type)); -+ info.addr = 0x60; -+ info.platform_data = &si2157_config; -+ -+ request_module("si2157"); -+ client_tuner = i2c_new_device(i2c_adapter, &info); -+ if (!client_tuner || !client_tuner->dev.driver) -+ goto fail_tuner_device; -+ if (!try_module_get(client_tuner->dev.driver->owner)) -+ goto fail_tuner_module; -+ -+ state->i2c_client_demod = client_demod; -+ state->i2c_client_tuner = client_tuner; -+ return 0; -+ -+fail_tuner_module: -+ i2c_unregister_device(client_tuner); -+fail_tuner_device: -+ module_put(client_demod->dev.driver->owner); -+fail_demod_module: -+ i2c_unregister_device(client_demod); -+fail_demod_device: -+ return -ENODEV; -+} -+ - - static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name) - { -@@ -762,6 +822,33 @@ static struct dvb_usb_device_properties mygica_t230c_props = { - } - }; - -+static struct dvb_usb_device_properties mygica_t230c_v2_props = { -+ .driver_name = KBUILD_MODNAME, -+ .owner = THIS_MODULE, -+ .adapter_nr = adapter_nr, -+ .size_of_priv = sizeof(struct dvbsky_state), -+ -+ .generic_bulk_ctrl_endpoint = 0x01, -+ .generic_bulk_ctrl_endpoint_response = 0x81, -+ .generic_bulk_ctrl_delay = DVBSKY_MSG_DELAY, -+ -+ .i2c_algo = &dvbsky_i2c_algo, -+ .frontend_attach = dvbsky_mygica_t230c_v2_attach, -+ .init = dvbsky_init, -+ .get_rc_config = dvbsky_get_rc_config, -+ .streaming_ctrl = dvbsky_streaming_ctrl, -+ .identify_state = dvbsky_identify_state, -+ .exit = dvbsky_exit, -+ -+ .num_adapters = 1, -+ .adapter = { -+ { -+ .stream = DVB_USB_STREAM_BULK(0x82, 8, 4096), -+ } -+ } -+}; -+ -+ - static const struct usb_device_id dvbsky_id_table[] = { - { DVB_USB_DEVICE(0x0572, 0x6831, - &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) }, -@@ -797,6 +884,9 @@ static const struct usb_device_id dvbsky_id_table[] = { - { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C, - &mygica_t230c_props, "MyGica Mini DVB-T2 USB Stick T230C", - RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, -+ { DVB_USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230C_V2, -+ &mygica_t230c_v2_props, "MyGica Mini DVB-T2 USB Stick T230C v2", -+ RC_MAP_TOTAL_MEDIA_IN_HAND_02) }, - { } - }; - MODULE_DEVICE_TABLE(usb, dvbsky_id_table); -diff --git a/include/media/dvb-usb-ids.h b/include/media/dvb-usb-ids.h -index f9e73b4..d606248 100644 ---- a/include/media/dvb-usb-ids.h -+++ b/include/media/dvb-usb-ids.h -@@ -387,6 +387,7 @@ - #define USB_PID_MYGICA_D689 0xd811 - #define USB_PID_MYGICA_T230 0xc688 - #define USB_PID_MYGICA_T230C 0xc689 -+#define USB_PID_MYGICA_T230C_V2 0xc68a - #define USB_PID_ELGATO_EYETV_DIVERSITY 0x0011 - #define USB_PID_ELGATO_EYETV_DTT 0x0021 - #define USB_PID_ELGATO_EYETV_DTT_2 0x003f --- -2.17.1 - diff --git a/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk b/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk index ccce3a9c7e..92439b11f1 100644 --- a/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk +++ b/packages/linux-driver-addons/dvb/depends/media_tree_cc/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="media_tree_cc" -PKG_VERSION="2019-03-08" -PKG_SHA256="e3394cb051c9bd450e84f6597072fe65ab7d1a45113cfbe5027dd9137129834f" +PKG_VERSION="2019-05-12" +PKG_SHA256="55bd8b54c83110a30d8ad44761e888a4bad4745f1ae4765dcf44f2752fc96419" PKG_LICENSE="GPL" PKG_SITE="https://bitbucket.org/CrazyCat/media_build/downloads/" PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.bz2" diff --git a/packages/linux-driver-addons/dvb/digital_devices/package.mk b/packages/linux-driver-addons/dvb/digital_devices/package.mk index 8816acd76c..1834ca491b 100644 --- a/packages/linux-driver-addons/dvb/digital_devices/package.mk +++ b/packages/linux-driver-addons/dvb/digital_devices/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="digital_devices" -PKG_VERSION="e3601828472485b299495ec15dcd7e4cc4c770a3" -PKG_SHA256="2e75a97602cd7512655020d7147a18eee76a9b7befa2aaca82d1548a0995c313" +PKG_VERSION="040a1c58b660781297acc5eda09d934ced245c5e" +PKG_SHA256="a0d7e8e78bc9e56b014d61585506dcb5fef4fa8b31d5f5e5aeaabb98343a3611" PKG_ARCH="x86_64" PKG_LICENSE="GPL" PKG_SITE="https://github.com/DigitalDevices/dddvb/" diff --git a/packages/linux-driver-addons/dvb/dvb-latest/package.mk b/packages/linux-driver-addons/dvb/dvb-latest/package.mk index 6551a1be73..d8b8b8997f 100644 --- a/packages/linux-driver-addons/dvb/dvb-latest/package.mk +++ b/packages/linux-driver-addons/dvb/dvb-latest/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) PKG_NAME="dvb-latest" -PKG_VERSION="c23276037794bae357fa8d23e3a4f11af9ad46e9" -PKG_SHA256="c69d5c6af435887bd46d8da4816f724905e36fd7d080c8e1c437fbe4848ea813" +PKG_VERSION="d121a2bedf6dd541c6182041142ec54fd94760ab" +PKG_SHA256="45dcd91f283ee9cfd7a75b291ab40c6b25d054362960c63d5a806db9b9489f70" PKG_LICENSE="GPL" PKG_SITE="http://git.linuxtv.org/media_build.git" PKG_URL="https://git.linuxtv.org/media_build.git/snapshot/${PKG_VERSION}.tar.gz" diff --git a/packages/linux-drivers/RTL8192CU/package.mk b/packages/linux-drivers/RTL8192CU/package.mk index cc8bfb8257..8f22b9e8fd 100644 --- a/packages/linux-drivers/RTL8192CU/package.mk +++ b/packages/linux-drivers/RTL8192CU/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8192CU" -PKG_VERSION="d7c7e6aa73fc457cfc5e5272878d111c657ce6dc" -PKG_SHA256="3b7a4b198913fa45958c7309e0358c34628d791038a473f6d4e95bcf70b7d56f" +PKG_VERSION="f32ef3984db7c7f7644edec0fa28a63a47b1a7d6" +PKG_SHA256="7e8df7cce0918630121c7493a6333d392b3099b1126e8c355aa221cee032c80b" PKG_LICENSE="GPL" PKG_SITE="https://github.com/pvaret/rtl8192cu-fixes" PKG_URL="$PKG_SITE/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux-drivers/RTL8192DU/package.mk b/packages/linux-drivers/RTL8192DU/package.mk index 7e19013b10..1392852e62 100644 --- a/packages/linux-drivers/RTL8192DU/package.mk +++ b/packages/linux-drivers/RTL8192DU/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8192DU" -PKG_VERSION="3105cd3179d5e60a7aa675611a3592a45b29bfcb" -PKG_SHA256="0a19e86192418d4179def917a9cea3aa0f2f2da7c44a520c085b9d78d9d2c09e" +PKG_VERSION="72b53f8a6c2a6696d60791df4455c3073fffc4e4" +PKG_SHA256="dec3cc45601c2c6dab47816523cb5a5731393d34cc75ec0f96a91191d3563fdd" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lwfinger/rtl8192du" PKG_URL="https://github.com/lwfinger/rtl8192du/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux-drivers/RTL8192EU/package.mk b/packages/linux-drivers/RTL8192EU/package.mk index 5704f7d09f..37c0f7616e 100644 --- a/packages/linux-drivers/RTL8192EU/package.mk +++ b/packages/linux-drivers/RTL8192EU/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8192EU" -PKG_VERSION="b63646fb61fec4895f0fd4aec1a0cb0e8873eaeb" -PKG_SHA256="7e24457f371121e1f587ec759b3338bc9b63bd03632840a11076791155c0c93f" +PKG_VERSION="0a7199b457b25edc4d9534158a068e486b1c8bb0" +PKG_SHA256="defee6fda236bc9d77cd5cf0ceca8e86f820a1f9fa5d63c5ca7c369be1a3513e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/Mange/rtl8192eu-linux-driver" PKG_URL="https://github.com/Mange/rtl8192eu-linux-driver/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux-drivers/RTL8812AU/package.mk b/packages/linux-drivers/RTL8812AU/package.mk index 7e76a53cdf..e3e24a3395 100644 --- a/packages/linux-drivers/RTL8812AU/package.mk +++ b/packages/linux-drivers/RTL8812AU/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="RTL8812AU" -PKG_VERSION="7c257daf52d0aac298c13135bd3ff5f388edc72b" -PKG_SHA256="88eaed2f0b394a36f806f02bd245e7bd181e2aaafc2b7ff4521f4adb2fa6dc29" +PKG_VERSION="bdfef37665b34be7a84835fba97e44447b30f98c" +PKG_SHA256="44ccdeb90da2e750330108e71e6986e1a9000ba2e6b5709460a271d570a75769" PKG_LICENSE="GPL" PKG_SITE="https://github.com/MilhouseVH/RTL8812AU" PKG_URL="https://github.com/MilhouseVH/RTL8812AU/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux-drivers/bcm_sta/patches/bcm_sta-0200-kernel-5.1-rc1-fix.patch b/packages/linux-drivers/bcm_sta/patches/bcm_sta-0200-kernel-5.1-rc1-fix.patch new file mode 100644 index 0000000000..09b3329d16 --- /dev/null +++ b/packages/linux-drivers/bcm_sta/patches/bcm_sta-0200-kernel-5.1-rc1-fix.patch @@ -0,0 +1,68 @@ +From aa1fc45ace58d802d038857b6fed8af9d771fbcc Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Mon, 18 Mar 2019 16:29:45 +0000 +Subject: [PATCH] get rid of legacy 'get_ds()' function + +https://github.com/torvalds/linux/commit/736706bee3298208343a76096370e4f6a5c55915 +--- + x86-32/src/wl/sys/wl_cfg80211_hybrid.c | 2 +- + x86-32/src/wl/sys/wl_iw.c | 2 +- + x86-64/src/wl/sys/wl_cfg80211_hybrid.c | 2 +- + x86-64/src/wl/sys/wl_iw.c | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c +index 7b606e0..51c81bc 100644 +--- a/x86-32/src/wl/sys/wl_cfg80211_hybrid.c ++++ b/x86-32/src/wl/sys/wl_cfg80211_hybrid.c +@@ -450,7 +450,7 @@ wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len) + ifr.ifr_data = (caddr_t)&ioc; + + fs = get_fs(); +- set_fs(get_ds()); ++ set_fs(KERNEL_DS); + #if defined(WL_USE_NETDEV_OPS) + err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); + #else +diff --git a/x86-32/src/wl/sys/wl_iw.c b/x86-32/src/wl/sys/wl_iw.c +index c4c610b..9c3c74e 100644 +--- a/x86-32/src/wl/sys/wl_iw.c ++++ b/x86-32/src/wl/sys/wl_iw.c +@@ -117,7 +117,7 @@ dev_wlc_ioctl( + ifr.ifr_data = (caddr_t) &ioc; + + fs = get_fs(); +- set_fs(get_ds()); ++ set_fs(KERNEL_DS); + #if defined(WL_USE_NETDEV_OPS) + ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); + #else +diff --git a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +index 7b606e0..51c81bc 100644 +--- a/x86-64/src/wl/sys/wl_cfg80211_hybrid.c ++++ b/x86-64/src/wl/sys/wl_cfg80211_hybrid.c +@@ -450,7 +450,7 @@ wl_dev_ioctl(struct net_device *dev, u32 cmd, void *arg, u32 len) + ifr.ifr_data = (caddr_t)&ioc; + + fs = get_fs(); +- set_fs(get_ds()); ++ set_fs(KERNEL_DS); + #if defined(WL_USE_NETDEV_OPS) + err = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); + #else +diff --git a/x86-64/src/wl/sys/wl_iw.c b/x86-64/src/wl/sys/wl_iw.c +index c4c610b..9c3c74e 100644 +--- a/x86-64/src/wl/sys/wl_iw.c ++++ b/x86-64/src/wl/sys/wl_iw.c +@@ -117,7 +117,7 @@ dev_wlc_ioctl( + ifr.ifr_data = (caddr_t) &ioc; + + fs = get_fs(); +- set_fs(get_ds()); ++ set_fs(KERNEL_DS); + #if defined(WL_USE_NETDEV_OPS) + ret = dev->netdev_ops->ndo_do_ioctl(dev, &ifr, SIOCDEVPRIVATE); + #else +-- +2.14.1 + diff --git a/packages/linux-drivers/gpu-sunxi-midgard/package.mk b/packages/linux-drivers/gpu-sunxi-midgard/package.mk deleted file mode 100644 index 1c6769acdf..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/package.mk +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="gpu-sunxi-midgard" -PKG_VERSION="r22p0-01rel0" -PKG_SHA256="02f80e777dc945d645fce888afc926555ec61b70079c1da289bf1a3a9544452f" -PKG_ARCH="arm aarch64" -PKG_LICENSE="GPL" -PKG_SITE="https://developer.arm.com/products/software/mali-drivers/" -PKG_URL="https://developer.arm.com/-/media/Files/downloads/mali-drivers/kernel/mali-midgard-gpu/TX011-SW-99002-$PKG_VERSION.tgz" -PKG_DEPENDS_TARGET="toolchain linux" -PKG_NEED_UNPACK="$LINUX_DEPENDS" -PKG_LONGDESC="gpu-sunxi-midgard: Linux drivers for Mali GPUs found in Allwinner SoCs" -PKG_TOOLCHAIN="manual" -PKG_IS_KERNEL_PKG="yes" - -make_target() { - kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/product/kernel/drivers/gpu/arm/midgard/ \ - EXTRA_CFLAGS="-DCONFIG_MALI_PLATFORM_DEVICETREE -DCONFIG_MALI_BACKEND=gpu -DCONFIG_MALI_DEVFREQ" CONFIG_MALI_DEVFREQ=y \ - CONFIG_MALI_MIDGARD=m CONFIG_MALI_PLATFORM_DEVICETREE=y CONFIG_MALI_BACKEND=gpu modules -} - -makeinstall_target() { - kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/product/kernel/drivers/gpu/arm/midgard/ \ - INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ - modules_install -} diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/01-add-bus-clk-and-reset.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/01-add-bus-clk-and-reset.patch deleted file mode 100644 index 5474b90262..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/01-add-bus-clk-and-reset.patch +++ /dev/null @@ -1,89 +0,0 @@ -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c 2018-03-06 18:05:25.000000000 +0100 -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c 2018-04-04 22:26:50.310273475 +0200 -@@ -3225,6 +3225,20 @@ - } - #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ - -+ kbdev->mali_rst = of_reset_control_get_by_index(kbdev->dev->of_node, 0); -+ if (IS_ERR(kbdev->mali_rst)) { -+ dev_err(kbdev->dev, "Couldn't get mali reset line\n"); -+ err = PTR_ERR(kbdev->mali_rst); -+ goto fail; -+ } -+ -+ kbdev->bus_clk = of_clk_get(kbdev->dev->of_node, 1); -+ if (IS_ERR(kbdev->bus_clk)) { -+ dev_err(kbdev->dev, "Couldn't get the mali bus clock\n"); -+ err = PTR_ERR(kbdev->bus_clk); -+ goto fail; -+ } -+ - kbdev->clock = of_clk_get(kbdev->dev->of_node, 0); - if (IS_ERR_OR_NULL(kbdev->clock)) { - err = PTR_ERR(kbdev->clock); -@@ -3236,6 +3250,8 @@ - dev_info(kbdev->dev, "Continuing without Mali clock control\n"); - /* Allow probe to continue without clock. */ - } else { -+ reset_control_deassert(kbdev->mali_rst); -+ clk_prepare_enable(kbdev->bus_clk); - err = clk_prepare_enable(kbdev->clock); - if (err) { - dev_err(kbdev->dev, -@@ -3268,6 +3284,16 @@ - kbdev->clock = NULL; - } - -+if (kbdev->bus_clk) { -+ clk_put(kbdev->bus_clk); -+ kbdev->bus_clk = NULL; -+} -+ -+if (kbdev->mali_rst) { -+ reset_control_put(kbdev->mali_rst); -+ kbdev->mali_rst = NULL; -+} -+ - #ifdef CONFIG_REGULATOR - if (NULL != kbdev->regulator) { - regulator_put(kbdev->regulator); -@@ -3293,6 +3319,18 @@ - kbdev->clock = NULL; - } - -+ if (kbdev->bus_clk) { -+ clk_disable_unprepare(kbdev->bus_clk); -+ clk_put(kbdev->bus_clk); -+ kbdev->bus_clk = NULL; -+ } -+ -+ if (kbdev->mali_rst) { -+ reset_control_assert(kbdev->mali_rst); -+ reset_control_put(kbdev->mali_rst); -+ kbdev->mali_rst = NULL; -+ } -+ - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)) && defined(CONFIG_OF) \ - && defined(CONFIG_REGULATOR) - if (kbdev->regulator) { -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_defs.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_defs.h ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_defs.h 2018-03-06 18:05:25.000000000 +0100 -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_defs.h 2018-04-04 22:05:56.017916193 +0200 -@@ -68,6 +68,7 @@ - #endif /* CONFIG_MALI_DEVFREQ */ - - #include -+#include - #include - - #if defined(CONFIG_PM_RUNTIME) || \ -@@ -1434,6 +1435,8 @@ - } irqs[3]; - - struct clk *clock; -+ struct clk *bus_clk; -+ struct reset_control *mali_rst; - #ifdef CONFIG_REGULATOR - struct regulator *regulator; - #endif diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/02-restore-old-api.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/02-restore-old-api.patch deleted file mode 100644 index 5fee4fb948..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/02-restore-old-api.patch +++ /dev/null @@ -1,1880 +0,0 @@ -From 9614bc2e648a411a8d5b16ff637c24908d4d40d1 Mon Sep 17 00:00:00 2001 -From: Dominik Behr -Date: Wed, 07 Mar 2018 16:05:51 -0800 -Subject: [PATCH] CHROMIUM: mali: HACK: add backward compatibility for r12 userspace - -GPUCORE-14339: Make r22p0 backwards compatible - -This re-introduces the old UK 10.6 support (which includes support for -earlier 10.x versions). We had to back out the Kari support as it broke -pre-r18p0 clients due to a change in a prop query structure r18 -added support was not fixed. So pre-r18 clients expects a static -property query and thus can't handle adding new Kari properties. - -BUG=b:73501174 -TEST=build and run daisy, peach, minnie and kevin - -Change-Id: I89fd6521e367bebb223e1b04aa1077b348253d10 -Signed-off-by: Dominik Behr -Reviewed-on: https://chromium-review.googlesource.com/957586 -Reviewed-by: Stéphane Marchesin ---- - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_hwconfig_features.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_hwconfig_features.h -index e0eebd8..a78fcef 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_hwconfig_features.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_hwconfig_features.h -@@ -58,7 +58,6 @@ - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, - BASE_HW_FEATURE_AARCH64_MMU, - BASE_HW_FEATURE_TLS_HASHING, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_3BIT_EXT_RW_L2_MMU_CONFIG, - BASE_HW_FEATURE_END - }; -@@ -70,7 +69,6 @@ - static const enum base_hw_feature base_hw_features_t60x[] = { - BASE_HW_FEATURE_LD_ST_LEA_TEX, - BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_V4, - BASE_HW_FEATURE_END - }; -@@ -79,7 +77,6 @@ - BASE_HW_FEATURE_LD_ST_LEA_TEX, - BASE_HW_FEATURE_LINEAR_FILTER_FLOAT, - BASE_HW_FEATURE_ATTR_AUTO_TYPE_INFERRAL, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_V4, - BASE_HW_FEATURE_END - }; -@@ -91,7 +88,6 @@ - BASE_HW_FEATURE_INTERPIPE_REG_ALIASING, - BASE_HW_FEATURE_OPTIMIZED_COVERAGE_MASK, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_WORKGROUP_ROUND_MULTIPLE_OF_4, - BASE_HW_FEATURE_WARPING, - BASE_HW_FEATURE_V4, -@@ -113,7 +109,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_END - }; - -@@ -134,7 +129,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_END - }; - -@@ -157,7 +151,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_END - }; - -@@ -180,7 +173,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_END - }; - -@@ -203,7 +195,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_COHERENCY_REG, -@@ -229,7 +220,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -@@ -257,7 +247,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -@@ -285,7 +274,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -@@ -312,7 +300,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -@@ -342,7 +329,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -@@ -453,7 +439,6 @@ - BASE_HW_FEATURE_OUT_OF_ORDER_EXEC, - BASE_HW_FEATURE_T7XX_PAIRING_RULES, - BASE_HW_FEATURE_TEST4_DATUM_MODE, -- BASE_HW_FEATURE_THREAD_GROUP_SPLIT, - BASE_HW_FEATURE_FLUSH_REDUCTION, - BASE_HW_FEATURE_PROTECTED_MODE, - BASE_HW_FEATURE_PROTECTED_DEBUG_MODE, -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_kernel.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_kernel.h -index e6b568f..2baeee14 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_kernel.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_base_kernel.h -@@ -29,6 +29,12 @@ - #ifndef _BASE_KERNEL_H_ - #define _BASE_KERNEL_H_ - -+/* Support UK10_2 IOCTLS */ -+#define BASE_LEGACY_UK10_2_SUPPORT 1 -+ -+/* Support UK10_4 IOCTLS */ -+#define BASE_LEGACY_UK10_4_SUPPORT 1 -+ - typedef struct base_mem_handle { - struct { - u64 handle; -@@ -51,7 +57,7 @@ - #define BASE_JD_SOFT_EVENT_SET ((unsigned char)1) - #define BASE_JD_SOFT_EVENT_RESET ((unsigned char)0) - --#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4 -+#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3 - - #define BASE_MAX_COHERENT_GROUPS 16 - -@@ -1350,7 +1356,7 @@ - * @{ - */ - --#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 4 -+#define BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS 3 - - #define BASE_MAX_COHERENT_GROUPS 16 - -@@ -1382,10 +1388,23 @@ - - u16 padding; - -- /* The maximum GPU frequency. Reported to applications by -- * clGetDeviceInfo() -+ /** -+ * This property is deprecated since it has not contained the real current -+ * value of GPU clock speed. It is kept here only for backwards compatibility. -+ * For the new ioctl interface, it is ignored and is treated as a padding -+ * to keep the structure of the same size and retain the placement of its -+ * members. -+ */ -+ u32 gpu_speed_mhz; -+ -+ /** -+ * @usecase GPU clock max/min speed is required for computing best/worst case -+ * in tasks as job scheduling ant irq_throttling. (It is not specified in the -+ * Midgard Architecture). -+ * Also, GPU clock max speed is used for OpenCL's clGetDeviceInfo() function. - */ - u32 gpu_freq_khz_max; -+ u32 gpu_freq_khz_min; - - /** - * Size of the shader program counter, in bits. -@@ -1533,7 +1552,7 @@ - u32 js_present; - u32 js_features[GPU_MAX_JOB_SLOTS]; - u32 tiler_features; -- u32 texture_features[BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS]; -+ u32 texture_features[3]; - - u32 gpu_id; - -@@ -1700,6 +1719,20 @@ - base_jd_core_req fragment_core_req; - } base_jd_replay_payload; - -+#ifdef BASE_LEGACY_UK10_2_SUPPORT -+typedef struct base_jd_replay_payload_uk10_2 { -+ u64 tiler_jc_list; -+ u64 fragment_jc; -+ u64 tiler_heap_free; -+ u16 fragment_hierarchy_mask; -+ u16 tiler_hierarchy_mask; -+ u32 hierarchy_default_weight; -+ u16 tiler_core_req; -+ u16 fragment_core_req; -+ u8 padding[4]; -+} base_jd_replay_payload_uk10_2; -+#endif /* BASE_LEGACY_UK10_2_SUPPORT */ -+ - /** - * @brief An entry in the linked list of job chains to be replayed. This must - * be in GPU memory. -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -index 7174ef2..dd13893 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -@@ -48,6 +48,7 @@ - #include - - #include "mali_base_kernel.h" -+#include - #include - - /* -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c -index 22c995a..69b4110 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c -@@ -22,6 +22,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -97,6 +98,11 @@ - #define MMU_IRQ_TAG 1 - #define GPU_IRQ_TAG 2 - -+#if MALI_UNIT_TEST -+static struct kbase_exported_test_data shared_kernel_test_data; -+EXPORT_SYMBOL(shared_kernel_test_data); -+#endif /* MALI_UNIT_TEST */ -+ - static int kbase_dev_nr; - - static DEFINE_MUTEX(kbase_dev_list_lock); -@@ -108,6 +114,9 @@ - struct kbase_ioctl_version_check *version) - { - switch (version->major) { -+ case 10: /* we support 10.6 */ -+ version->minor = min_t(int, 6, (int)version->minor); -+ break; - case BASE_UK_VERSION_MAJOR: - /* set minor to be the lowest common */ - version->minor = min_t(int, BASE_UK_VERSION_MINOR, -@@ -178,6 +187,739 @@ - inited_ctx_sched = (1u << 22) - }; - -+/** -+ * kbase_legacy_dispatch - UKK dispatch function -+ * -+ * This is the dispatch function for the legacy UKK ioctl interface. No new -+ * ioctls should be added to this function, see kbase_ioctl instead. -+ * -+ * @kctx: The kernel context structure -+ * @args: Pointer to the data structure passed from/to user space -+ * @args_size: Size of the data structure -+ */ -+static int kbase_legacy_dispatch(struct kbase_context *kctx, -+ void * const args, u32 args_size) -+{ -+ struct kbase_device *kbdev; -+ union uk_header *ukh = args; -+ u32 id; -+ int ret = 0; -+ -+ KBASE_DEBUG_ASSERT(ukh != NULL); -+ -+ kbdev = kctx->kbdev; -+ id = ukh->id; -+ ukh->ret = MALI_ERROR_NONE; /* Be optimistic */ -+ -+#ifdef CONFIG_MALI_DEBUG -+ wait_event(kbdev->driver_inactive_wait, -+ kbdev->driver_inactive == false); -+#endif /* CONFIG_MALI_DEBUG */ -+ -+ if (UKP_FUNC_ID_CHECK_VERSION == id) { -+ struct uku_version_check_args *version_check; -+ struct kbase_ioctl_version_check version; -+ -+ if (args_size != sizeof(struct uku_version_check_args)) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ return 0; -+ } -+ version_check = (struct uku_version_check_args *)args; -+ version.minor = version_check->minor; -+ version.major = version_check->major; -+ -+ kbase_api_handshake(kctx, &version); -+ -+ version_check->minor = version.minor; -+ version_check->major = version.major; -+ ukh->ret = MALI_ERROR_NONE; -+ return 0; -+ } -+ -+ /* block calls until version handshake */ -+ if (kctx->api_version == 0) -+ return -EINVAL; -+ -+ if (!atomic_read(&kctx->setup_complete)) { -+ struct kbase_uk_set_flags *kbase_set_flags; -+ -+ /* setup pending, try to signal that we'll do the setup, -+ * if setup was already in progress, err this call -+ */ -+ if (atomic_cmpxchg(&kctx->setup_in_progress, 0, 1) != 0) -+ return -EINVAL; -+ -+ /* if unexpected call, will stay stuck in setup mode -+ * (is it the only call we accept?) -+ */ -+ if (id != KBASE_FUNC_SET_FLAGS) -+ return -EINVAL; -+ -+ kbase_set_flags = (struct kbase_uk_set_flags *)args; -+ -+ /* if not matching the expected call, stay in setup mode */ -+ if (sizeof(*kbase_set_flags) != args_size) -+ goto bad_size; -+ -+ /* if bad flags, will stay stuck in setup mode */ -+ if (kbase_context_set_create_flags(kctx, -+ kbase_set_flags->create_flags) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ -+ atomic_set(&kctx->setup_complete, 1); -+ return 0; -+ } -+ -+ /* setup complete, perform normal operation */ -+ switch (id) { -+ case KBASE_FUNC_MEM_JIT_INIT: -+ { -+ struct kbase_uk_mem_jit_init *jit_init = args; -+ -+ if (sizeof(*jit_init) != args_size) -+ goto bad_size; -+ -+ if (kbase_region_tracker_init_jit(kctx, -+ jit_init->va_pages)) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ case KBASE_FUNC_MEM_ALLOC: -+ { -+ struct kbase_uk_mem_alloc *mem = args; -+ struct kbase_va_region *reg; -+ -+ if (sizeof(*mem) != args_size) -+ goto bad_size; -+ -+#if defined(CONFIG_64BIT) -+ if (!kbase_ctx_flag(kctx, KCTX_COMPAT)) { -+ /* force SAME_VA if a 64-bit client */ -+ mem->flags |= BASE_MEM_SAME_VA; -+ } -+#endif -+ -+ reg = kbase_mem_alloc(kctx, mem->va_pages, -+ mem->commit_pages, mem->extent, -+ &mem->flags, &mem->gpu_va); -+ mem->va_alignment = 0; -+ -+ if (!reg) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ case KBASE_FUNC_MEM_IMPORT: { -+ struct kbase_uk_mem_import *mem_import = args; -+ void __user *phandle; -+ -+ if (sizeof(*mem_import) != args_size) -+ goto bad_size; -+#ifdef CONFIG_COMPAT -+ if (kbase_ctx_flag(kctx, KCTX_COMPAT)) -+ phandle = compat_ptr(mem_import->phandle); -+ else -+#endif -+ phandle = u64_to_user_ptr(mem_import->phandle); -+ -+ if (mem_import->type == BASE_MEM_IMPORT_TYPE_INVALID) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+ if (kbase_mem_import(kctx, -+ (enum base_mem_import_type) -+ mem_import->type, -+ phandle, -+ 0, -+ &mem_import->gpu_va, -+ &mem_import->va_pages, -+ &mem_import->flags)) { -+ mem_import->type = BASE_MEM_IMPORT_TYPE_INVALID; -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ } -+ break; -+ } -+ case KBASE_FUNC_MEM_ALIAS: { -+ struct kbase_uk_mem_alias *alias = args; -+ struct base_mem_aliasing_info __user *user_ai; -+ struct base_mem_aliasing_info *ai; -+ -+ if (sizeof(*alias) != args_size) -+ goto bad_size; -+ -+ if (alias->nents > 2048) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ if (!alias->nents) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+#ifdef CONFIG_COMPAT -+ if (kbase_ctx_flag(kctx, KCTX_COMPAT)) -+ user_ai = compat_ptr(alias->ai); -+ else -+#endif -+ user_ai = u64_to_user_ptr(alias->ai); -+ -+ ai = vmalloc(sizeof(*ai) * alias->nents); -+ -+ if (!ai) { -+ ukh->ret = MALI_ERROR_OUT_OF_MEMORY; -+ break; -+ } -+ -+ if (copy_from_user(ai, user_ai, -+ sizeof(*ai) * alias->nents)) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ goto copy_failed; -+ } -+ -+ alias->gpu_va = kbase_mem_alias(kctx, &alias->flags, -+ alias->stride, -+ alias->nents, ai, -+ &alias->va_pages); -+ if (!alias->gpu_va) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ goto no_alias; -+ } -+no_alias: -+copy_failed: -+ vfree(ai); -+ break; -+ } -+ case KBASE_FUNC_MEM_COMMIT: -+ { -+ struct kbase_uk_mem_commit *commit = args; -+ int ret; -+ -+ if (sizeof(*commit) != args_size) -+ goto bad_size; -+ -+ ret = kbase_mem_commit(kctx, commit->gpu_addr, -+ commit->pages); -+ -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ commit->result_subcode = -+ BASE_BACKING_THRESHOLD_ERROR_INVALID_ARGUMENTS; -+ -+ if (ret == 0) { -+ ukh->ret = MALI_ERROR_NONE; -+ commit->result_subcode = -+ BASE_BACKING_THRESHOLD_OK; -+ } else if (ret == -ENOMEM) { -+ commit->result_subcode = -+ BASE_BACKING_THRESHOLD_ERROR_OOM; -+ } -+ -+ break; -+ } -+ -+ case KBASE_FUNC_MEM_QUERY: -+ { -+ struct kbase_uk_mem_query *query = args; -+ -+ if (sizeof(*query) != args_size) -+ goto bad_size; -+ -+ if (kbase_mem_query(kctx, query->gpu_addr, -+ query->query, &query->value) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ ukh->ret = MALI_ERROR_NONE; -+ break; -+ } -+ break; -+ -+ case KBASE_FUNC_MEM_FLAGS_CHANGE: -+ { -+ struct kbase_uk_mem_flags_change *fc = args; -+ -+ if (sizeof(*fc) != args_size) -+ goto bad_size; -+ -+ if (kbase_mem_flags_change(kctx, fc->gpu_va, -+ fc->flags, fc->mask) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ -+ break; -+ } -+ case KBASE_FUNC_MEM_FREE: -+ { -+ struct kbase_uk_mem_free *mem = args; -+ -+ if (sizeof(*mem) != args_size) -+ goto bad_size; -+ -+ if (kbase_mem_free(kctx, mem->gpu_addr) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+ case KBASE_FUNC_JOB_SUBMIT: -+ { -+ struct kbase_uk_job_submit *job = args; -+ char __user *user_buf; -+ -+ if (sizeof(*job) != args_size) -+ goto bad_size; -+ -+#ifdef CONFIG_COMPAT -+ if (kbase_ctx_flag(kctx, KCTX_COMPAT)) -+ user_buf = compat_ptr(job->addr); -+ else -+#endif -+ user_buf = u64_to_user_ptr(job->addr); -+ -+ if (kbase_jd_submit(kctx, user_buf, -+ job->nr_atoms, -+ job->stride, -+ false) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+ case KBASE_FUNC_SYNC: -+ { -+ struct kbase_uk_sync_now *sn = args; -+ -+ if (sizeof(*sn) != args_size) -+ goto bad_size; -+ -+ if (kbase_sync_now(kctx, &sn->sset.basep_sset) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+ case KBASE_FUNC_DISJOINT_QUERY: -+ { -+ struct kbase_uk_disjoint_query *dquery = args; -+ -+ if (sizeof(*dquery) != args_size) -+ goto bad_size; -+ -+ /* Get the disjointness counter value. */ -+ dquery->counter = kbase_disjoint_event_get(kctx->kbdev); -+ break; -+ } -+ -+ case KBASE_FUNC_POST_TERM: -+ { -+ kbase_event_close(kctx); -+ break; -+ } -+ -+ case KBASE_FUNC_HWCNT_SETUP: -+ { -+ struct kbase_uk_hwcnt_setup *setup = args; -+ -+ if (sizeof(*setup) != args_size) -+ goto bad_size; -+ -+ mutex_lock(&kctx->vinstr_cli_lock); -+ if (kbase_vinstr_legacy_hwc_setup(kbdev->vinstr_ctx, -+ &kctx->vinstr_cli, setup) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ mutex_unlock(&kctx->vinstr_cli_lock); -+ break; -+ } -+ -+ case KBASE_FUNC_HWCNT_DUMP: -+ { -+ /* args ignored */ -+ mutex_lock(&kctx->vinstr_cli_lock); -+ if (kbase_vinstr_hwc_dump(kctx->vinstr_cli, -+ BASE_HWCNT_READER_EVENT_MANUAL) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ mutex_unlock(&kctx->vinstr_cli_lock); -+ break; -+ } -+ -+ case KBASE_FUNC_HWCNT_CLEAR: -+ { -+ /* args ignored */ -+ mutex_lock(&kctx->vinstr_cli_lock); -+ if (kbase_vinstr_hwc_clear(kctx->vinstr_cli) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ mutex_unlock(&kctx->vinstr_cli_lock); -+ break; -+ } -+ -+ case KBASE_FUNC_HWCNT_READER_SETUP: -+ { -+ struct kbase_uk_hwcnt_reader_setup *setup = args; -+ -+ if (sizeof(*setup) != args_size) -+ goto bad_size; -+ -+ mutex_lock(&kctx->vinstr_cli_lock); -+ if (kbase_vinstr_hwcnt_reader_setup(kbdev->vinstr_ctx, -+ setup) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ mutex_unlock(&kctx->vinstr_cli_lock); -+ break; -+ } -+ -+ case KBASE_FUNC_GPU_PROPS_REG_DUMP: -+ { -+ struct kbase_uk_gpuprops *setup = args; -+ -+ printk(KERN_ERR "%s sizeofs:\n", __func__); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops) = %zd\n", sizeof(*setup)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.header) = %zd\n", sizeof(setup->header)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.core_props) = %zd\n", sizeof(setup->props.core_props)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.l2_props) = %zd\n", sizeof(setup->props.l2_props)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.tiler_props) = %zd\n", sizeof(setup->props.tiler_props)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.thread_props) = %zd\n", sizeof(setup->props.thread_props)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.raw_props) = %zd\n", sizeof(setup->props.raw_props)); -+ printk(KERN_ERR "sizeof(kbase_uk_gpuprops.props.coherency_info) = %zd\n", sizeof(setup->props.coherency_info)); -+ -+ -+ if (sizeof(*setup) != args_size) -+ goto bad_size; -+ -+ if (kbase_gpuprops_uk_get_props(kctx, setup) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ case KBASE_FUNC_FIND_CPU_OFFSET: -+ { -+ struct kbase_uk_find_cpu_offset *find = args; -+ -+ if (sizeof(*find) != args_size) -+ goto bad_size; -+ -+ if (find->gpu_addr & ~PAGE_MASK) { -+ dev_warn(kbdev->dev, "kbase_legacy_dispatch case KBASE_FUNC_FIND_CPU_OFFSET: find->gpu_addr: passed parameter is invalid"); -+ goto out_bad; -+ } -+ -+ if (find->size > SIZE_MAX || find->cpu_addr > ULONG_MAX) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ } else { -+ int err; -+ -+ err = kbasep_find_enclosing_cpu_mapping_offset( -+ kctx, -+ find->cpu_addr, -+ find->size, -+ &find->offset); -+ -+ if (err) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ } -+ break; -+ } -+ case KBASE_FUNC_GET_VERSION: -+ { -+ struct kbase_uk_get_ddk_version *get_version = (struct kbase_uk_get_ddk_version *)args; -+ -+ if (sizeof(*get_version) != args_size) -+ goto bad_size; -+ -+ /* version buffer size check is made in compile time assert */ -+ memcpy(get_version->version_buffer, KERNEL_SIDE_DDK_VERSION_STRING, sizeof(KERNEL_SIDE_DDK_VERSION_STRING)); -+ get_version->version_string_size = sizeof(KERNEL_SIDE_DDK_VERSION_STRING); -+ break; -+ } -+ -+ case KBASE_FUNC_STREAM_CREATE: -+ { -+#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE) -+ struct kbase_uk_stream_create *screate = (struct kbase_uk_stream_create *)args; -+ -+ if (sizeof(*screate) != args_size) -+ goto bad_size; -+ -+ if (strnlen(screate->name, sizeof(screate->name)) >= sizeof(screate->name)) { -+ /* not NULL terminated */ -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ break; -+ } -+ -+ if (kbase_sync_fence_stream_create(screate->name, -+ &screate->fd) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ ukh->ret = MALI_ERROR_NONE; -+#else /* CONFIG_SYNC || CONFIG_SYNC_FILE */ -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */ -+ break; -+ } -+ case KBASE_FUNC_FENCE_VALIDATE: -+ { -+#if defined(CONFIG_SYNC) || defined(CONFIG_SYNC_FILE) -+ struct kbase_uk_fence_validate *fence_validate = (struct kbase_uk_fence_validate *)args; -+ -+ if (sizeof(*fence_validate) != args_size) -+ goto bad_size; -+ -+ if (kbase_sync_fence_validate(fence_validate->fd) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ ukh->ret = MALI_ERROR_NONE; -+#endif /* CONFIG_SYNC || CONFIG_SYNC_FILE */ -+ break; -+ } -+ -+ case KBASE_FUNC_SET_TEST_DATA: -+ { -+#if MALI_UNIT_TEST -+ struct kbase_uk_set_test_data *set_data = args; -+ -+ shared_kernel_test_data = set_data->test_data; -+ shared_kernel_test_data.kctx = (uintptr_t)kctx; -+ shared_kernel_test_data.mm = (uintptr_t)current->mm; -+ ukh->ret = MALI_ERROR_NONE; -+#endif /* MALI_UNIT_TEST */ -+ break; -+ } -+ -+ case KBASE_FUNC_INJECT_ERROR: -+ { -+#ifdef CONFIG_MALI_ERROR_INJECT -+ unsigned long flags; -+ struct kbase_error_params params = ((struct kbase_uk_error_params *)args)->params; -+ -+ /*mutex lock */ -+ spin_lock_irqsave(&kbdev->reg_op_lock, flags); -+ if (job_atom_inject_error(¶ms) != 0) -+ ukh->ret = MALI_ERROR_OUT_OF_MEMORY; -+ else -+ ukh->ret = MALI_ERROR_NONE; -+ spin_unlock_irqrestore(&kbdev->reg_op_lock, flags); -+ /*mutex unlock */ -+#endif /* CONFIG_MALI_ERROR_INJECT */ -+ break; -+ } -+ -+ case KBASE_FUNC_MODEL_CONTROL: -+ { -+#ifdef CONFIG_MALI_NO_MALI -+ unsigned long flags; -+ struct kbase_model_control_params params = -+ ((struct kbase_uk_model_control_params *)args)->params; -+ -+ /*mutex lock */ -+ spin_lock_irqsave(&kbdev->reg_op_lock, flags); -+ if (gpu_model_control(kbdev->model, ¶ms) != 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ ukh->ret = MALI_ERROR_NONE; -+ spin_unlock_irqrestore(&kbdev->reg_op_lock, flags); -+ /*mutex unlock */ -+#endif /* CONFIG_MALI_NO_MALI */ -+ break; -+ } -+ -+ case KBASE_FUNC_GET_PROFILING_CONTROLS: -+ { -+ struct kbase_uk_profiling_controls *controls = -+ (struct kbase_uk_profiling_controls *)args; -+ u32 i; -+ -+ if (sizeof(*controls) != args_size) -+ goto bad_size; -+ -+ for (i = FBDUMP_CONTROL_MIN; i < FBDUMP_CONTROL_MAX; i++) -+ controls->profiling_controls[i] = -+ kbdev->kbase_profiling_controls[i]; -+ -+ break; -+ } -+ -+ /* used only for testing purposes; these controls are to be set by gator through gator API */ -+ case KBASE_FUNC_SET_PROFILING_CONTROLS: -+ { -+ struct kbase_uk_profiling_controls *controls = -+ (struct kbase_uk_profiling_controls *)args; -+ u32 i; -+ -+ if (sizeof(*controls) != args_size) -+ goto bad_size; -+ -+ for (i = FBDUMP_CONTROL_MIN; i < FBDUMP_CONTROL_MAX; i++) -+ _mali_profiling_control(i, controls->profiling_controls[i]); -+ -+ break; -+ } -+ -+ case KBASE_FUNC_DEBUGFS_MEM_PROFILE_ADD: -+ { -+ struct kbase_uk_debugfs_mem_profile_add *add_data = -+ (struct kbase_uk_debugfs_mem_profile_add *)args; -+ char *buf; -+ char __user *user_buf; -+ -+ if (sizeof(*add_data) != args_size) -+ goto bad_size; -+ -+ if (add_data->len > KBASE_MEM_PROFILE_MAX_BUF_SIZE) { -+ dev_err(kbdev->dev, "buffer too big\n"); -+ goto out_bad; -+ } -+ -+#ifdef CONFIG_COMPAT -+ if (kbase_ctx_flag(kctx, KCTX_COMPAT)) -+ user_buf = compat_ptr(add_data->buf); -+ else -+#endif -+ user_buf = u64_to_user_ptr(add_data->buf); -+ -+ buf = kmalloc(add_data->len, GFP_KERNEL); -+ if (ZERO_OR_NULL_PTR(buf)) -+ goto out_bad; -+ -+ if (0 != copy_from_user(buf, user_buf, add_data->len)) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ kfree(buf); -+ goto out_bad; -+ } -+ -+ if (kbasep_mem_profile_debugfs_insert(kctx, buf, -+ add_data->len)) { -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ goto out_bad; -+ } -+ -+ break; -+ } -+ -+#ifdef CONFIG_MALI_NO_MALI -+ case KBASE_FUNC_SET_PRFCNT_VALUES: -+ { -+ -+ struct kbase_uk_prfcnt_values *params = -+ ((struct kbase_uk_prfcnt_values *)args); -+ gpu_model_set_dummy_prfcnt_sample(params->data, -+ params->size); -+ -+ break; -+ } -+#endif /* CONFIG_MALI_NO_MALI */ -+#ifdef BASE_LEGACY_UK10_4_SUPPORT -+ case KBASE_FUNC_TLSTREAM_ACQUIRE_V10_4: -+ { -+ struct kbase_uk_tlstream_acquire_v10_4 *tlstream_acquire -+ = args; -+ int ret; -+ -+ if (sizeof(*tlstream_acquire) != args_size) -+ goto bad_size; -+ -+ ret = kbase_tlstream_acquire( -+ kctx, 0); -+ if (ret < 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ tlstream_acquire->fd = ret; -+ break; -+ } -+#endif /* BASE_LEGACY_UK10_4_SUPPORT */ -+ case KBASE_FUNC_TLSTREAM_ACQUIRE: -+ { -+ struct kbase_uk_tlstream_acquire *tlstream_acquire = -+ args; -+ int ret; -+ -+ if (sizeof(*tlstream_acquire) != args_size) -+ goto bad_size; -+ -+ if (tlstream_acquire->flags & ~BASE_TLSTREAM_FLAGS_MASK) -+ goto out_bad; -+ -+ ret = kbase_tlstream_acquire( -+ kctx, tlstream_acquire->flags); -+ if (ret < 0) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ else -+ tlstream_acquire->fd = ret; -+ break; -+ } -+ case KBASE_FUNC_TLSTREAM_FLUSH: -+ { -+ struct kbase_uk_tlstream_flush *tlstream_flush = -+ args; -+ -+ if (sizeof(*tlstream_flush) != args_size) -+ goto bad_size; -+ -+ kbase_tlstream_flush_streams(); -+ break; -+ } -+#if MALI_UNIT_TEST -+ case KBASE_FUNC_TLSTREAM_TEST: -+ { -+ struct kbase_uk_tlstream_test *tlstream_test = args; -+ -+ if (sizeof(*tlstream_test) != args_size) -+ goto bad_size; -+ -+ kbase_tlstream_test( -+ tlstream_test->tpw_count, -+ tlstream_test->msg_delay, -+ tlstream_test->msg_count, -+ tlstream_test->aux_msg); -+ break; -+ } -+ case KBASE_FUNC_TLSTREAM_STATS: -+ { -+ struct kbase_uk_tlstream_stats *tlstream_stats = args; -+ -+ if (sizeof(*tlstream_stats) != args_size) -+ goto bad_size; -+ -+ kbase_tlstream_stats( -+ &tlstream_stats->bytes_collected, -+ &tlstream_stats->bytes_generated); -+ break; -+ } -+#endif /* MALI_UNIT_TEST */ -+ -+ case KBASE_FUNC_GET_CONTEXT_ID: -+ { -+ struct kbase_uk_context_id *info = args; -+ -+ info->id = kctx->id; -+ break; -+ } -+ -+ case KBASE_FUNC_SOFT_EVENT_UPDATE: -+ { -+ struct kbase_uk_soft_event_update *update = args; -+ -+ if (sizeof(*update) != args_size) -+ goto bad_size; -+ -+ if (((update->new_status != BASE_JD_SOFT_EVENT_SET) && -+ (update->new_status != BASE_JD_SOFT_EVENT_RESET)) || -+ (update->flags != 0)) -+ goto out_bad; -+ -+ if (kbase_soft_event_update(kctx, update->evt, -+ update->new_status)) -+ ukh->ret = MALI_ERROR_FUNCTION_FAILED; -+ -+ break; -+ } -+ -+ default: -+ dev_err(kbdev->dev, "unknown ioctl %u\n", id); -+ goto out_bad; -+ } -+ -+ return ret; -+ -+ bad_size: -+ dev_err(kbdev->dev, "Wrong syscall size (%d) for %08x\n", args_size, id); -+ out_bad: -+ return -EINVAL; -+} -+ -+ -+ - static struct kbase_device *to_kbase_device(struct device *dev) - { - return dev_get_drvdata(dev); -@@ -508,6 +1250,33 @@ - return 0; - } - -+#define CALL_MAX_SIZE 536 -+ -+static long kbase_legacy_ioctl(struct file *filp, unsigned int cmd, -+ unsigned long arg) -+{ -+ u64 msg[(CALL_MAX_SIZE + 7) >> 3] = { 0xdeadbeefdeadbeefull }; /* alignment fixup */ -+ u32 size = _IOC_SIZE(cmd); -+ struct kbase_context *kctx = filp->private_data; -+ -+ if (size > CALL_MAX_SIZE) -+ return -ENOTTY; -+ -+ if (0 != copy_from_user(&msg, (void __user *)arg, size)) { -+ dev_err(kctx->kbdev->dev, "failed to copy ioctl argument into kernel space\n"); -+ return -EFAULT; -+ } -+ -+ if (kbase_legacy_dispatch(kctx, &msg, size) != 0) -+ return -EFAULT; -+ -+ if (0 != copy_to_user((void __user *)arg, &msg, size)) { -+ dev_err(kctx->kbdev->dev, "failed to copy results of UK call back to user space\n"); -+ return -EFAULT; -+ } -+ return 0; -+} -+ - static int kbase_api_set_flags(struct kbase_context *kctx, - struct kbase_ioctl_set_flags *flags) - { -@@ -1067,6 +1836,20 @@ - struct kbase_device *kbdev = kctx->kbdev; - void __user *uarg = (void __user *)arg; - -+ /* The UK ioctl values overflow the cmd field causing the type to be -+ * incremented -+ */ -+ if (_IOC_TYPE(cmd) == LINUX_UK_BASE_MAGIC+2) -+ return kbase_legacy_ioctl(filp, cmd, arg); -+ -+ /* The UK version check IOCTL doesn't overflow the cmd field, so is -+ * handled separately here -+ */ -+ if (cmd == _IOC(_IOC_READ|_IOC_WRITE, LINUX_UK_BASE_MAGIC, -+ UKP_FUNC_ID_CHECK_VERSION, -+ sizeof(struct uku_version_check_args))) -+ return kbase_legacy_ioctl(filp, cmd, arg); -+ - /* Only these ioctls are available until setup is complete */ - switch (cmd) { - KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_VERSION_CHECK, -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c -index 9a9ce2d9..091d10f 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c -@@ -47,6 +47,55 @@ - #define KBASE_UBFX32(value, offset, size) \ - (((u32)(value) >> (u32)(offset)) & (u32)((1ULL << (u32)(size)) - 1)) - -+int kbase_gpuprops_uk_get_props(struct kbase_context *kctx, struct kbase_uk_gpuprops * const kbase_props) -+{ -+ typedef int (*kbase_gpu_clk_speed_func)(u32*); -+ kbase_gpu_clk_speed_func get_gpu_speed_mhz; -+ u32 gpu_speed_mhz; -+ int rc = 1; -+ -+ KBASE_DEBUG_ASSERT(NULL != kctx); -+ KBASE_DEBUG_ASSERT(NULL != kbase_props); -+ -+ /* Current GPU speed is requested from the system integrator via the GPU_SPEED_FUNC function. -+ * If that function fails, or the function is not provided by the system integrator, we report the maximum -+ * GPU speed as specified by GPU_FREQ_KHZ_MAX. -+ */ -+ get_gpu_speed_mhz = (kbase_gpu_clk_speed_func) NULL; -+ if (get_gpu_speed_mhz != NULL) { -+ rc = get_gpu_speed_mhz(&gpu_speed_mhz); -+#ifdef CONFIG_MALI_DEBUG -+ /* Issue a warning message when the reported GPU speed falls outside the min/max range */ -+ if (rc == 0) { -+ u32 gpu_speed_khz = gpu_speed_mhz * 1000; -+ -+ if (gpu_speed_khz < kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_min || -+ gpu_speed_khz > kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max) -+ dev_warn(kctx->kbdev->dev, "GPU Speed is outside of min/max range (got %lu Khz, min %lu Khz, max %lu Khz)\n", -+ (unsigned long)gpu_speed_khz, -+ (unsigned long)kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_min, -+ (unsigned long)kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max); -+ } -+#endif /* CONFIG_MALI_DEBUG */ -+ } -+ if (kctx->kbdev->clock) { -+ gpu_speed_mhz = clk_get_rate(kctx->kbdev->clock) / 1000000; -+ rc = 0; -+ } -+ if (rc != 0) -+ gpu_speed_mhz = kctx->kbdev->gpu_props.props.core_props.gpu_freq_khz_max / 1000; -+ -+ kctx->kbdev->gpu_props.props.core_props.gpu_speed_mhz = gpu_speed_mhz; -+ -+ memcpy(&kbase_props->props, &kctx->kbdev->gpu_props.props, sizeof(kbase_props->props)); -+ -+ /* Before API 8.2 they expect L3 cache info here, which was always 0 */ -+ if (kctx->api_version < KBASE_API_VERSION(8, 2)) -+ kbase_props->props.raw_props.suspend_size = 0; -+ -+ return 0; -+} -+ - static void kbase_gpuprops_construct_coherent_groups(base_gpu_props * const props) - { - struct mali_base_gpu_coherent_group *current_group; -@@ -288,9 +337,6 @@ - */ - gpu_props->raw_props.coherency_mode = regdump.coherency_features | - COHERENCY_FEATURE_BIT(COHERENCY_NONE); -- -- if (!kbase_hw_has_feature(kbdev, BASE_HW_FEATURE_THREAD_GROUP_SPLIT)) -- gpu_props->thread_props.max_thread_group_split = 0; - } - - static struct { -@@ -310,7 +356,6 @@ - PROP(TEXTURE_FEATURES_0, core_props.texture_features[0]), - PROP(TEXTURE_FEATURES_1, core_props.texture_features[1]), - PROP(TEXTURE_FEATURES_2, core_props.texture_features[2]), -- PROP(TEXTURE_FEATURES_3, core_props.texture_features[3]), - PROP(GPU_AVAILABLE_MEMORY_SIZE, core_props.gpu_available_memory_size), - - PROP(L2_LOG2_LINE_SIZE, l2_props.log2_line_size), -@@ -358,7 +403,6 @@ - PROP(RAW_TEXTURE_FEATURES_0, raw_props.texture_features[0]), - PROP(RAW_TEXTURE_FEATURES_1, raw_props.texture_features[1]), - PROP(RAW_TEXTURE_FEATURES_2, raw_props.texture_features[2]), -- PROP(RAW_TEXTURE_FEATURES_3, raw_props.texture_features[3]), - PROP(RAW_GPU_ID, raw_props.gpu_id), - PROP(RAW_THREAD_MAX_THREADS, raw_props.thread_max_threads), - PROP(RAW_THREAD_MAX_WORKGROUP_SIZE, -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.h -index 37d9c08..4c0c748 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.h -@@ -55,6 +55,18 @@ - void kbase_gpuprops_set_features(struct kbase_device *kbdev); - - /** -+ * @brief Provide GPU properties to userside through UKU call. -+ * -+ * Fill the struct kbase_uk_gpuprops with values from GPU configuration registers. -+ * -+ * @param kctx The struct kbase_context structure -+ * @param kbase_props A copy of the struct kbase_uk_gpuprops structure from userspace -+ * -+ * @return 0 on success. Any other value indicates failure. -+ */ -+int kbase_gpuprops_uk_get_props(struct kbase_context *kctx, struct kbase_uk_gpuprops * const kbase_props); -+ -+/** - * kbase_gpuprops_populate_user_buffer - Populate the GPU properties buffer - * @kbdev: The kbase device - * -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_ioctl.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_ioctl.h -index a8fe9cd..df125f0 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_ioctl.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_ioctl.h -@@ -32,6 +32,27 @@ - #define KBASE_IOCTL_TYPE 0x80 - - /* -+ * 10.1: -+ * - Do mmap in kernel for SAME_VA memory allocations rather then -+ * calling back into the kernel as a 2nd stage of the allocation request. -+ * -+ * 10.2: -+ * - Add KBASE_FUNC_MEM_JIT_INIT which allows clients to request a custom VA -+ * region for use with JIT (ignored on 32-bit platforms) -+ * -+ * 10.3: -+ * - base_jd_core_req typedef-ed to u32 (instead of to u16) -+ * - two flags added: BASE_JD_REQ_SKIP_CACHE_STAT / _END -+ * -+ * 10.4: -+ * - Removed KBASE_FUNC_EXT_BUFFER_LOCK used only in internal tests -+ * -+ * 10.5: -+ * - Reverted to performing mmap in user space so that tools like valgrind work. -+ * -+ * 10.6: -+ * - Add flags input variable to KBASE_FUNC_TLSTREAM_ACQUIRE -+ * - * 11.1: - * - Add BASE_MEM_TILER_ALIGN_TOP under base_mem_alloc_flags - * 11.2: -@@ -267,7 +288,6 @@ - * struct kbase_ioctl_get_ddk_version - Query the kernel version - * @version_buffer: Buffer to receive the kernel version string - * @size: Size of the buffer -- * @padding: Padding - * - * The ioctl will return the number of bytes written into version_buffer - * (which includes a NULL byte) or a negative error code -@@ -275,7 +295,6 @@ - struct kbase_ioctl_get_ddk_version { - __u64 version_buffer; - __u32 size; -- __u32 padding; - }; - - #define KBASE_IOCTL_GET_DDK_VERSION \ -@@ -495,12 +514,10 @@ - * struct kbase_ioctl_get_profiling_controls - Get the profiling controls - * @count: The size of @buffer in u32 words - * @buffer: The buffer to receive the profiling controls -- * @padding: Padding - */ - struct kbase_ioctl_get_profiling_controls { - __u64 buffer; - __u32 count; -- __u32 padding; - }; - - #define KBASE_IOCTL_GET_PROFILING_CONTROLS \ -@@ -775,9 +792,6 @@ - #define KBASE_GPUPROP_COHERENCY_GROUP_14 78 - #define KBASE_GPUPROP_COHERENCY_GROUP_15 79 - --#define KBASE_GPUPROP_TEXTURE_FEATURES_3 80 --#define KBASE_GPUPROP_RAW_TEXTURE_FEATURES_3 81 -- - #ifdef __cpluscplus - } - #endif -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_jd.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_jd.c -index 70277ad..11b035d 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_jd.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_jd.c -@@ -29,6 +29,7 @@ - #include - #endif - #include -+#include - #include - #include - #include -@@ -1142,6 +1143,12 @@ - break; - } - -+#ifdef BASE_LEGACY_UK10_2_SUPPORT -+ if (KBASE_API_VERSION(10, 3) > kctx->api_version) -+ user_atom.core_req = (u32)(user_atom.compat_core_req -+ & 0x7fff); -+#endif /* BASE_LEGACY_UK10_2_SUPPORT */ -+ - user_addr = (void __user *)((uintptr_t) user_addr + stride); - - mutex_lock(&jctx->lock); -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c -index 4e6668e..75f39ef 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c -@@ -49,7 +49,6 @@ - #include - #include - #include --#include - - static int kbase_tracking_page_setup(struct kbase_context *kctx, struct vm_area_struct *vma); - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_replay.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_replay.c -index 3d93922..3ba9344 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_replay.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_replay.c -@@ -777,6 +777,22 @@ - return -EINVAL; - } - -+#ifdef BASE_LEGACY_UK10_2_SUPPORT -+ if (KBASE_API_VERSION(10, 3) > replay_atom->kctx->api_version) { -+ base_jd_replay_payload_uk10_2 *payload_uk10_2; -+ u16 tiler_core_req; -+ u16 fragment_core_req; -+ -+ payload_uk10_2 = (base_jd_replay_payload_uk10_2 *) payload; -+ memcpy(&tiler_core_req, &payload_uk10_2->tiler_core_req, -+ sizeof(tiler_core_req)); -+ memcpy(&fragment_core_req, &payload_uk10_2->fragment_core_req, -+ sizeof(fragment_core_req)); -+ payload->tiler_core_req = (u32)(tiler_core_req & 0x7fff); -+ payload->fragment_core_req = (u32)(fragment_core_req & 0x7fff); -+ } -+#endif /* BASE_LEGACY_UK10_2_SUPPORT */ -+ - #ifdef CONFIG_MALI_DEBUG - dev_dbg(kctx->kbdev->dev, "kbasep_replay_parse_payload: payload=%p\n", payload); - dev_dbg(kctx->kbdev->dev, "Payload structure:\n" -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_uku.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_uku.h -new file mode 100644 -index 0000000..2363ef9 ---- /dev/null -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_uku.h -@@ -0,0 +1,506 @@ -+/* -+ * -+ * (C) COPYRIGHT 2008-2017 ARM Limited. All rights reserved. -+ * -+ * This program is free software and is provided to you under the terms of the -+ * GNU General Public License version 2 as published by the Free Software -+ * Foundation, and any use by you of this program is subject to the terms -+ * of such GNU licence. -+ * -+ * A copy of the licence is included with the program, and can also be obtained -+ * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -+ * Boston, MA 02110-1301, USA. -+ * -+ */ -+ -+ -+ -+#ifndef _KBASE_UKU_H_ -+#define _KBASE_UKU_H_ -+ -+#include "mali_uk.h" -+#include "mali_base_kernel.h" -+ -+/* This file needs to support being included from kernel and userside (which use different defines) */ -+#if defined(CONFIG_MALI_ERROR_INJECT) || MALI_ERROR_INJECT_ON -+#define SUPPORT_MALI_ERROR_INJECT -+#endif /* defined(CONFIG_MALI_ERROR_INJECT) || MALI_ERROR_INJECT_ON */ -+#if defined(CONFIG_MALI_NO_MALI) -+#define SUPPORT_MALI_NO_MALI -+#elif defined(MALI_NO_MALI) -+#if MALI_NO_MALI -+#define SUPPORT_MALI_NO_MALI -+#endif -+#endif -+ -+#if defined(SUPPORT_MALI_NO_MALI) || defined(SUPPORT_MALI_ERROR_INJECT) -+#include "backend/gpu/mali_kbase_model_dummy.h" -+#endif -+ -+#include "mali_kbase_gpuprops_types.h" -+ -+ -+#define LINUX_UK_BASE_MAGIC 0x80 -+ -+struct kbase_uk_mem_alloc { -+ union uk_header header; -+ /* IN */ -+ u64 va_pages; -+ u64 commit_pages; -+ u64 extent; -+ /* IN/OUT */ -+ u64 flags; -+ /* OUT */ -+ u64 gpu_va; -+ u16 va_alignment; -+ u8 padding[6]; -+}; -+ -+struct kbase_uk_mem_free { -+ union uk_header header; -+ /* IN */ -+ u64 gpu_addr; -+ /* OUT */ -+}; -+ -+struct kbase_uk_mem_alias { -+ union uk_header header; -+ /* IN/OUT */ -+ u64 flags; -+ /* IN */ -+ u64 stride; -+ u64 nents; -+ u64 ai; -+ /* OUT */ -+ u64 gpu_va; -+ u64 va_pages; -+}; -+ -+struct kbase_uk_mem_import { -+ union uk_header header; -+ /* IN */ -+ u64 phandle; -+ u32 type; -+ u32 padding; -+ /* IN/OUT */ -+ u64 flags; -+ /* OUT */ -+ u64 gpu_va; -+ u64 va_pages; -+}; -+ -+struct kbase_uk_mem_flags_change { -+ union uk_header header; -+ /* IN */ -+ u64 gpu_va; -+ u64 flags; -+ u64 mask; -+}; -+ -+struct kbase_uk_job_submit { -+ union uk_header header; -+ /* IN */ -+ u64 addr; -+ u32 nr_atoms; -+ u32 stride; /* bytes between atoms, i.e. sizeof(base_jd_atom_v2) */ -+ /* OUT */ -+}; -+ -+struct kbase_uk_post_term { -+ union uk_header header; -+}; -+ -+struct kbase_uk_sync_now { -+ union uk_header header; -+ -+ /* IN */ -+ struct base_syncset sset; -+ -+ /* OUT */ -+}; -+ -+struct kbase_uk_hwcnt_setup { -+ union uk_header header; -+ -+ /* IN */ -+ u64 dump_buffer; -+ u32 jm_bm; -+ u32 shader_bm; -+ u32 tiler_bm; -+ u32 unused_1; /* keep for backwards compatibility */ -+ u32 mmu_l2_bm; -+ u32 padding; -+ /* OUT */ -+}; -+ -+/** -+ * struct kbase_uk_hwcnt_reader_setup - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @buffer_count: requested number of dumping buffers -+ * @jm_bm: counters selection bitmask (JM) -+ * @shader_bm: counters selection bitmask (Shader) -+ * @tiler_bm: counters selection bitmask (Tiler) -+ * @mmu_l2_bm: counters selection bitmask (MMU_L2) -+ * @fd: dumping notification file descriptor -+ * -+ * This structure sets up HWC dumper/reader for this context. -+ * Multiple instances can be created for single context. -+ */ -+struct kbase_uk_hwcnt_reader_setup { -+ union uk_header header; -+ -+ /* IN */ -+ u32 buffer_count; -+ u32 jm_bm; -+ u32 shader_bm; -+ u32 tiler_bm; -+ u32 mmu_l2_bm; -+ -+ /* OUT */ -+ s32 fd; -+}; -+ -+struct kbase_uk_hwcnt_dump { -+ union uk_header header; -+}; -+ -+struct kbase_uk_hwcnt_clear { -+ union uk_header header; -+}; -+ -+struct kbase_uk_fence_validate { -+ union uk_header header; -+ /* IN */ -+ s32 fd; -+ u32 padding; -+ /* OUT */ -+}; -+ -+struct kbase_uk_stream_create { -+ union uk_header header; -+ /* IN */ -+ char name[32]; -+ /* OUT */ -+ s32 fd; -+ u32 padding; -+}; -+ -+struct kbase_uk_gpuprops { -+ union uk_header header; -+ -+ /* IN */ -+ struct base_gpu_props props; -+ /* OUT */ -+}; -+ -+struct kbase_uk_mem_query { -+ union uk_header header; -+ /* IN */ -+ u64 gpu_addr; -+#define KBASE_MEM_QUERY_COMMIT_SIZE 1 -+#define KBASE_MEM_QUERY_VA_SIZE 2 -+#define KBASE_MEM_QUERY_FLAGS 3 -+ u64 query; -+ /* OUT */ -+ u64 value; -+}; -+ -+struct kbase_uk_mem_commit { -+ union uk_header header; -+ /* IN */ -+ u64 gpu_addr; -+ u64 pages; -+ /* OUT */ -+ u32 result_subcode; -+ u32 padding; -+}; -+ -+struct kbase_uk_find_cpu_offset { -+ union uk_header header; -+ /* IN */ -+ u64 gpu_addr; -+ u64 cpu_addr; -+ u64 size; -+ /* OUT */ -+ u64 offset; -+}; -+ -+#define KBASE_GET_VERSION_BUFFER_SIZE 64 -+struct kbase_uk_get_ddk_version { -+ union uk_header header; -+ /* OUT */ -+ char version_buffer[KBASE_GET_VERSION_BUFFER_SIZE]; -+ u32 version_string_size; -+ u32 padding; -+}; -+ -+struct kbase_uk_disjoint_query { -+ union uk_header header; -+ /* OUT */ -+ u32 counter; -+ u32 padding; -+}; -+ -+struct kbase_uk_set_flags { -+ union uk_header header; -+ /* IN */ -+ u32 create_flags; -+ u32 padding; -+}; -+ -+#if MALI_UNIT_TEST -+#define TEST_ADDR_COUNT 4 -+#define KBASE_TEST_BUFFER_SIZE 128 -+struct kbase_exported_test_data { -+ u64 test_addr[TEST_ADDR_COUNT]; /**< memory address */ -+ u32 test_addr_pages[TEST_ADDR_COUNT]; /**< memory size in pages */ -+ u64 kctx; /**< base context created by process */ -+ u64 mm; /**< pointer to process address space */ -+ u8 buffer1[KBASE_TEST_BUFFER_SIZE]; /**< unit test defined parameter */ -+ u8 buffer2[KBASE_TEST_BUFFER_SIZE]; /**< unit test defined parameter */ -+}; -+ -+struct kbase_uk_set_test_data { -+ union uk_header header; -+ /* IN */ -+ struct kbase_exported_test_data test_data; -+}; -+ -+#endif /* MALI_UNIT_TEST */ -+ -+#ifdef SUPPORT_MALI_ERROR_INJECT -+struct kbase_uk_error_params { -+ union uk_header header; -+ /* IN */ -+ struct kbase_error_params params; -+}; -+#endif /* SUPPORT_MALI_ERROR_INJECT */ -+ -+#ifdef SUPPORT_MALI_NO_MALI -+struct kbase_uk_model_control_params { -+ union uk_header header; -+ /* IN */ -+ struct kbase_model_control_params params; -+}; -+#endif /* SUPPORT_MALI_NO_MALI */ -+ -+struct kbase_uk_profiling_controls { -+ union uk_header header; -+ u32 profiling_controls[FBDUMP_CONTROL_MAX]; -+}; -+ -+struct kbase_uk_debugfs_mem_profile_add { -+ union uk_header header; -+ u32 len; -+ u32 padding; -+ u64 buf; -+}; -+ -+struct kbase_uk_context_id { -+ union uk_header header; -+ /* OUT */ -+ int id; -+}; -+ -+/** -+ * struct kbase_uk_tlstream_acquire - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @flags: timeline stream flags -+ * @fd: timeline stream file descriptor -+ * -+ * This structure is used when performing a call to acquire kernel side timeline -+ * stream file descriptor. -+ */ -+struct kbase_uk_tlstream_acquire { -+ union uk_header header; -+ /* IN */ -+ u32 flags; -+ /* OUT */ -+ s32 fd; -+}; -+ -+/** -+ * struct kbase_uk_tlstream_acquire_v10_4 - User/Kernel space data exchange -+ * structure -+ * @header: UK structure header -+ * @fd: timeline stream file descriptor -+ * -+ * This structure is used when performing a call to acquire kernel side timeline -+ * stream file descriptor. -+ */ -+struct kbase_uk_tlstream_acquire_v10_4 { -+ union uk_header header; -+ /* IN */ -+ /* OUT */ -+ s32 fd; -+}; -+ -+/** -+ * struct kbase_uk_tlstream_flush - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * -+ * This structure is used when performing a call to flush kernel side -+ * timeline streams. -+ */ -+struct kbase_uk_tlstream_flush { -+ union uk_header header; -+ /* IN */ -+ /* OUT */ -+}; -+ -+#if MALI_UNIT_TEST -+/** -+ * struct kbase_uk_tlstream_test - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @tpw_count: number of trace point writers in each context -+ * @msg_delay: time delay between tracepoints from one writer in milliseconds -+ * @msg_count: number of trace points written by one writer -+ * @aux_msg: if non-zero aux messages will be included -+ * -+ * This structure is used when performing a call to start timeline stream test -+ * embedded in kernel. -+ */ -+struct kbase_uk_tlstream_test { -+ union uk_header header; -+ /* IN */ -+ u32 tpw_count; -+ u32 msg_delay; -+ u32 msg_count; -+ u32 aux_msg; -+ /* OUT */ -+}; -+ -+/** -+ * struct kbase_uk_tlstream_stats - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @bytes_collected: number of bytes read by user -+ * @bytes_generated: number of bytes generated by tracepoints -+ * -+ * This structure is used when performing a call to obtain timeline stream -+ * statistics. -+ */ -+struct kbase_uk_tlstream_stats { -+ union uk_header header; /**< UK structure header. */ -+ /* IN */ -+ /* OUT */ -+ u32 bytes_collected; -+ u32 bytes_generated; -+}; -+#endif /* MALI_UNIT_TEST */ -+ -+/** -+ * struct struct kbase_uk_prfcnt_value for the KBASE_FUNC_SET_PRFCNT_VALUES ioctl -+ * @header: UK structure header -+ * @data: Counter samples for the dummy model -+ * @size:............Size of the counter sample data -+ */ -+struct kbase_uk_prfcnt_values { -+ union uk_header header; -+ /* IN */ -+ u32 *data; -+ u32 size; -+}; -+ -+/** -+ * struct kbase_uk_soft_event_update - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @evt: the GPU address containing the event -+ * @new_status: the new event status, must be either BASE_JD_SOFT_EVENT_SET or -+ * BASE_JD_SOFT_EVENT_RESET -+ * @flags: reserved for future uses, must be set to 0 -+ * -+ * This structure is used to update the status of a software event. If the -+ * event's status is set to BASE_JD_SOFT_EVENT_SET, any job currently waiting -+ * on this event will complete. -+ */ -+struct kbase_uk_soft_event_update { -+ union uk_header header; -+ /* IN */ -+ u64 evt; -+ u32 new_status; -+ u32 flags; -+}; -+ -+/** -+ * struct kbase_uk_mem_jit_init - User/Kernel space data exchange structure -+ * @header: UK structure header -+ * @va_pages: Number of virtual pages required for JIT -+ * -+ * This structure is used when requesting initialization of JIT. -+ */ -+struct kbase_uk_mem_jit_init { -+ union uk_header header; -+ /* IN */ -+ u64 va_pages; -+}; -+ -+enum kbase_uk_function_id { -+ KBASE_FUNC_MEM_ALLOC = (UK_FUNC_ID + 0), -+ KBASE_FUNC_MEM_IMPORT = (UK_FUNC_ID + 1), -+ KBASE_FUNC_MEM_COMMIT = (UK_FUNC_ID + 2), -+ KBASE_FUNC_MEM_QUERY = (UK_FUNC_ID + 3), -+ KBASE_FUNC_MEM_FREE = (UK_FUNC_ID + 4), -+ KBASE_FUNC_MEM_FLAGS_CHANGE = (UK_FUNC_ID + 5), -+ KBASE_FUNC_MEM_ALIAS = (UK_FUNC_ID + 6), -+ -+ /* UK_FUNC_ID + 7 not in use since BASE_LEGACY_UK6_SUPPORT dropped */ -+ -+ KBASE_FUNC_SYNC = (UK_FUNC_ID + 8), -+ -+ KBASE_FUNC_POST_TERM = (UK_FUNC_ID + 9), -+ -+ KBASE_FUNC_HWCNT_SETUP = (UK_FUNC_ID + 10), -+ KBASE_FUNC_HWCNT_DUMP = (UK_FUNC_ID + 11), -+ KBASE_FUNC_HWCNT_CLEAR = (UK_FUNC_ID + 12), -+ -+ KBASE_FUNC_GPU_PROPS_REG_DUMP = (UK_FUNC_ID + 14), -+ -+ KBASE_FUNC_FIND_CPU_OFFSET = (UK_FUNC_ID + 15), -+ -+ KBASE_FUNC_GET_VERSION = (UK_FUNC_ID + 16), -+ KBASE_FUNC_SET_FLAGS = (UK_FUNC_ID + 18), -+ -+ KBASE_FUNC_SET_TEST_DATA = (UK_FUNC_ID + 19), -+ KBASE_FUNC_INJECT_ERROR = (UK_FUNC_ID + 20), -+ KBASE_FUNC_MODEL_CONTROL = (UK_FUNC_ID + 21), -+ -+ /* UK_FUNC_ID + 22 not in use since BASE_LEGACY_UK8_SUPPORT dropped */ -+ -+ KBASE_FUNC_FENCE_VALIDATE = (UK_FUNC_ID + 23), -+ KBASE_FUNC_STREAM_CREATE = (UK_FUNC_ID + 24), -+ KBASE_FUNC_GET_PROFILING_CONTROLS = (UK_FUNC_ID + 25), -+ KBASE_FUNC_SET_PROFILING_CONTROLS = (UK_FUNC_ID + 26), -+ /* to be used only for testing -+ * purposes, otherwise these controls -+ * are set through gator API */ -+ -+ KBASE_FUNC_DEBUGFS_MEM_PROFILE_ADD = (UK_FUNC_ID + 27), -+ KBASE_FUNC_JOB_SUBMIT = (UK_FUNC_ID + 28), -+ KBASE_FUNC_DISJOINT_QUERY = (UK_FUNC_ID + 29), -+ -+ KBASE_FUNC_GET_CONTEXT_ID = (UK_FUNC_ID + 31), -+ -+ KBASE_FUNC_TLSTREAM_ACQUIRE_V10_4 = (UK_FUNC_ID + 32), -+#if MALI_UNIT_TEST -+ KBASE_FUNC_TLSTREAM_TEST = (UK_FUNC_ID + 33), -+ KBASE_FUNC_TLSTREAM_STATS = (UK_FUNC_ID + 34), -+#endif /* MALI_UNIT_TEST */ -+ KBASE_FUNC_TLSTREAM_FLUSH = (UK_FUNC_ID + 35), -+ -+ KBASE_FUNC_HWCNT_READER_SETUP = (UK_FUNC_ID + 36), -+ -+#ifdef SUPPORT_MALI_NO_MALI -+ KBASE_FUNC_SET_PRFCNT_VALUES = (UK_FUNC_ID + 37), -+#endif -+ -+ KBASE_FUNC_SOFT_EVENT_UPDATE = (UK_FUNC_ID + 38), -+ -+ KBASE_FUNC_MEM_JIT_INIT = (UK_FUNC_ID + 39), -+ -+ KBASE_FUNC_TLSTREAM_ACQUIRE = (UK_FUNC_ID + 40), -+ -+ KBASE_FUNC_MAX -+}; -+ -+#endif /* _KBASE_UKU_H_ */ -+ -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_vinstr.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_vinstr.h -index af7c7b6..c7cf33d 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_vinstr.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_vinstr.h -@@ -30,29 +30,6 @@ - struct kbase_vinstr_context; - struct kbase_vinstr_client; - --struct kbase_uk_hwcnt_setup { -- /* IN */ -- u64 dump_buffer; -- u32 jm_bm; -- u32 shader_bm; -- u32 tiler_bm; -- u32 unused_1; /* keep for backwards compatibility */ -- u32 mmu_l2_bm; -- u32 padding; -- /* OUT */ --}; -- --struct kbase_uk_hwcnt_reader_setup { -- /* IN */ -- u32 buffer_count; -- u32 jm_bm; -- u32 shader_bm; -- u32 tiler_bm; -- u32 mmu_l2_bm; -- -- /* OUT */ -- s32 fd; --}; - /*****************************************************************************/ - - /** -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_midg_regmap.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_midg_regmap.h -index 5e83ee8..3e698753 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_midg_regmap.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_midg_regmap.h -@@ -97,7 +97,6 @@ - #define TEXTURE_FEATURES_0 0x0B0 /* (RO) Support flags for indexed texture formats 0..31 */ - #define TEXTURE_FEATURES_1 0x0B4 /* (RO) Support flags for indexed texture formats 32..63 */ - #define TEXTURE_FEATURES_2 0x0B8 /* (RO) Support flags for indexed texture formats 64..95 */ --#define TEXTURE_FEATURES_3 0x0BC /* (RO) Support flags for texture order */ - - #define TEXTURE_FEATURES_REG(n) GPU_CONTROL_REG(TEXTURE_FEATURES_0 + ((n) << 2)) - diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/03-gpu-arm-Midgard-setup_timer-timer_setup.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/03-gpu-arm-Midgard-setup_timer-timer_setup.patch deleted file mode 100644 index f7d450afd9..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/03-gpu-arm-Midgard-setup_timer-timer_setup.patch +++ /dev/null @@ -1,98 +0,0 @@ -From ee7f0a678fff8316ec0be973f1b3780a63f50942 Mon Sep 17 00:00:00 2001 -From: Myy Miouyouyou -Date: Mon, 11 Dec 2017 21:04:56 +0100 -Subject: [PATCH] gpu: arm: Midgard: setup_timer() -> timer_setup() - -This patch is due the changes provoked by series of commit ending -at 513ae785c63c30741e46f43960213d4ae5382ec0, and removing the -setup_timer macros. -The previous patches replaced made sure that timers were all set -up with setup_timer and replaced setup_timer calls by timer_setup -calls. - -This changed was introduced in the 4.15-rc1. - -Signed-off-by: Myy Miouyouyou ---- - drivers/gpu/arm/midgard/mali_kbase.h | 2 +- - drivers/gpu/arm/midgard/mali_kbase_context.c | 4 ++-- - drivers/gpu/arm/midgard/mali_kbase_softjobs.c | 4 ++-- - drivers/gpu/arm/midgard/mali_kbase_tlstream.c | 6 ++---- - 4 files changed, 7 insertions(+), 9 deletions(-) - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -index a4ceab9e0..27bde3b71 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase.h -@@ -213,7 +213,7 @@ int kbase_soft_event_update(struct kbase_context *kctx, - - bool kbase_replay_process(struct kbase_jd_atom *katom); - --void kbasep_soft_job_timeout_worker(unsigned long data); -+void kbasep_soft_job_timeout_worker(struct timer_list *t); - void kbasep_complete_triggered_soft_events(struct kbase_context *kctx, u64 evt); - - /* api used internally for register access. Contains validation and tracing */ -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_context.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_context.c -index f43db48fd..589df768c 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_context.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_context.c -@@ -165,9 +165,9 @@ kbase_create_context(struct kbase_device *kbdev, bool is_compat) - - mutex_init(&kctx->vinstr_cli_lock); - -- setup_timer(&kctx->soft_job_timeout, -+ timer_setup(&kctx->soft_job_timeout, - kbasep_soft_job_timeout_worker, -- (uintptr_t)kctx); -+ 0); - - return kctx; - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_softjobs.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_softjobs.c -index 127ada07f..019edf562 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_softjobs.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_softjobs.c -@@ -370,9 +370,9 @@ static void kbase_fence_debug_timeout(struct kbase_jd_atom *katom) - } - #endif /* CONFIG_MALI_FENCE_DEBUG */ - --void kbasep_soft_job_timeout_worker(unsigned long data) -+void kbasep_soft_job_timeout_worker(struct timer_list *t) - { -- struct kbase_context *kctx = (struct kbase_context *)data; -+ struct kbase_context *kctx = from_timer(kctx, t, soft_job_timeout); - u32 timeout_ms = (u32)atomic_read( - &kctx->kbdev->js_data.soft_job_timeout_ms); - struct timer_list *timer = &kctx->soft_job_timeout; -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_tlstream.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_tlstream.c -index d01aa23b2..11d8b59c7 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_tlstream.c -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_tlstream.c -@@ -1042,13 +1042,11 @@ static void kbasep_tlstream_flush_stream(enum tl_stream_type stype) - * Timer is executed periodically to check if any of the stream contains - * buffer ready to be submitted to user space. - */ --static void kbasep_tlstream_autoflush_timer_callback(unsigned long data) -+static void kbasep_tlstream_autoflush_timer_callback(struct timer_list *unused) - { - enum tl_stream_type stype; - int rcode; - -- CSTD_UNUSED(data); -- - for (stype = 0; stype < TL_STREAM_TYPE_COUNT; stype++) { - struct tl_stream *stream = tl_stream[stype]; - unsigned long flags; -@@ -1371,7 +1369,7 @@ int kbase_tlstream_init(void) - - /* Initialize autoflush timer. */ - atomic_set(&autoflush_timer_active, 0); -- setup_timer(&autoflush_timer, -+ timer_setup(&autoflush_timer, - kbasep_tlstream_autoflush_timer_callback, - 0); - --- -2.14.1 - diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/04-drivers-gpu-Arm-Midgard-Replace-ACCESS_ONCE-by-READ_.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/04-drivers-gpu-Arm-Midgard-Replace-ACCESS_ONCE-by-READ_.patch deleted file mode 100644 index 113c53d11c..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/04-drivers-gpu-Arm-Midgard-Replace-ACCESS_ONCE-by-READ_.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 44a5ba2e969adfb64c84f294c16490194988dcc7 Mon Sep 17 00:00:00 2001 -From: Myy Miouyouyou -Date: Sun, 24 Dec 2017 19:30:12 +0100 -Subject: [PATCH] drivers: gpu: Arm: Midgard: Replace ACCESS_ONCE by READ_ONCE - -The ACCESS_ONCE macro has now been removed in the 4.15.0-rc4, -and every ACCESS_ONCE call has been replaced by either READ_ONCE or -WRITE_ONCE calls. -Since the Midgard GPU drivers are not mainlined, the change -needs to be applied manually. - -See commit b899a850431e2dd0943205a63a68573f3e312d0d and its parents, -for more informations. - -Signed-off-by: Myy Miouyouyou ---- - drivers/gpu/arm/midgard/mali_kbase_mem.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem.h b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem.h -index e9a8d5dd6..eac685699 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem.h -@@ -591,7 +591,7 @@ void kbase_mem_pool_free_pages(struct kbase_mem_pool *pool, size_t nr_pages, - */ - static inline size_t kbase_mem_pool_size(struct kbase_mem_pool *pool) - { -- return ACCESS_ONCE(pool->cur_size); -+ return READ_ONCE(pool->cur_size); - } - - /** --- -2.14.1 - diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/05-gpu-arm-midgard-Remove-sys_close-references.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/05-gpu-arm-midgard-Remove-sys_close-references.patch deleted file mode 100644 index cbf74b7271..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/05-gpu-arm-midgard-Remove-sys_close-references.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 47e8aad9419ff8843a373c3e5aa2c9d261d8cd07 Mon Sep 17 00:00:00 2001 -From: Myy Miouyouyou -Date: Mon, 23 Apr 2018 20:54:13 +0200 -Subject: [PATCH] gpu: arm: midgard: Remove sys_close references - -sys_close is now replaced by ksys_close in an effort to remove -in-kernel system calls references. - -See 2ca2a09d6215fd9621aa3e2db7cc9428a61f2911 and -https://lkml.org/lkml/2018/3/25/93 for more details. - -Signed-off-by: Myy Miouyouyou ---- - drivers/gpu/arm/midgard/mali_kbase_sync.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_sync.h b/drivers/gpu/arm/midgard/mali_kbase_sync.h -index de72147d..33b58059 100644 ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_sync.h -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_sync.h -@@ -156,7 +156,7 @@ void kbase_sync_fence_out_remove(struct kbase_jd_atom *katom); - */ - static inline void kbase_sync_fence_close_fd(int fd) - { -- sys_close(fd); -+ ksys_close(fd); - } - - /** --- -2.14.1 - diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/06-fix-4.20-build.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/06-fix-4.20-build.patch deleted file mode 100644 index 86711dcde5..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/06-fix-4.20-build.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c c/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c 2018-12-01 17:49:08.000000000 +0100 -+++ c/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_mem_linux.c 2018-12-01 20:27:42.057964019 +0100 -@@ -1668,6 +1668,7 @@ - struct kbase_cpu_mapping *map = vma->vm_private_data; - pgoff_t rel_pgoff; - size_t i; -+ int ret = VM_FAULT_SIGBUS; - pgoff_t addr; - - KBASE_DEBUG_ASSERT(map); -@@ -1693,9 +1694,9 @@ - addr = (pgoff_t)(vmf->address >> PAGE_SHIFT); - #endif - while (i < map->alloc->nents && (addr < vma->vm_end >> PAGE_SHIFT)) { -- int ret = vm_insert_pfn(vma, addr << PAGE_SHIFT, -+ ret = vmf_insert_pfn(vma, addr << PAGE_SHIFT, - PFN_DOWN(as_phys_addr_t(map->alloc->pages[i]))); -- if (ret < 0 && ret != -EBUSY) -+ if (unlikely(ret & VM_FAULT_ERROR)) - goto locked_bad_fault; - - i++; addr++; -@@ -1707,7 +1708,7 @@ - - locked_bad_fault: - kbase_gpu_vm_unlock(map->kctx); -- return VM_FAULT_SIGBUS; -+ return ret; - } - - const struct vm_operations_struct kbase_vm_ops = { -@@ -1776,10 +1777,11 @@ - phys_addr_t phys; - - phys = as_phys_addr_t(page_array[i + start_off]); -- err = vm_insert_pfn(vma, addr, PFN_DOWN(phys)); -- if (WARN_ON(err)) -+ err = vmf_insert_pfn(vma, addr, PFN_DOWN(phys)); -+ if (unlikely(WARN_ON(err & VM_FAULT_ERROR))) - break; - -+ err = 0; - addr += PAGE_SIZE; - } - } else { -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_smc.c c/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_smc.c ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_smc.c 2018-01-13 23:26:00.000000000 +0100 -+++ c/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_smc.c 2018-12-01 20:03:30.071690693 +0100 -@@ -27,6 +27,10 @@ - - #include - -+#ifndef __asmeq -+#define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t" -+#endif -+ - static noinline u64 invoke_smc_fid(u64 function_id, - u64 arg0, u64 arg1, u64 arg2) - { diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/07-some-fixes.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/07-some-fixes.patch deleted file mode 100644 index 5875804fa1..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/07-some-fixes.patch +++ /dev/null @@ -1,30 +0,0 @@ -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c 2018-12-01 21:10:15.000000000 +0100 -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_core_linux.c 2018-12-01 23:28:48.956901556 +0100 -@@ -3815,12 +3815,18 @@ - "Continuing without Mali regulator control\n"); - /* Allow probe to continue without regulator */ - } -+ err = regulator_enable(kbdev->regulator); -+ if (err) { -+ dev_err(kbdev->dev, "Failed to enable regulator\n"); -+ return err; -+ } - #endif /* LINUX_VERSION_CODE >= 3, 12, 0 */ - - kbdev->mali_rst = of_reset_control_get_by_index(kbdev->dev->of_node, 0); - if (IS_ERR(kbdev->mali_rst)) { - dev_err(kbdev->dev, "Couldn't get mali reset line\n"); - err = PTR_ERR(kbdev->mali_rst); -+ kbdev->mali_rst = NULL; - goto fail; - } - -@@ -3828,6 +3834,7 @@ - if (IS_ERR(kbdev->bus_clk)) { - dev_err(kbdev->dev, "Couldn't get the mali bus clock\n"); - err = PTR_ERR(kbdev->bus_clk); -+ kbdev->bus_clk = NULL; - goto fail; - } - diff --git a/packages/linux-drivers/gpu-sunxi-midgard/patches/08-fix-building-with-5.0.patch b/packages/linux-drivers/gpu-sunxi-midgard/patches/08-fix-building-with-5.0.patch deleted file mode 100644 index aedb6968eb..0000000000 --- a/packages/linux-drivers/gpu-sunxi-midgard/patches/08-fix-building-with-5.0.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -Nur a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c ---- a/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c 2019-02-09 23:20:20.000000000 +0100 -+++ b/driver/product/kernel/drivers/gpu/arm/midgard/mali_kbase_gpuprops.c 2019-02-10 08:26:47.874751287 +0100 -@@ -243,7 +243,11 @@ - /* Populate the base_gpu_props structure */ - kbase_gpuprops_update_core_props_gpu_id(gpu_props); - gpu_props->core_props.log2_program_counter_size = KBASE_GPU_PC_SIZE_LOG2; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) -+ gpu_props->core_props.gpu_available_memory_size = totalram_pages() << PAGE_SHIFT; -+#else - gpu_props->core_props.gpu_available_memory_size = totalram_pages << PAGE_SHIFT; -+#endif - - for (i = 0; i < BASE_GPU_NUM_TEXTURE_FEATURES_REGISTERS; i++) - gpu_props->core_props.texture_features[i] = gpu_props->raw_props.texture_features[i]; diff --git a/packages/linux-drivers/gpu-sunxi/package.mk b/packages/linux-drivers/gpu-sunxi/package.mk deleted file mode 100644 index aac4417ae3..0000000000 --- a/packages/linux-drivers/gpu-sunxi/package.mk +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0 -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -PKG_NAME="gpu-sunxi" -PKG_VERSION="r9p0-01rel0" -PKG_SHA256="7a67127341d17640c1fff5dad80258fb2a37c8a2121b81525fe2327e4532ce2b" -PKG_ARCH="arm aarch64" -PKG_LICENSE="GPL" -PKG_SITE="https://developer.arm.com/products/software/mali-drivers/utgard-kernel" -PKG_URL="https://developer.arm.com/-/media/Files/downloads/mali-drivers/kernel/mali-utgard-gpu/DX910-SW-99002-$PKG_VERSION.tgz" -PKG_DEPENDS_TARGET="toolchain linux" -PKG_NEED_UNPACK="$LINUX_DEPENDS" -PKG_LONGDESC="gpu-sunxi: Linux drivers for Mali GPUs found in Allwinner SoCs" -PKG_TOOLCHAIN="manual" -PKG_IS_KERNEL_PKG="yes" - -make_target() { - kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/src/devicedrv/mali/ \ - MALI_PLATFORM_FILES=platform/sunxi/sunxi.c \ - EXTRA_CFLAGS="-DMALI_FAKE_PLATFORM_DEVICE=1 -DCONFIG_MALI_DMA_BUF_MAP_ON_ATTACH" \ - CONFIG_MALI400=m -} - -makeinstall_target() { - kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/src/devicedrv/mali/ \ - INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ - modules_install -} diff --git a/packages/linux-drivers/gpu-sunxi/patches/add-sunxi-platform.patch b/packages/linux-drivers/gpu-sunxi/patches/add-sunxi-platform.patch deleted file mode 100644 index 4deaa9edb1..0000000000 --- a/packages/linux-drivers/gpu-sunxi/patches/add-sunxi-platform.patch +++ /dev/null @@ -1,426 +0,0 @@ -From 2b56fc78a4acbffbdebf5b690035d1ba70ef592c Mon Sep 17 00:00:00 2001 -From: Maxime Ripard -Date: Tue, 29 Nov 2016 10:18:40 +0100 -Subject: [PATCH 4/4] mali: Add sunxi platform - -Add a platform for the Mali GPU integrated in the Allwinner SoCs. - -Signed-off-by: Maxime Ripard ---- - src/devicedrv/mali/platform/sunxi/sunxi.c | 404 +++++++++++++++++++++++ - 1 file changed, 404 insertions(+) - create mode 100644 src/devicedrv/mali/platform/sunxi/sunxi.c - ---- /dev/null -+++ b/driver/src/devicedrv/mali/platform/sunxi/sunxi.c -@@ -0,0 +1,410 @@ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+ -+#include "mali_kernel_linux.h" -+ -+struct mali { -+ struct clk *bus_clk; -+ struct clk *core_clk; -+ -+ struct reset_control *reset; -+ -+ struct platform_device *dev; -+}; -+ -+struct mali *mali; -+ -+struct resource *mali_create_mp1_resources(unsigned long address, -+ int irq_gp, int irq_gpmmu, -+ int irq_pp0, int irq_ppmmu0, -+ int *len) -+{ -+ struct resource target[] = { -+ MALI_GPU_RESOURCES_MALI400_MP1_PMU(address, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0) -+ }; -+ struct resource *res; -+ -+ res = kzalloc(sizeof(target), GFP_KERNEL); -+ if (!res) -+ return NULL; -+ -+ memcpy(res, target, sizeof(target)); -+ -+ *len = ARRAY_SIZE(target); -+ -+ return res; -+} -+ -+struct resource *mali_create_mp2_resources(unsigned long address, -+ int irq_gp, int irq_gpmmu, -+ int irq_pp0, int irq_ppmmu0, -+ int irq_pp1, int irq_ppmmu1, -+ int *len) -+{ -+ struct resource target[] = { -+ MALI_GPU_RESOURCES_MALI400_MP2_PMU(address, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0, -+ irq_pp1, irq_ppmmu1) -+ }; -+ struct resource *res; -+ -+ res = kzalloc(sizeof(target), GFP_KERNEL); -+ if (!res) -+ return NULL; -+ -+ memcpy(res, target, sizeof(target)); -+ -+ *len = ARRAY_SIZE(target); -+ -+ return res; -+} -+ -+struct resource *mali_create_450mp4_resources(unsigned long address, -+ int irq_gp, int irq_gpmmu, -+ int irq_pp0, int irq_ppmmu0, -+ int irq_pp1, int irq_ppmmu1, -+ int irq_pp2, int irq_ppmmu2, -+ int irq_pp3, int irq_ppmmu3, -+ int irq_pp, int *len) -+{ -+ struct resource target[] = { -+ MALI_GPU_RESOURCES_MALI450_MP4(address, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0, -+ irq_pp1, irq_ppmmu1, -+ irq_pp2, irq_ppmmu2, -+ irq_pp3, irq_ppmmu3, -+ irq_pp) -+ }; -+ struct resource *res; -+ -+ res = kzalloc(sizeof(target), GFP_KERNEL); -+ if (!res) -+ return NULL; -+ -+ memcpy(res, target, sizeof(target)); -+ -+ *len = ARRAY_SIZE(target); -+ -+ return res; -+} -+ -+static const struct of_device_id mali_dt_ids[] = { -+ { .compatible = "allwinner,sun4i-a10-mali" }, -+ { .compatible = "allwinner,sun7i-a20-mali" }, -+ { .compatible = "allwinner,sun8i-h3-mali" }, -+ { .compatible = "allwinner,sun50i-a64-mali" }, -+ { .compatible = "allwinner,sun50i-h5-mali" }, -+ { .compatible = "arm,mali-400" }, -+ { .compatible = "arm,mali-450" }, -+ { /* sentinel */ }, -+}; -+MODULE_DEVICE_TABLE(of, mali_dt_ids); -+ -+static struct mali_gpu_device_data mali_gpu_data = { -+ .max_job_runtime = 60000, -+}; -+int mali_platform_device_register(void) -+{ -+ int irq_gp, irq_gpmmu; -+ int irq_pp0, irq_ppmmu0; -+ int irq_pp1 = -EINVAL, irq_ppmmu1 = -EINVAL; -+ int irq_pp2 = -EINVAL, irq_ppmmu2 = -EINVAL; -+ int irq_pp3 = -EINVAL, irq_ppmmu3 = -EINVAL; -+ int irq_pp = -EINVAL; -+ int irq_pmu; -+ struct resource *mali_res = NULL, res; -+ struct device_node *np; -+ struct device *dev; -+ int ret, len; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) -+ mali_gpu_data.shared_mem_size = totalram_pages() * PAGE_SIZE; -+#else -+ mali_gpu_data.shared_mem_size = totalram_pages * PAGE_SIZE; -+#endif -+ -+ np = of_find_matching_node(NULL, mali_dt_ids); -+ if (!np) { -+ pr_err("Couldn't find the mali node\n"); -+ return -ENODEV; -+ } -+ -+ mali = kzalloc(sizeof(*mali), GFP_KERNEL); -+ if (!mali) { -+ ret = -ENOMEM; -+ goto err_put_node; -+ } -+ -+ ret = of_clk_set_defaults(np, false); -+ if (ret) { -+ pr_err("Couldn't set clock defaults\n"); -+ goto err_free_mem; -+ } -+ -+ mali->bus_clk = of_clk_get_by_name(np, "bus"); -+ if (IS_ERR(mali->bus_clk)) { -+ pr_err("Couldn't retrieve our bus clock\n"); -+ ret = PTR_ERR(mali->bus_clk); -+ goto err_free_mem; -+ } -+ clk_prepare_enable(mali->bus_clk); -+ -+ mali->core_clk = of_clk_get_by_name(np, "core"); -+ if (IS_ERR(mali->core_clk)) { -+ pr_err("Couldn't retrieve our module clock\n"); -+ ret = PTR_ERR(mali->core_clk); -+ goto err_put_bus; -+ } -+ clk_prepare_enable(mali->core_clk); -+ -+ if (of_device_is_compatible(np, "allwinner,sun4i-a10-mali") || -+ of_device_is_compatible(np, "allwinner,sun7i-a20-mali") || -+ of_device_is_compatible(np, "allwinner,sun8i-h3-mali") || -+ of_device_is_compatible(np, "allwinner,sun50i-a64-mali") || -+ of_device_is_compatible(np, "allwinner,sun50i-h5-mali")) { -+ mali->reset = of_reset_control_get(np, NULL); -+ if (IS_ERR(mali->reset)) { -+ pr_err("Couldn't retrieve our reset handle\n"); -+ ret = PTR_ERR(mali->reset); -+ goto err_put_mod; -+ } -+ reset_control_deassert(mali->reset); -+ } -+ -+ ret = of_address_to_resource(np, 0, &res); -+ if (ret) { -+ pr_err("Couldn't retrieve our base address\n"); -+ goto err_put_reset; -+ } -+ -+ irq_gp = of_irq_get_byname(np, "gp"); -+ if (irq_gp < 0) { -+ pr_err("Couldn't retrieve our GP interrupt\n"); -+ ret = irq_gp; -+ goto err_put_reset; -+ } -+ -+ irq_gpmmu = of_irq_get_byname(np, "gpmmu"); -+ if (irq_gpmmu < 0) { -+ pr_err("Couldn't retrieve our GP MMU interrupt\n"); -+ ret = irq_gpmmu; -+ goto err_put_reset; -+ } -+ -+ irq_pp0 = of_irq_get_byname(np, "pp0"); -+ if (irq_pp0 < 0) { -+ pr_err("Couldn't retrieve our PP0 interrupt %d\n", irq_pp0); -+ ret = irq_pp0; -+ goto err_put_reset; -+ } -+ -+ irq_ppmmu0 = of_irq_get_byname(np, "ppmmu0"); -+ if (irq_ppmmu0 < 0) { -+ pr_err("Couldn't retrieve our PP0 MMU interrupt\n"); -+ ret = irq_ppmmu0; -+ goto err_put_reset; -+ } -+ -+ irq_pp1 = of_irq_get_byname(np, "pp1"); -+ irq_ppmmu1 = of_irq_get_byname(np, "ppmmu1"); -+ if ((irq_pp1 < 0) ^ (irq_ppmmu1 < 0 )) { -+ pr_err("Couldn't retrieve our PP1 interrupts\n"); -+ ret = (irq_pp1 < 0) ? irq_pp1 : irq_ppmmu1; -+ goto err_put_reset; -+ } -+ -+ if (of_device_is_compatible(np, "allwinner,sun50i-h5-mali")) { -+ irq_pp2 = of_irq_get_byname(np, "pp2"); -+ if (irq_pp2 < 0) { -+ pr_err("Couldn't retrieve our PP2 interrupt\n"); -+ ret = irq_pp2; -+ goto err_put_reset; -+ } -+ -+ irq_ppmmu2 = of_irq_get_byname(np, "ppmmu2"); -+ if (irq_ppmmu2 < 0) { -+ pr_err("Couldn't retrieve our PP2 interrupts\n"); -+ ret = irq_ppmmu2; -+ goto err_put_reset; -+ } -+ -+ irq_pp3 = of_irq_get_byname(np, "pp3"); -+ if (irq_pp3 < 0) { -+ pr_err("Couldn't retrieve our PP3 interrupt\n"); -+ ret = irq_pp3; -+ goto err_put_reset; -+ } -+ -+ irq_ppmmu3 = of_irq_get_byname(np, "ppmmu3"); -+ if (irq_ppmmu3 < 0) { -+ pr_err("Couldn't retrieve our PP3 interrupts\n"); -+ ret = irq_ppmmu3; -+ goto err_put_reset; -+ } -+ -+ irq_pp = of_irq_get_byname(np, "pp"); -+ if (irq_pp < 0) { -+ pr_err("Couldn't retrieve our PP broadcast interrupt\n"); -+ ret = irq_pp; -+ goto err_put_reset; -+ } -+ } else { -+ irq_pmu = of_irq_get_byname(np, "pmu"); -+ if (irq_pmu < 0) { -+ pr_err("Couldn't retrieve our PMU interrupt\n"); -+ ret = irq_pmu; -+ goto err_put_reset; -+ } -+ } -+ -+ mali->dev = platform_device_alloc("mali-utgard", 0); -+ if (!mali->dev) { -+ pr_err("Couldn't create platform device\n"); -+ ret = -EINVAL; -+ goto err_put_reset; -+ } -+ dev = &mali->dev->dev; -+ dev_set_name(dev, "mali-utgard"); -+ dev->of_node = np; -+ dev->coherent_dma_mask = DMA_BIT_MASK(32); -+ dev->dma_mask = &dev->coherent_dma_mask; -+ dev->bus = &platform_bus_type; -+ -+ ret = of_reserved_mem_device_init(&mali->dev->dev); -+ if (ret && ret != -ENODEV) { -+ pr_err("Couldn't claim our reserved memory region\n"); -+ goto err_free_mem_region; -+ } -+ -+ if (of_device_is_compatible(np, "allwinner,sun50i-h5-mali")) -+ mali_res = mali_create_450mp4_resources(res.start, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0, -+ irq_pp1, irq_ppmmu1, -+ irq_pp2, irq_ppmmu2, -+ irq_pp3, irq_ppmmu3, -+ irq_pp, &len); -+ else if ((irq_pp1 >= 0) && (irq_ppmmu1 >= 0)) -+ mali_res = mali_create_mp2_resources(res.start, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0, -+ irq_pp1, irq_ppmmu1, -+ &len); -+ else -+ mali_res = mali_create_mp1_resources(res.start, -+ irq_gp, irq_gpmmu, -+ irq_pp0, irq_ppmmu0, -+ &len); -+ -+ if (!mali_res) { -+ pr_err("Couldn't create target resources\n"); -+ ret = -EINVAL; -+ goto err_free_mem_region; -+ } -+ -+ clk_register_clkdev(mali->core_clk, "clk_mali", NULL); -+ -+ ret = platform_device_add_resources(mali->dev, mali_res, len); -+ kfree(mali_res); -+ if (ret) { -+ pr_err("Couldn't add our resources\n"); -+ goto err_free_mem_region; -+ } -+ -+ ret = platform_device_add_data(mali->dev, &mali_gpu_data, -+ sizeof(mali_gpu_data)); -+ if (ret) { -+ pr_err("Couldn't add our platform data\n"); -+ goto err_free_mem_region; -+ } -+ -+ ret = platform_device_add(mali->dev); -+ if (ret) { -+ pr_err("Couldn't add our device\n"); -+ goto err_free_mem_region; -+ } -+ -+#ifdef CONFIG_PM_RUNTIME -+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37)) -+ pm_runtime_set_autosuspend_delay(&mali->dev->dev, 1000); -+ pm_runtime_use_autosuspend(&mali->dev->dev); -+#endif -+ pm_runtime_enable(&mali->dev->dev); -+#endif -+ -+ pr_info("Allwinner sunXi mali glue initialized\n"); -+ -+ return 0; -+ -+err_free_mem_region: -+ of_reserved_mem_device_release(dev); -+ platform_device_put(mali->dev); -+err_put_reset: -+ if (!IS_ERR_OR_NULL(mali->reset)) { -+ reset_control_assert(mali->reset); -+ reset_control_put(mali->reset); -+ } -+err_put_mod: -+ clk_disable_unprepare(mali->core_clk); -+ clk_put(mali->core_clk); -+err_put_bus: -+ clk_disable_unprepare(mali->bus_clk); -+ clk_put(mali->bus_clk); -+err_free_mem: -+ kfree(mali); -+err_put_node: -+ of_node_put(np); -+ return ret; -+} -+ -+int mali_platform_device_unregister(void) -+{ -+ struct device *dev = &mali->dev->dev; -+ -+#ifdef CONFIG_PM_RUNTIME -+ pm_runtime_disable(dev); -+#endif -+ -+ of_reserved_mem_device_release(dev); -+ -+ platform_device_del(mali->dev); -+ of_node_put(dev->of_node); -+ platform_device_put(mali->dev); -+ -+ if (!IS_ERR_OR_NULL(mali->reset)) { -+ reset_control_assert(mali->reset); -+ reset_control_put(mali->reset); -+ } -+ -+ clk_disable_unprepare(mali->core_clk); -+ clk_put(mali->core_clk); -+ -+ clk_disable_unprepare(mali->bus_clk); -+ clk_put(mali->bus_clk); -+ -+ kfree(mali); -+ -+ return 0; -+} diff --git a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.16.patch b/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.16.patch deleted file mode 100644 index 5b7dfc3b7d..0000000000 --- a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.16.patch +++ /dev/null @@ -1,155 +0,0 @@ -From 246fdac477cf109c354011c1ae0a7a8d928cb504 Mon Sep 17 00:00:00 2001 -From: Jonas Karlman -Date: Mon, 12 Mar 2018 23:02:55 +0100 -Subject: [PATCH] v4.16 build fix - ---- - .../driver/src/devicedrv/mali/common/mali_control_timer.c | 2 +- - src/devicedrv/mali/common/mali_group.c | 8 ++++--- - src/devicedrv/mali/common/mali_osk_types.h | 8 ++++++- - .../devicedrv/mali/linux/mali_memory_os_alloc.c | 6 +++++ - .../driver/src/devicedrv/mali/linux/mali_memory_secure.c | 4 ++++ - src/devicedrv/mali/linux/mali_osk_timers.c | 20 +++++++++++----- - 11 files changed, 84 insertions(+), 14 deletions(-) - -diff --git a/driver/src/devicedrv/mali/common/mali_control_timer.c b/driver/src/devicedrv/mali/common/mali_control_timer.c -index 1296ffe..bfe975f 100644 ---- a/driver/src/devicedrv/mali/common/mali_control_timer.c -+++ b/driver/src/devicedrv/mali/common/mali_control_timer.c -@@ -28,7 +28,7 @@ void mali_control_timer_add(u32 timeout) - _mali_osk_timer_add(mali_control_timer, _mali_osk_time_mstoticks(timeout)); - } - --static void mali_control_timer_callback(void *arg) -+static void mali_control_timer_callback(struct timer_list *t) - { - if (mali_utilization_enabled()) { - struct mali_gpu_utilization_data *util_data = NULL; -diff --git a/driver/src/devicedrv/mali/common/mali_group.c b/driver/src/devicedrv/mali/common/mali_group.c -index e9005e1..4a43753 100644 ---- a/driver/src/devicedrv/mali/common/mali_group.c -+++ b/driver/src/devicedrv/mali/common/mali_group.c -@@ -44,7 +44,7 @@ int mali_max_job_runtime = MALI_MAX_JOB_RUNTIME_DEFAULT; - static void mali_group_bottom_half_mmu(void *data); - static void mali_group_bottom_half_gp(void *data); - static void mali_group_bottom_half_pp(void *data); --static void mali_group_timeout(void *data); -+static void mali_group_timeout(struct timer_list *t); - static void mali_group_reset_pp(struct mali_group *group); - static void mali_group_reset_mmu(struct mali_group *group); - -@@ -1761,9 +1761,11 @@ static void mali_group_bottom_half_pp(void *data) - 0xFFFFFFFF, 0); - } - --static void mali_group_timeout(void *data) -+static void mali_group_timeout(struct timer_list *t) - { -- struct mali_group *group = (struct mali_group *)data; -+ _mali_osk_timer_t *tim = container_of(t, _mali_osk_timer_t, timer); -+ struct mali_group *group = container_of(&tim, struct mali_group, timeout_timer); -+ - MALI_DEBUG_ASSERT_POINTER(group); - - MALI_DEBUG_PRINT(2, ("Group: timeout handler for %s at %u\n", -diff --git a/driver/src/devicedrv/mali/common/mali_osk_types.h b/driver/src/devicedrv/mali/common/mali_osk_types.h -index 03161cf..c9d0fec 100644 ---- a/driver/src/devicedrv/mali/common/mali_osk_types.h -+++ b/driver/src/devicedrv/mali/common/mali_osk_types.h -@@ -50,6 +50,7 @@ typedef unsigned long long u64; - #include - #endif - -+#include - /** @brief Mali Boolean type which uses MALI_TRUE and MALI_FALSE - */ - typedef unsigned long mali_bool; -@@ -395,7 +396,12 @@ typedef struct _mali_osk_notification_t_struct { - * by any callers of _mali_osk_timer_del(). Otherwise, a deadlock may occur. - * - * @param arg Function-specific data */ --typedef void (*_mali_osk_timer_callback_t)(void *arg); -+typedef void (*_mali_osk_timer_callback_t)(struct timer_list *t); -+ -+ -+struct _mali_osk_timer_t_struct { -+ struct timer_list timer; -+}; - - /** @brief Private type for Timer Callback Objects */ - typedef struct _mali_osk_timer_t_struct _mali_osk_timer_t; -diff --git a/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c b/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c -index 5fe1270..92c245a 100644 ---- a/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c -+++ b/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c -@@ -202,7 +202,9 @@ int mali_mem_os_alloc_pages(mali_mem_os_mem *os_mem, u32 size) - /* Allocate new pages, if needed. */ - for (i = 0; i < remaining; i++) { - dma_addr_t dma_addr; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0) -+ gfp_t flags = __GFP_ZERO | __GFP_RETRY_MAYFAIL | __GFP_NOWARN; -+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 13, 0) --#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0) - gfp_t flags = __GFP_ZERO | __GFP_RETRY_MAYFAIL | __GFP_NOWARN | __GFP_COLD; - #else - gfp_t flags = __GFP_ZERO | __GFP_REPEAT | __GFP_NOWARN | __GFP_COLD; -diff --git a/driver/src/devicedrv/mali/linux/mali_memory_secure.c b/driver/src/devicedrv/mali/linux/mali_memory_secure.c -index 2836b1b..4f55fa5 100644 ---- a/driver/src/devicedrv/mali/linux/mali_memory_secure.c -+++ b/driver/src/devicedrv/mali/linux/mali_memory_secure.c -@@ -13,7 +13,11 @@ - #include "mali_memory_secure.h" - #include "mali_osk.h" - #include -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0) -+#include -+#else - #include -+#endif - #include - - _mali_osk_errcode_t mali_mem_secure_attach_dma_buf(mali_mem_secure *secure_mem, u32 size, int mem_fd) -diff --git a/driver/src/devicedrv/mali/linux/mali_osk_timers.c b/driver/src/devicedrv/mali/linux/mali_osk_timers.c -index e5d7238..701051a 100644 ---- a/driver/src/devicedrv/mali/linux/mali_osk_timers.c -+++ b/driver/src/devicedrv/mali/linux/mali_osk_timers.c -@@ -18,16 +18,25 @@ - #include "mali_osk.h" - #include "mali_kernel_common.h" - --struct _mali_osk_timer_t_struct { -- struct timer_list timer; --}; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) -+ -+#define TIMER_DATA_TYPE unsigned long -+#define TIMER_FUNC_TYPE void (*)(TIMER_DATA_TYPE) -+ -+static inline void timer_setup(struct timer_list *timer, -+ void (*callback)(struct timer_list *), -+ unsigned int flags) -+{ -+ __setup_timer(timer, (TIMER_FUNC_TYPE)callback, -+ (TIMER_DATA_TYPE)timer, flags); -+} -+#endif - - typedef void (*timer_timeout_function_t)(unsigned long); - - _mali_osk_timer_t *_mali_osk_timer_init(void) - { - _mali_osk_timer_t *t = (_mali_osk_timer_t *)kmalloc(sizeof(_mali_osk_timer_t), GFP_KERNEL); -- if (NULL != t) init_timer(&t->timer); - return t; - } - -@@ -65,8 +74,7 @@ mali_bool _mali_osk_timer_pending(_mali_osk_timer_t *tim) - void _mali_osk_timer_setcallback(_mali_osk_timer_t *tim, _mali_osk_timer_callback_t callback, void *data) - { - MALI_DEBUG_ASSERT_POINTER(tim); -- tim->timer.data = (unsigned long)data; -- tim->timer.function = (timer_timeout_function_t)callback; -+ timer_setup(&tim->timer, callback, 0); - } - - void _mali_osk_timer_term(_mali_osk_timer_t *tim) diff --git a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.20.patch b/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.20.patch deleted file mode 100644 index 63c333ff20..0000000000 --- a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-4.20.patch +++ /dev/null @@ -1,128 +0,0 @@ -diff -Nur a/driver/src/devicedrv/mali/linux/mali_memory_block_alloc.c b/driver/src/devicedrv/mali/linux/mali_memory_block_alloc.c ---- a/driver/src/devicedrv/mali/linux/mali_memory_block_alloc.c 2018-09-13 08:52:20.000000000 +0200 -+++ b/driver/src/devicedrv/mali/linux/mali_memory_block_alloc.c 2018-12-08 12:22:51.978513336 +0100 -@@ -309,9 +309,9 @@ - - list_for_each_entry(m_page, &block_mem->pfns, list) { - MALI_DEBUG_ASSERT(m_page->type == MALI_PAGE_NODE_BLOCK); -- ret = vm_insert_pfn(vma, addr, _mali_page_node_get_pfn(m_page)); -+ ret = vmf_insert_pfn(vma, addr, _mali_page_node_get_pfn(m_page)); - -- if (unlikely(0 != ret)) { -+ if (unlikely(ret & VM_FAULT_ERROR)) { - return -EFAULT; - } - addr += _MALI_OSK_MALI_PAGE_SIZE; -diff -Nur a/driver/src/devicedrv/mali/linux/mali_memory_cow.c b/driver/src/devicedrv/mali/linux/mali_memory_cow.c ---- a/driver/src/devicedrv/mali/linux/mali_memory_cow.c 2018-09-13 08:52:20.000000000 +0200 -+++ b/driver/src/devicedrv/mali/linux/mali_memory_cow.c 2018-12-08 12:27:17.681815893 +0100 -@@ -532,10 +532,10 @@ - * flush which makes it way slower than remap_pfn_range or vm_insert_pfn. - ret = vm_insert_page(vma, addr, page); - */ -- ret = vm_insert_pfn(vma, addr, _mali_page_node_get_pfn(m_page)); -+ ret = vmf_insert_pfn(vma, addr, _mali_page_node_get_pfn(m_page)); - -- if (unlikely(0 != ret)) { -- return ret; -+ if (unlikely(ret & VM_FAULT_ERROR)) { -+ return -EFAULT; - } - addr += _MALI_OSK_MALI_PAGE_SIZE; - } -@@ -569,9 +569,9 @@ - - list_for_each_entry(m_page, &cow->pages, list) { - if ((count >= offset) && (count < offset + num)) { -- ret = vm_insert_pfn(vma, vaddr, _mali_page_node_get_pfn(m_page)); -+ ret = vmf_insert_pfn(vma, vaddr, _mali_page_node_get_pfn(m_page)); - -- if (unlikely(0 != ret)) { -+ if (unlikely(ret & VM_FAULT_ERROR)) { - if (count == offset) { - return _MALI_OSK_ERR_FAULT; - } else { -diff -Nur a/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c b/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c ---- a/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c 2018-12-08 12:15:38.000000000 +0100 -+++ b/driver/src/devicedrv/mali/linux/mali_memory_os_alloc.c 2018-12-08 12:30:37.730811640 +0100 -@@ -376,9 +376,9 @@ - ret = vm_insert_page(vma, addr, page); - */ - page = m_page->page; -- ret = vm_insert_pfn(vma, addr, page_to_pfn(page)); -+ ret = vmf_insert_pfn(vma, addr, page_to_pfn(page)); - -- if (unlikely(0 != ret)) { -+ if (unlikely(ret & VM_FAULT_ERROR)) { - return -EFAULT; - } - addr += _MALI_OSK_MALI_PAGE_SIZE; -@@ -414,16 +414,11 @@ - - vm_end -= _MALI_OSK_MALI_PAGE_SIZE; - if (mapping_page_num > 0) { -- ret = vm_insert_pfn(vma, vm_end, page_to_pfn(m_page->page)); -+ ret = vmf_insert_pfn(vma, vm_end, page_to_pfn(m_page->page)); - -- if (unlikely(0 != ret)) { -- /*will return -EBUSY If the page has already been mapped into table, but it's OK*/ -- if (-EBUSY == ret) { -- break; -- } else { -- MALI_DEBUG_PRINT(1, ("OS Mem: mali_mem_os_resize_cpu_map_locked failed, ret = %d, offset is %d,page_count is %d\n", -- ret, offset + mapping_page_num, os_mem->count)); -- } -+ if (unlikely(ret & VM_FAULT_ERROR)) { -+ MALI_DEBUG_PRINT(1, ("OS Mem: mali_mem_os_resize_cpu_map_locked failed, ret = %d, offset is %d,page_count is %d\n", -+ ret, offset + mapping_page_num, os_mem->count)); - return _MALI_OSK_ERR_FAULT; - } - } else { -@@ -437,16 +432,11 @@ - list_for_each_entry(m_page, &os_mem->pages, list) { - if (count >= offset) { - -- ret = vm_insert_pfn(vma, vstart, page_to_pfn(m_page->page)); -+ ret = vmf_insert_pfn(vma, vstart, page_to_pfn(m_page->page)); - -- if (unlikely(0 != ret)) { -- /*will return -EBUSY If the page has already been mapped into table, but it's OK*/ -- if (-EBUSY == ret) { -- break; -- } else { -- MALI_DEBUG_PRINT(1, ("OS Mem: mali_mem_os_resize_cpu_map_locked failed, ret = %d, count is %d, offset is %d,page_count is %d\n", -- ret, count, offset, os_mem->count)); -- } -+ if (unlikely(ret & VM_FAULT_ERROR)) { -+ MALI_DEBUG_PRINT(1, ("OS Mem: mali_mem_os_resize_cpu_map_locked failed, ret = %d, count is %d, offset is %d,page_count is %d\n", -+ ret, count, offset, os_mem->count)); - return _MALI_OSK_ERR_FAULT; - } - } -diff -Nur a/driver/src/devicedrv/mali/linux/mali_memory_secure.c b/driver/src/devicedrv/mali/linux/mali_memory_secure.c ---- a/driver/src/devicedrv/mali/linux/mali_memory_secure.c 2018-12-08 12:15:38.000000000 +0100 -+++ b/driver/src/devicedrv/mali/linux/mali_memory_secure.c 2018-12-08 12:31:05.461174554 +0100 -@@ -132,9 +132,9 @@ - MALI_DEBUG_ASSERT(0 == size % _MALI_OSK_MALI_PAGE_SIZE); - - for (j = 0; j < size / _MALI_OSK_MALI_PAGE_SIZE; j++) { -- ret = vm_insert_pfn(vma, addr, PFN_DOWN(phys)); -+ ret = vmf_insert_pfn(vma, addr, PFN_DOWN(phys)); - -- if (unlikely(0 != ret)) { -+ if (unlikely(ret & VM_FAULT_ERROR)) { - return -EFAULT; - } - addr += _MALI_OSK_MALI_PAGE_SIZE; -diff -Nur a/driver/src/devicedrv/mali/linux/mali_osk_time.c b/driver/src/devicedrv/mali/linux/mali_osk_time.c ---- a/driver/src/devicedrv/mali/linux/mali_osk_time.c 2018-09-13 08:52:20.000000000 +0200 -+++ b/driver/src/devicedrv/mali/linux/mali_osk_time.c 2018-12-08 12:32:12.632086846 +0100 -@@ -53,7 +53,5 @@ - - u64 _mali_osk_boot_time_get_ns(void) - { -- struct timespec tsval; -- get_monotonic_boottime(&tsval); -- return (u64)timespec_to_ns(&tsval); -+ return (u64)ktime_to_ns(ktime_get_boottime()); - } diff --git a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-5.0.patch b/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-5.0.patch deleted file mode 100644 index 8bf06e7309..0000000000 --- a/packages/linux-drivers/gpu-sunxi/patches/fix-building-with-5.0.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff -Nur a/driver/src/devicedrv/mali/linux/mali_ukk_mem.c b/driver/src/devicedrv/mali/linux/mali_ukk_mem.c ---- a/driver/src/devicedrv/mali/linux/mali_ukk_mem.c 2018-09-13 08:52:20.000000000 +0200 -+++ b/driver/src/devicedrv/mali/linux/mali_ukk_mem.c 2019-02-09 20:10:06.867561465 +0100 -@@ -207,10 +207,17 @@ - kargs.ctx = (uintptr_t)session_data; - - /* Check if we can access the buffers */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) -+ if (!access_ok(kargs.dest, kargs.size) -+ || !access_ok(kargs.src, kargs.size)) { -+ return -EINVAL; -+ } -+#else - if (!access_ok(VERIFY_WRITE, kargs.dest, kargs.size) - || !access_ok(VERIFY_READ, kargs.src, kargs.size)) { - return -EINVAL; - } -+#endif - - /* Check if size wraps */ - if ((kargs.size + kargs.dest) <= kargs.dest -@@ -266,8 +273,13 @@ - goto err_exit; - - user_buffer = (void __user *)(uintptr_t)kargs.buffer; -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0) -+ if (!access_ok(user_buffer, kargs.size)) -+ goto err_exit; -+#else - if (!access_ok(VERIFY_WRITE, user_buffer, kargs.size)) - goto err_exit; -+#endif - - /* allocate temporary buffer (kernel side) to store mmu page table info */ - if (kargs.size <= 0) diff --git a/packages/linux-drivers/mali-midgard/package.mk b/packages/linux-drivers/mali-midgard/package.mk new file mode 100644 index 0000000000..dad97c4def --- /dev/null +++ b/packages/linux-drivers/mali-midgard/package.mk @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="mali-midgard" +PKG_VERSION="9ce33e456c9320b90f7ce8770262c852a77e4b81" # TX011-SW-99002-r28p0-01rel0 +PKG_SHA256="ef8808d0d0535449cd23410832bcb7433e35568afcbb75683608a7df9dd536bc" +PKG_ARCH="arm aarch64" +PKG_LICENSE="GPL" +PKG_SITE="https://developer.arm.com/products/software/mali-drivers/" +PKG_URL="https://github.com/LibreELEC/mali-midgard/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain linux" +PKG_NEED_UNPACK="$LINUX_DEPENDS" +PKG_LONGDESC="mali-midgard: Linux drivers for Mali Midgard GPUs" +PKG_TOOLCHAIN="manual" +PKG_IS_KERNEL_PKG="yes" + +case $PROJECT in + Allwinner) + PKG_EXTRA_CFLAGS="-DCONFIG_MALI_DEVFREQ -DCONFIG_MALI_PLATFORM_DEVICETREE" + PKG_CONFIGS="CONFIG_MALI_DEVFREQ=y" + ;; + Amlogic) + PKG_CONFIGS="CONFIG_MALI_PLATFORM_NAME=meson" + ;; + Rockchip) + PKG_CONFIGS="CONFIG_MALI_PLATFORM_NAME=rk" + ;; +esac + +post_patch() { + # rename kernel module to not clash with mali-bifrost + find $PKG_BUILD -name Kbuild -exec sed -i 's/mali_kbase.o/mali_midgard.o/g; s/mali_kbase-/mali_midgard-/g' {} \; +} + +make_target() { + kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/product/kernel/drivers/gpu/arm/midgard \ + EXTRA_CFLAGS="${PKG_EXTRA_CFLAGS}" \ + CONFIG_MALI_MIDGARD=m ${PKG_CONFIGS} +} + +makeinstall_target() { + kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/product/kernel/drivers/gpu/arm/midgard \ + INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ + modules_install +} diff --git a/packages/linux-drivers/mali-utgard/package.mk b/packages/linux-drivers/mali-utgard/package.mk new file mode 100644 index 0000000000..2718978dbd --- /dev/null +++ b/packages/linux-drivers/mali-utgard/package.mk @@ -0,0 +1,42 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="mali-utgard" +PKG_VERSION="5d89e2a946c7e4dbd7e627202e7bd7c3ed49954a" +PKG_SHA256="c3e6199f58807558eb665357a35e2f86c161fc1a55f27988e604671bc27e98c7" +PKG_ARCH="arm aarch64" +PKG_LICENSE="GPL" +PKG_SITE="https://developer.arm.com/products/software/mali-drivers/utgard-kernel" +PKG_URL="https://github.com/LibreELEC/mali-utgard/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain linux" +PKG_NEED_UNPACK="$LINUX_DEPENDS" +PKG_LONGDESC="mali-utgard: Linux drivers for Mali Utgard GPUs" +PKG_TOOLCHAIN="manual" +PKG_IS_KERNEL_PKG="yes" + +case $PROJECT in + Allwinner) + PKG_MALI_PLATFORM="sunxi" + ;; + Amlogic) + PKG_MALI_PLATFORM="meson" + ;; + Rockchip) + PKG_MALI_PLATFORM="rk" + PKG_EXTRA_CFLAGS="-DCONFIG_MALI_DT" + PKG_CONFIGS="CONFIG_MALI_DT=y" + ;; +esac + +make_target() { + kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/src/devicedrv/mali \ + MALI_PLATFORM_FILES=platform/${PKG_MALI_PLATFORM}/${PKG_MALI_PLATFORM}.c GIT_REV="" \ + EXTRA_CFLAGS="-DMALI_FAKE_PLATFORM_DEVICE=1 -DCONFIG_MALI_DMA_BUF_MAP_ON_ATTACH -DCONFIG_MALI400=1 -DCONFIG_MALI450=1 -DCONFIG_MALI470=1 ${PKG_EXTRA_CFLAGS}" \ + CONFIG_MALI400=m CONFIG_MALI450=y CONFIG_MALI470=y CONFIG_MALI_DMA_BUF_MAP_ON_ATTACH=y ${PKG_CONFIGS} +} + +makeinstall_target() { + kernel_make -C $(kernel_path) M=$PKG_BUILD/driver/src/devicedrv/mali/ \ + INSTALL_MOD_PATH=$INSTALL/$(get_kernel_overlay_dir) INSTALL_MOD_STRIP=1 DEPMOD=: \ + modules_install +} diff --git a/packages/linux-firmware/brcmfmac_sdio-firmware/package.mk b/packages/linux-firmware/brcmfmac_sdio-firmware/package.mk index 249e357d85..6b7a22c84e 100644 --- a/packages/linux-firmware/brcmfmac_sdio-firmware/package.mk +++ b/packages/linux-firmware/brcmfmac_sdio-firmware/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="brcmfmac_sdio-firmware" -PKG_VERSION="bc97ecd07221b0f0baca67bbe5dbb6f053a271f1" -PKG_SHA256="61773247f8ec519db5f123b2b554746bf4e4cc1902038d87d6217337afba00f5" +PKG_VERSION="79932201f7827ec06ec708a44bf583a772ae7522" +PKG_SHA256="b31665e3b0dfd595234241ef233e47f2e12312ce019c9b5c2e02919d0b2ddbc0" PKG_LICENSE="GPL" PKG_SITE="https://github.com/LibreELEC/brcmfmac_sdio-firmware" PKG_URL="https://github.com/LibreELEC/brcmfmac_sdio-firmware/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux-firmware/iwlwifi-firmware/package.mk b/packages/linux-firmware/iwlwifi-firmware/package.mk index 7b9081190b..1586353650 100644 --- a/packages/linux-firmware/iwlwifi-firmware/package.mk +++ b/packages/linux-firmware/iwlwifi-firmware/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="iwlwifi-firmware" -PKG_VERSION="7b698fbf706a4294fbb148bef57d42cb729c147b" -PKG_SHA256="c0da6400d4a7d06a41fc8d3130da7e23f13c7fab1aeae13d6dbbc7b06ae44cf7" +PKG_VERSION="caaa6ccba6ebfa06b40d58e94b808202a735520c" +PKG_SHA256="a9846956d89557e2608df467a8c6911e26dbbd09cadf4d307d52e930fc323cd2" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/iwlwifi-firmware" PKG_URL="https://github.com/LibreELEC/iwlwifi-firmware/archive/$PKG_VERSION.tar.gz" diff --git a/packages/linux/package.mk b/packages/linux/package.mk index cad5441f3a..a874c0bdb8 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -11,7 +11,7 @@ PKG_DEPENDS_INIT="toolchain" PKG_NEED_UNPACK="$LINUX_DEPENDS" PKG_LONGDESC="This package contains a precompiled kernel image and the modules." PKG_IS_KERNEL_PKG="yes" -PKG_STAMP="$KERNEL_TARGET $KERNEL_MAKE_EXTRACMD $KERNEL_UBOOT_EXTRA_TARGET" +PKG_STAMP="$KERNEL_TARGET $KERNEL_MAKE_EXTRACMD" PKG_PATCH_DIRS="$LINUX" @@ -37,8 +37,8 @@ case "$LINUX" in PKG_SOURCE_NAME="linux-$LINUX-$PKG_VERSION.tar.gz" ;; *) - PKG_VERSION="5.0.7" - PKG_SHA256="16e177662b9fc7255bfc51018513979f6effcbe52e459c543aa83a5b15ef54ec" + PKG_VERSION="5.1.9" + PKG_SHA256="58c9eca99c3dd2fff5b559302996c985c3f3f2aad0b99b2172a61c4df7122a79" PKG_URL="https://www.kernel.org/pub/linux/kernel/v5.x/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_PATCH_DIRS="default" ;; @@ -203,12 +203,6 @@ make_target() { $SCRIPTS/install initramfs ) - if [ "$BOOTLOADER" = "u-boot" -a -n "$KERNEL_UBOOT_EXTRA_TARGET" ]; then - for extra_target in "$KERNEL_UBOOT_EXTRA_TARGET"; do - kernel_make $extra_target - done - fi - # arm64 target does not support creating uImage. # Build Image first, then wrap it using u-boot's mkimage. if [[ "$TARGET_KERNEL_ARCH" == "arm64" && "$KERNEL_TARGET" == uImage* ]]; then diff --git a/packages/linux/patches/default/linux-902-extend-rc6-toggle-support-for-zotac.patch b/packages/linux/patches/default/linux-902-extend-rc6-toggle-support-for-zotac.patch deleted file mode 100644 index 65fe5fd6c7..0000000000 --- a/packages/linux/patches/default/linux-902-extend-rc6-toggle-support-for-zotac.patch +++ /dev/null @@ -1,41 +0,0 @@ -From ae1ccaa3587c0bd3d6d01841fa2e668cdf738f1e Mon Sep 17 00:00:00 2001 -From: Matthias Reichl -Date: Sun, 3 Feb 2019 14:24:00 +0100 -Subject: [PATCH] media: rc: ir-rc6-decoder: enable toggle bit for Zotac - remotes - -The Zotac RC2604323/01G and RC2604329/02BG remotes use the 32-bit -rc6 protocol and toggle bit 15 (0x8000) on repeated button presses, -like MCE remotes. - -Add the customer code 0x80340000 to the 32-bit rc6 toggle -handling code to get proper scancodes and toggle reports. - -Signed-off-by: Matthias Reichl ---- - drivers/media/rc/ir-rc6-decoder.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/drivers/media/rc/ir-rc6-decoder.c b/drivers/media/rc/ir-rc6-decoder.c -index d96aed1343e4..5cc302fa4daa 100644 ---- a/drivers/media/rc/ir-rc6-decoder.c -+++ b/drivers/media/rc/ir-rc6-decoder.c -@@ -40,6 +40,7 @@ - #define RC6_6A_MCE_TOGGLE_MASK 0x8000 /* for the body bits */ - #define RC6_6A_LCC_MASK 0xffff0000 /* RC6-6A-32 long customer code mask */ - #define RC6_6A_MCE_CC 0x800f0000 /* MCE customer code */ -+#define RC6_6A_ZOTAC_CC 0x80340000 /* Zotac customer code */ - #define RC6_6A_KATHREIN_CC 0x80460000 /* Kathrein RCU-676 customer code */ - #ifndef CHAR_BIT - #define CHAR_BIT 8 /* Normally in */ -@@ -246,6 +247,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev) - switch (scancode & RC6_6A_LCC_MASK) { - case RC6_6A_MCE_CC: - case RC6_6A_KATHREIN_CC: -+ case RC6_6A_ZOTAC_CC: - protocol = RC_PROTO_RC6_MCE; - toggle = !!(scancode & RC6_6A_MCE_TOGGLE_MASK); - scancode &= ~RC6_6A_MCE_TOGGLE_MASK; --- -2.20.1 - diff --git a/packages/linux/patches/default/linux-903-backport-rcmm-ir-decoder.patch b/packages/linux/patches/default/linux-903-backport-rcmm-ir-decoder.patch deleted file mode 100644 index ae2cba8494..0000000000 --- a/packages/linux/patches/default/linux-903-backport-rcmm-ir-decoder.patch +++ /dev/null @@ -1,506 +0,0 @@ -From da8a71104dda4a85a9d9546ff462542347f8efa6 Mon Sep 17 00:00:00 2001 -From: Matthias Reichl -Date: Wed, 20 Mar 2019 09:11:53 +0100 -Subject: [PATCH] media: rc: rcmm decoder and encoder - -commit 721074b03411327e7bf41555d4cc7c18f49313f7 upstream. - -media: add support for RCMM infrared remote controls. - -Signed-off-by: Patrick Lerda -Signed-off-by: Sean Young -Signed-off-by: Mauro Carvalho Chehab -Signed-off-by: Matthias Reichl ---- - Documentation/media/lirc.h.rst.exceptions | 3 + - MAINTAINERS | 5 + - drivers/media/rc/Kconfig | 13 ++ - drivers/media/rc/Makefile | 1 + - drivers/media/rc/ir-rcmm-decoder.c | 254 ++++++++++++++++++++++ - drivers/media/rc/rc-core-priv.h | 5 + - drivers/media/rc/rc-main.c | 9 + - include/media/rc-map.h | 14 +- - include/uapi/linux/lirc.h | 6 + - tools/include/uapi/linux/lirc.h | 12 + - 10 files changed, 319 insertions(+), 3 deletions(-) - create mode 100644 drivers/media/rc/ir-rcmm-decoder.c - -diff --git a/Documentation/media/lirc.h.rst.exceptions b/Documentation/media/lirc.h.rst.exceptions -index 984b61dc3f2e..e7a41d4b3d46 100644 ---- a/Documentation/media/lirc.h.rst.exceptions -+++ b/Documentation/media/lirc.h.rst.exceptions -@@ -58,6 +58,9 @@ ignore symbol RC_PROTO_SHARP - ignore symbol RC_PROTO_XMP - ignore symbol RC_PROTO_CEC - ignore symbol RC_PROTO_IMON -+ignore symbol RC_PROTO_RCMM12 -+ignore symbol RC_PROTO_RCMM24 -+ignore symbol RC_PROTO_RCMM32 - - # Undocumented macros - -diff --git a/MAINTAINERS b/MAINTAINERS -index 9e9b19ecf6f7..57b60dd42729 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -15837,6 +15837,11 @@ M: David Härdeman - S: Maintained - F: drivers/media/rc/winbond-cir.c - -+RCMM REMOTE CONTROLS DECODER -+M: Patrick Lerda -+S: Maintained -+F: drivers/media/rc/ir-rcmm-decoder.c -+ - WINSYSTEMS EBC-C384 WATCHDOG DRIVER - M: William Breathitt Gray - L: linux-watchdog@vger.kernel.org -diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig -index 1021c08a9ba4..8164a889011a 100644 ---- a/drivers/media/rc/Kconfig -+++ b/drivers/media/rc/Kconfig -@@ -133,6 +133,19 @@ config IR_IMON_DECODER - remote control and you would like to use it with a raw IR - receiver, or if you wish to use an encoder to transmit this IR. - -+config IR_RCMM_DECODER -+ tristate "Enable IR raw decoder for the RC-MM protocol" -+ depends on RC_CORE -+ help -+ Enable this option when you have IR with RC-MM protocol, and -+ you need the software decoder. The driver supports 12, -+ 24 and 32 bits RC-MM variants. You can enable or disable the -+ different modes using the following RC protocol keywords: -+ 'rc-mm-12', 'rc-mm-24' and 'rc-mm-32'. -+ -+ To compile this driver as a module, choose M here: the module -+ will be called ir-rcmm-decoder. -+ - endif #RC_DECODERS - - menuconfig RC_DEVICES -diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile -index e0340d043fe8..fc4058013234 100644 ---- a/drivers/media/rc/Makefile -+++ b/drivers/media/rc/Makefile -@@ -16,6 +16,7 @@ obj-$(CONFIG_IR_SHARP_DECODER) += ir-sharp-decoder.o - obj-$(CONFIG_IR_MCE_KBD_DECODER) += ir-mce_kbd-decoder.o - obj-$(CONFIG_IR_XMP_DECODER) += ir-xmp-decoder.o - obj-$(CONFIG_IR_IMON_DECODER) += ir-imon-decoder.o -+obj-$(CONFIG_IR_RCMM_DECODER) += ir-rcmm-decoder.o - - # stand-alone IR receivers/transmitters - obj-$(CONFIG_RC_ATI_REMOTE) += ati_remote.o -diff --git a/drivers/media/rc/ir-rcmm-decoder.c b/drivers/media/rc/ir-rcmm-decoder.c -new file mode 100644 -index 000000000000..f1096ac1e5c5 ---- /dev/null -+++ b/drivers/media/rc/ir-rcmm-decoder.c -@@ -0,0 +1,254 @@ -+// SPDX-License-Identifier: GPL-2.0+ -+// ir-rcmm-decoder.c - A decoder for the RCMM IR protocol -+// -+// Copyright (C) 2018 by Patrick Lerda -+ -+#include "rc-core-priv.h" -+#include -+#include -+ -+#define RCMM_UNIT 166667 /* nanosecs */ -+#define RCMM_PREFIX_PULSE 416666 /* 166666.666666666*2.5 */ -+#define RCMM_PULSE_0 277777 /* 166666.666666666*(1+2/3) */ -+#define RCMM_PULSE_1 444444 /* 166666.666666666*(2+2/3) */ -+#define RCMM_PULSE_2 611111 /* 166666.666666666*(3+2/3) */ -+#define RCMM_PULSE_3 777778 /* 166666.666666666*(4+2/3) */ -+ -+enum rcmm_state { -+ STATE_INACTIVE, -+ STATE_LOW, -+ STATE_BUMP, -+ STATE_VALUE, -+ STATE_FINISHED, -+}; -+ -+static bool rcmm_mode(const struct rcmm_dec *data) -+{ -+ return !((0x000c0000 & data->bits) == 0x000c0000); -+} -+ -+static int rcmm_miscmode(struct rc_dev *dev, struct rcmm_dec *data) -+{ -+ switch (data->count) { -+ case 24: -+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM24) { -+ rc_keydown(dev, RC_PROTO_RCMM24, data->bits, 0); -+ data->state = STATE_INACTIVE; -+ return 0; -+ } -+ return -1; -+ -+ case 12: -+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM12) { -+ rc_keydown(dev, RC_PROTO_RCMM12, data->bits, 0); -+ data->state = STATE_INACTIVE; -+ return 0; -+ } -+ return -1; -+ } -+ -+ return -1; -+} -+ -+/** -+ * ir_rcmm_decode() - Decode one RCMM pulse or space -+ * @dev: the struct rc_dev descriptor of the device -+ * @ev: the struct ir_raw_event descriptor of the pulse/space -+ * -+ * This function returns -EINVAL if the pulse violates the state machine -+ */ -+static int ir_rcmm_decode(struct rc_dev *dev, struct ir_raw_event ev) -+{ -+ struct rcmm_dec *data = &dev->raw->rcmm; -+ u32 scancode; -+ u8 toggle; -+ int value; -+ -+ if (!(dev->enabled_protocols & (RC_PROTO_BIT_RCMM32 | -+ RC_PROTO_BIT_RCMM24 | -+ RC_PROTO_BIT_RCMM12))) -+ return 0; -+ -+ if (!is_timing_event(ev)) { -+ if (ev.reset) -+ data->state = STATE_INACTIVE; -+ return 0; -+ } -+ -+ switch (data->state) { -+ case STATE_INACTIVE: -+ if (!ev.pulse) -+ break; -+ -+ if (!eq_margin(ev.duration, RCMM_PREFIX_PULSE, RCMM_UNIT / 2)) -+ break; -+ -+ data->state = STATE_LOW; -+ data->count = 0; -+ data->bits = 0; -+ return 0; -+ -+ case STATE_LOW: -+ if (ev.pulse) -+ break; -+ -+ if (!eq_margin(ev.duration, RCMM_PULSE_0, RCMM_UNIT / 2)) -+ break; -+ -+ data->state = STATE_BUMP; -+ return 0; -+ -+ case STATE_BUMP: -+ if (!ev.pulse) -+ break; -+ -+ if (!eq_margin(ev.duration, RCMM_UNIT, RCMM_UNIT / 2)) -+ break; -+ -+ data->state = STATE_VALUE; -+ return 0; -+ -+ case STATE_VALUE: -+ if (ev.pulse) -+ break; -+ -+ if (eq_margin(ev.duration, RCMM_PULSE_0, RCMM_UNIT / 2)) -+ value = 0; -+ else if (eq_margin(ev.duration, RCMM_PULSE_1, RCMM_UNIT / 2)) -+ value = 1; -+ else if (eq_margin(ev.duration, RCMM_PULSE_2, RCMM_UNIT / 2)) -+ value = 2; -+ else if (eq_margin(ev.duration, RCMM_PULSE_3, RCMM_UNIT / 2)) -+ value = 3; -+ else -+ value = -1; -+ -+ if (value == -1) { -+ if (!rcmm_miscmode(dev, data)) -+ return 0; -+ break; -+ } -+ -+ data->bits <<= 2; -+ data->bits |= value; -+ -+ data->count += 2; -+ -+ if (data->count < 32) -+ data->state = STATE_BUMP; -+ else -+ data->state = STATE_FINISHED; -+ -+ return 0; -+ -+ case STATE_FINISHED: -+ if (!ev.pulse) -+ break; -+ -+ if (!eq_margin(ev.duration, RCMM_UNIT, RCMM_UNIT / 2)) -+ break; -+ -+ if (rcmm_mode(data)) { -+ toggle = !!(0x8000 & data->bits); -+ scancode = data->bits & ~0x8000; -+ } else { -+ toggle = 0; -+ scancode = data->bits; -+ } -+ -+ if (dev->enabled_protocols & RC_PROTO_BIT_RCMM32) { -+ rc_keydown(dev, RC_PROTO_RCMM32, scancode, toggle); -+ data->state = STATE_INACTIVE; -+ return 0; -+ } -+ -+ break; -+ } -+ -+ data->state = STATE_INACTIVE; -+ return -EINVAL; -+} -+ -+static const int rcmmspace[] = { -+ RCMM_PULSE_0, -+ RCMM_PULSE_1, -+ RCMM_PULSE_2, -+ RCMM_PULSE_3, -+}; -+ -+static int ir_rcmm_rawencoder(struct ir_raw_event **ev, unsigned int max, -+ unsigned int n, u32 data) -+{ -+ int i; -+ int ret; -+ -+ ret = ir_raw_gen_pulse_space(ev, &max, RCMM_PREFIX_PULSE, RCMM_PULSE_0); -+ if (ret) -+ return ret; -+ -+ for (i = n - 2; i >= 0; i -= 2) { -+ const unsigned int space = rcmmspace[(data >> i) & 3]; -+ -+ ret = ir_raw_gen_pulse_space(ev, &max, RCMM_UNIT, space); -+ if (ret) -+ return ret; -+ } -+ -+ return ir_raw_gen_pulse_space(ev, &max, RCMM_UNIT, RCMM_PULSE_3 * 2); -+} -+ -+static int ir_rcmm_encode(enum rc_proto protocol, u32 scancode, -+ struct ir_raw_event *events, unsigned int max) -+{ -+ struct ir_raw_event *e = events; -+ int ret; -+ -+ switch (protocol) { -+ case RC_PROTO_RCMM32: -+ ret = ir_rcmm_rawencoder(&e, max, 32, scancode); -+ break; -+ case RC_PROTO_RCMM24: -+ ret = ir_rcmm_rawencoder(&e, max, 24, scancode); -+ break; -+ case RC_PROTO_RCMM12: -+ ret = ir_rcmm_rawencoder(&e, max, 12, scancode); -+ break; -+ default: -+ ret = -EINVAL; -+ } -+ -+ if (ret < 0) -+ return ret; -+ -+ return e - events; -+} -+ -+static struct ir_raw_handler rcmm_handler = { -+ .protocols = RC_PROTO_BIT_RCMM32 | -+ RC_PROTO_BIT_RCMM24 | -+ RC_PROTO_BIT_RCMM12, -+ .decode = ir_rcmm_decode, -+ .encode = ir_rcmm_encode, -+ .carrier = 36000, -+ .min_timeout = RCMM_PULSE_3 + RCMM_UNIT, -+}; -+ -+static int __init ir_rcmm_decode_init(void) -+{ -+ ir_raw_handler_register(&rcmm_handler); -+ -+ pr_info("IR RCMM protocol handler initialized\n"); -+ return 0; -+} -+ -+static void __exit ir_rcmm_decode_exit(void) -+{ -+ ir_raw_handler_unregister(&rcmm_handler); -+} -+ -+module_init(ir_rcmm_decode_init); -+module_exit(ir_rcmm_decode_exit); -+ -+MODULE_LICENSE("GPL"); -+MODULE_AUTHOR("Patrick Lerda"); -+MODULE_DESCRIPTION("RCMM IR protocol decoder"); -diff --git a/drivers/media/rc/rc-core-priv.h b/drivers/media/rc/rc-core-priv.h -index e847bdad5c51..59c252f24194 100644 ---- a/drivers/media/rc/rc-core-priv.h -+++ b/drivers/media/rc/rc-core-priv.h -@@ -136,6 +136,11 @@ struct ir_raw_event_ctrl { - struct input_dev *idev; - char name[64]; - } imon; -+ struct rcmm_dec { -+ int state; -+ unsigned int count; -+ u32 bits; -+ } rcmm; - }; - - /* Mutex for locking raw IR processing and handler change */ -diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c -index 0f218afdadaa..78e79c37f208 100644 ---- a/drivers/media/rc/rc-main.c -+++ b/drivers/media/rc/rc-main.c -@@ -70,6 +70,12 @@ static const struct { - [RC_PROTO_CEC] = { .name = "cec", .repeat_period = 0 }, - [RC_PROTO_IMON] = { .name = "imon", - .scancode_bits = 0x7fffffff, .repeat_period = 114 }, -+ [RC_PROTO_RCMM12] = { .name = "rc-mm-12", -+ .scancode_bits = 0x00000fff, .repeat_period = 114 }, -+ [RC_PROTO_RCMM24] = { .name = "rc-mm-24", -+ .scancode_bits = 0x00ffffff, .repeat_period = 114 }, -+ [RC_PROTO_RCMM32] = { .name = "rc-mm-32", -+ .scancode_bits = 0xffffffff, .repeat_period = 114 }, - }; - - /* Used to keep track of known keymaps */ -@@ -1018,6 +1024,9 @@ static const struct { - { RC_PROTO_BIT_XMP, "xmp", "ir-xmp-decoder" }, - { RC_PROTO_BIT_CEC, "cec", NULL }, - { RC_PROTO_BIT_IMON, "imon", "ir-imon-decoder" }, -+ { RC_PROTO_BIT_RCMM12 | -+ RC_PROTO_BIT_RCMM24 | -+ RC_PROTO_BIT_RCMM32, "rc-mm", "ir-rcmm-decoder" }, - }; - - /** -diff --git a/include/media/rc-map.h b/include/media/rc-map.h -index bfa3017cecba..cf308b73edae 100644 ---- a/include/media/rc-map.h -+++ b/include/media/rc-map.h -@@ -37,6 +37,9 @@ - #define RC_PROTO_BIT_XMP BIT_ULL(RC_PROTO_XMP) - #define RC_PROTO_BIT_CEC BIT_ULL(RC_PROTO_CEC) - #define RC_PROTO_BIT_IMON BIT_ULL(RC_PROTO_IMON) -+#define RC_PROTO_BIT_RCMM12 BIT_ULL(RC_PROTO_RCMM12) -+#define RC_PROTO_BIT_RCMM24 BIT_ULL(RC_PROTO_RCMM24) -+#define RC_PROTO_BIT_RCMM32 BIT_ULL(RC_PROTO_RCMM32) - - #define RC_PROTO_BIT_ALL \ - (RC_PROTO_BIT_UNKNOWN | RC_PROTO_BIT_OTHER | \ -@@ -51,7 +54,8 @@ - RC_PROTO_BIT_RC6_6A_24 | RC_PROTO_BIT_RC6_6A_32 | \ - RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ - RC_PROTO_BIT_XMP | RC_PROTO_BIT_CEC | \ -- RC_PROTO_BIT_IMON) -+ RC_PROTO_BIT_IMON | RC_PROTO_BIT_RCMM12 | \ -+ RC_PROTO_BIT_RCMM24 | RC_PROTO_BIT_RCMM32) - /* All rc protocols for which we have decoders */ - #define RC_PROTO_BIT_ALL_IR_DECODER \ - (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ -@@ -64,7 +68,9 @@ - RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \ - RC_PROTO_BIT_RC6_6A_24 | RC_PROTO_BIT_RC6_6A_32 | \ - RC_PROTO_BIT_RC6_MCE | RC_PROTO_BIT_SHARP | \ -- RC_PROTO_BIT_XMP | RC_PROTO_BIT_IMON) -+ RC_PROTO_BIT_XMP | RC_PROTO_BIT_IMON | \ -+ RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \ -+ RC_PROTO_BIT_RCMM32) - - #define RC_PROTO_BIT_ALL_IR_ENCODER \ - (RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC5X_20 | \ -@@ -77,7 +83,9 @@ - RC_PROTO_BIT_RC6_0 | RC_PROTO_BIT_RC6_6A_20 | \ - RC_PROTO_BIT_RC6_6A_24 | \ - RC_PROTO_BIT_RC6_6A_32 | RC_PROTO_BIT_RC6_MCE | \ -- RC_PROTO_BIT_SHARP | RC_PROTO_BIT_IMON) -+ RC_PROTO_BIT_SHARP | RC_PROTO_BIT_IMON | \ -+ RC_PROTO_BIT_RCMM12 | RC_PROTO_BIT_RCMM24 | \ -+ RC_PROTO_BIT_RCMM32) - - #define RC_SCANCODE_UNKNOWN(x) (x) - #define RC_SCANCODE_OTHER(x) (x) -diff --git a/include/uapi/linux/lirc.h b/include/uapi/linux/lirc.h -index 6b319581882f..45fcbf99d72e 100644 ---- a/include/uapi/linux/lirc.h -+++ b/include/uapi/linux/lirc.h -@@ -192,6 +192,9 @@ struct lirc_scancode { - * @RC_PROTO_XMP: XMP protocol - * @RC_PROTO_CEC: CEC protocol - * @RC_PROTO_IMON: iMon Pad protocol -+ * @RC_PROTO_RCMM12: RC-MM protocol 12 bits -+ * @RC_PROTO_RCMM24: RC-MM protocol 24 bits -+ * @RC_PROTO_RCMM32: RC-MM protocol 32 bits - */ - enum rc_proto { - RC_PROTO_UNKNOWN = 0, -@@ -218,6 +221,9 @@ enum rc_proto { - RC_PROTO_XMP = 21, - RC_PROTO_CEC = 22, - RC_PROTO_IMON = 23, -+ RC_PROTO_RCMM12 = 24, -+ RC_PROTO_RCMM24 = 25, -+ RC_PROTO_RCMM32 = 26, - }; - - #endif -diff --git a/tools/include/uapi/linux/lirc.h b/tools/include/uapi/linux/lirc.h -index f189931042a7..45fcbf99d72e 100644 ---- a/tools/include/uapi/linux/lirc.h -+++ b/tools/include/uapi/linux/lirc.h -@@ -133,6 +133,12 @@ - - #define LIRC_SET_WIDEBAND_RECEIVER _IOW('i', 0x00000023, __u32) - -+/* -+ * Return the recording timeout, which is either set by -+ * the ioctl LIRC_SET_REC_TIMEOUT or by the kernel after setting the protocols. -+ */ -+#define LIRC_GET_REC_TIMEOUT _IOR('i', 0x00000024, __u32) -+ - /* - * struct lirc_scancode - decoded scancode with protocol for use with - * LIRC_MODE_SCANCODE -@@ -186,6 +192,9 @@ struct lirc_scancode { - * @RC_PROTO_XMP: XMP protocol - * @RC_PROTO_CEC: CEC protocol - * @RC_PROTO_IMON: iMon Pad protocol -+ * @RC_PROTO_RCMM12: RC-MM protocol 12 bits -+ * @RC_PROTO_RCMM24: RC-MM protocol 24 bits -+ * @RC_PROTO_RCMM32: RC-MM protocol 32 bits - */ - enum rc_proto { - RC_PROTO_UNKNOWN = 0, -@@ -212,6 +221,9 @@ enum rc_proto { - RC_PROTO_XMP = 21, - RC_PROTO_CEC = 22, - RC_PROTO_IMON = 23, -+ RC_PROTO_RCMM12 = 24, -+ RC_PROTO_RCMM24 = 25, -+ RC_PROTO_RCMM32 = 26, - }; - - #endif --- -2.20.1 - diff --git a/packages/linux/patches/default/linux-999.03-dvbskys960-fix.patch b/packages/linux/patches/default/linux-999.03-dvbskys960-fix.patch deleted file mode 100644 index bc610f8642..0000000000 --- a/packages/linux/patches/default/linux-999.03-dvbskys960-fix.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: jahutchi -Date: Fri, 11 Jan 2019 13:35:00 +0000 -Subject: [PATCH] media: m88ds3103: serialize reset messages in m88ds3103_set_frontend - -Ref: -https://bugzilla.kernel.org/show_bug.cgi?id=199323 -https://forum.libreelec.tv/thread/12452-problems-with-dvbsky-technotrend-usb-dvb-s2-tuners-since-le8/ - -DVBSky S960/S960C are partly broken since linux kernel commit (4.10rc1) -https://github.com/torvalds/linux/commit/9d659ae14b545c4296e812c70493bfdc999b5c1c - -diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c -index dffd2d4bf1..e495a26e6e 100644 ---- a/drivers/media/dvb-frontends/m88ds3103.c -+++ b/drivers/media/dvb-frontends/m88ds3103.c -@@ -309,6 +309,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - u16 u16tmp; - u32 tuner_frequency_khz, target_mclk; - s32 s32tmp; -+ static const struct reg_sequence reset_buf[] = {{0x07, 0x80}, {0x07, 0x00}}; - - dev_dbg(&client->dev, - "delivery_system=%d modulation=%d frequency=%u symbol_rate=%d inversion=%d pilot=%d rolloff=%d\n", -@@ -321,11 +322,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe) - } - - /* reset */ -- ret = regmap_write(dev->regmap, 0x07, 0x80); -- if (ret) -- goto err; -- -- ret = regmap_write(dev->regmap, 0x07, 0x00); -+ ret = regmap_multi_reg_write(dev->regmap, reset_buf, 2); - if (ret) - goto err; - --- -2.7.4 - diff --git a/packages/linux/patches/default/linux-999.99-revert-faulty-bt-encryption-commit.patch b/packages/linux/patches/default/linux-999.99-revert-faulty-bt-encryption-commit.patch new file mode 100644 index 0000000000..43bdf5e60f --- /dev/null +++ b/packages/linux/patches/default/linux-999.99-revert-faulty-bt-encryption-commit.patch @@ -0,0 +1,48 @@ +From aa843e35a472a2aff26250662d21ff30629d294c Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Wed, 5 Jun 2019 16:35:18 +0100 +Subject: [PATCH] Revert "Bluetooth: Align minimum encryption key size for LE + and BR/EDR connections" + +This reverts commit 07e38998a19d72b916c39a983c19134522ae806b. +--- + include/net/bluetooth/hci_core.h | 3 --- + net/bluetooth/hci_conn.c | 8 -------- + 2 files changed, 11 deletions(-) + +diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h +index 05b1b96..094e61e 100644 +--- a/include/net/bluetooth/hci_core.h ++++ b/include/net/bluetooth/hci_core.h +@@ -190,9 +190,6 @@ struct adv_info { + + #define HCI_MAX_SHORT_NAME_LENGTH 10 + +-/* Min encryption key size to match with SMP */ +-#define HCI_MIN_ENC_KEY_SIZE 7 +- + /* Default LE RPA expiry time, 15 minutes */ + #define HCI_DEFAULT_RPA_TIMEOUT (15 * 60) + +diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c +index 3cf0764..bd4978c 100644 +--- a/net/bluetooth/hci_conn.c ++++ b/net/bluetooth/hci_conn.c +@@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn) + !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) + return 0; + +- /* The minimum encryption key size needs to be enforced by the +- * host stack before establishing any L2CAP connections. The +- * specification in theory allows a minimum of 1, but to align +- * BR/EDR and LE transports, a minimum of 7 is chosen. +- */ +- if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE) +- return 0; +- + return 1; + } + +-- +2.14.1 + diff --git a/packages/linux/patches/raspberrypi/linux-999.99-revert-faulty-bt-encryption-commit.patch b/packages/linux/patches/raspberrypi/linux-999.99-revert-faulty-bt-encryption-commit.patch new file mode 100644 index 0000000000..43bdf5e60f --- /dev/null +++ b/packages/linux/patches/raspberrypi/linux-999.99-revert-faulty-bt-encryption-commit.patch @@ -0,0 +1,48 @@ +From aa843e35a472a2aff26250662d21ff30629d294c Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Wed, 5 Jun 2019 16:35:18 +0100 +Subject: [PATCH] Revert "Bluetooth: Align minimum encryption key size for LE + and BR/EDR connections" + +This reverts commit 07e38998a19d72b916c39a983c19134522ae806b. +--- + include/net/bluetooth/hci_core.h | 3 --- + net/bluetooth/hci_conn.c | 8 -------- + 2 files changed, 11 deletions(-) + +diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h +index 05b1b96..094e61e 100644 +--- a/include/net/bluetooth/hci_core.h ++++ b/include/net/bluetooth/hci_core.h +@@ -190,9 +190,6 @@ struct adv_info { + + #define HCI_MAX_SHORT_NAME_LENGTH 10 + +-/* Min encryption key size to match with SMP */ +-#define HCI_MIN_ENC_KEY_SIZE 7 +- + /* Default LE RPA expiry time, 15 minutes */ + #define HCI_DEFAULT_RPA_TIMEOUT (15 * 60) + +diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c +index 3cf0764..bd4978c 100644 +--- a/net/bluetooth/hci_conn.c ++++ b/net/bluetooth/hci_conn.c +@@ -1276,14 +1276,6 @@ int hci_conn_check_link_mode(struct hci_conn *conn) + !test_bit(HCI_CONN_ENCRYPT, &conn->flags)) + return 0; + +- /* The minimum encryption key size needs to be enforced by the +- * host stack before establishing any L2CAP connections. The +- * specification in theory allows a minimum of 1, but to align +- * BR/EDR and LE transports, a minimum of 7 is chosen. +- */ +- if (conn->enc_key_size < HCI_MIN_ENC_KEY_SIZE) +- return 0; +- + return 1; + } + +-- +2.14.1 + diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk index ca4142d9f5..95f80cd997 100644 --- a/packages/mediacenter/kodi/package.mk +++ b/packages/mediacenter/kodi/package.mk @@ -88,6 +88,10 @@ configure_package() { KODI_CEC="-DENABLE_CEC=OFF" fi + if [ "$CEC_FRAMEWORK_SUPPORT" = "yes" ]; then + PKG_PATCH_DIRS+=" cec-framework" + fi + if [ "$KODI_OPTICAL_SUPPORT" = yes ]; then KODI_OPTICAL="-DENABLE_OPTICAL=ON" else diff --git a/packages/mediacenter/kodi/patches/cec-framework/kodi-100.17-tinker-s-cec-disable-polling.patch b/packages/mediacenter/kodi/patches/cec-framework/kodi-100.17-tinker-s-cec-disable-polling.patch new file mode 100644 index 0000000000..3a9ba8adc9 --- /dev/null +++ b/packages/mediacenter/kodi/patches/cec-framework/kodi-100.17-tinker-s-cec-disable-polling.patch @@ -0,0 +1,13 @@ +--- kodi-rockchip_18.2rc1-Leia.orig/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp 2019-05-12 07:24:23.921984777 +0200 ++++ kodi-rockchip_18.2rc1-Leia/xbmc/peripherals/bus/virtual/PeripheralBusCEC.cpp 2019-05-12 07:03:41.221761552 +0200 +@@ -50,6 +50,10 @@ + /** the Pi's adapter cannot be removed, no need to rescan */ + m_bNeedsPolling = false; + break; ++ case ADAPTERTYPE_LINUX: ++ /** the Linux adapter cannot be removed, no need to rescan */ ++ m_bNeedsPolling = false; ++ break; + default: + break; + } diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0002-Add-common-V4L2-request-API-code.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0002-Add-common-V4L2-request-API-code.patch index 83d9fcac35..d0d66ff5cf 100644 --- a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0002-Add-common-V4L2-request-API-code.patch +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0002-Add-common-V4L2-request-API-code.patch @@ -1,21 +1,21 @@ -From 4bd117a06e468ad2259f3011c95c182150f295ef Mon Sep 17 00:00:00 2001 +From 0ba3c868e1d828520b8facaa4ce36d9b80339cc6 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 2/6] Add common V4L2 request API code Signed-off-by: Jonas Karlman --- - configure | 8 + + configure | 12 + libavcodec/Makefile | 1 + libavcodec/hwaccel.h | 2 + - libavcodec/v4l2_request.c | 885 ++++++++++++++++++++++++++++++++++++++ + libavcodec/v4l2_request.c | 888 ++++++++++++++++++++++++++++++++++++++ libavcodec/v4l2_request.h | 65 +++ - 5 files changed, 961 insertions(+) + 5 files changed, 968 insertions(+) create mode 100644 libavcodec/v4l2_request.c create mode 100644 libavcodec/v4l2_request.h diff --git a/configure b/configure -index 172611bb4a..ed587ec05e 100755 +index 172611bb4a..6401cae9e7 100755 --- a/configure +++ b/configure @@ -264,6 +264,7 @@ External library support: @@ -66,7 +66,18 @@ index 172611bb4a..ed587ec05e 100755 enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 0.6.2" libvmaf.h compute_vmaf -@@ -6230,6 +6236,8 @@ check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;" +@@ -6153,6 +6159,10 @@ enabled rkmpp && { require_pkg_config rkmpp rockchip_mpp rockchip/r + { enabled libdrm || + die "ERROR: rkmpp requires --enable-libdrm"; } + } ++enabled v4l2_request && { enabled libdrm || ++ die "ERROR: v4l2-request requires --enable-libdrm"; } && ++ { enabled libudev || ++ die "ERROR: v4l2-request requires --enable-libudev"; } + + if enabled gcrypt; then + GCRYPT_CONFIG="${cross_prefix}libgcrypt-config" +@@ -6230,6 +6240,8 @@ check_cc h264_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_H264;" check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;" check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" @@ -101,10 +112,10 @@ index 3aaa92571c..2eefc91e7e 100644 #endif /* AVCODEC_HWACCEL_H */ diff --git a/libavcodec/v4l2_request.c b/libavcodec/v4l2_request.c new file mode 100644 -index 0000000000..f66cba3ae8 +index 0000000000..4589209e60 --- /dev/null +++ b/libavcodec/v4l2_request.c -@@ -0,0 +1,885 @@ +@@ -0,0 +1,888 @@ +/* + * This file is part of FFmpeg. + * @@ -181,7 +192,7 @@ index 0000000000..f66cba3ae8 + .type = buf->buffer.type, + .memory = buf->buffer.memory, + .index = buf->index, -+ .timestamp.tv_usec = buf->index, ++ .timestamp.tv_usec = buf->index + 1, + .bytesused = buf->used, + .request_fd = request_fd, + .flags = (request_fd >= 0) ? V4L2_BUF_FLAG_REQUEST_FD : 0, @@ -282,6 +293,8 @@ index 0000000000..f66cba3ae8 + return -1; + } + ++ memset(req->output.addr + req->output.used, 0, AV_INPUT_BUFFER_PADDING_SIZE); ++ + ret = v4l2_request_queue_buffer(ctx, req->request_fd, &req->output); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "%s: queue output buffer %d failed for request %d, %s (%d)\n", __func__, req->output.index, req->request_fd, strerror(errno), errno); @@ -827,7 +840,6 @@ index 0000000000..f66cba3ae8 + buf->buffer.type = type; + buf->buffer.memory = V4L2_MEMORY_MMAP; + buf->buffer.index = buf->index; -+ buf->buffer.timestamp.tv_usec = buf->index; + + ret = ioctl(ctx->video_fd, VIDIOC_QUERYBUF, &buf->buffer); + if (ret < 0) { @@ -835,6 +847,8 @@ index 0000000000..f66cba3ae8 + return ret; + } + ++ buf->buffer.timestamp.tv_usec = buf->index + 1; ++ + if (V4L2_TYPE_IS_OUTPUT(type)) { + void *addr = mmap(NULL, buf->size, PROT_READ | PROT_WRITE, MAP_SHARED, ctx->video_fd, V4L2_TYPE_IS_MULTIPLANAR(type) ? buf->buffer.m.planes[0].m.mem_offset : buf->buffer.m.offset); + if (addr == MAP_FAILED) { diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0003-Add-V4L2-request-API-mpeg2-hwaccel.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0003-Add-V4L2-request-API-mpeg2-hwaccel.patch index d7d46e9533..166243192e 100644 --- a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0003-Add-V4L2-request-API-mpeg2-hwaccel.patch +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0003-Add-V4L2-request-API-mpeg2-hwaccel.patch @@ -1,4 +1,4 @@ -From de3bcf7557503e5d61b43cdc32d0844deab1c295 Mon Sep 17 00:00:00 2001 +From f4f6c74953b0bfaadec93b01d855a15f08c558a2 Mon Sep 17 00:00:00 2001 From: Jonas Karlman Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 3/6] Add V4L2 request API mpeg2 hwaccel @@ -14,7 +14,7 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request_mpeg2.c diff --git a/configure b/configure -index ed587ec05e..c93d67056d 100755 +index 6401cae9e7..b163ed8dbe 100755 --- a/configure +++ b/configure @@ -2846,6 +2846,8 @@ mpeg2_dxva2_hwaccel_deps="dxva2" @@ -26,7 +26,7 @@ index ed587ec05e..c93d67056d 100755 mpeg2_vaapi_hwaccel_deps="vaapi" mpeg2_vaapi_hwaccel_select="mpeg2video_decoder" mpeg2_vdpau_hwaccel_deps="vdpau" -@@ -6237,6 +6239,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;" +@@ -6241,6 +6243,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;" check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0004-Add-V4L2-request-API-h264-hwaccel.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0004-Add-V4L2-request-API-h264-hwaccel.patch index 829f7d45d8..3d9399156c 100644 --- a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0004-Add-V4L2-request-API-h264-hwaccel.patch +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0004-Add-V4L2-request-API-h264-hwaccel.patch @@ -1,4 +1,4 @@ -From bc1ed76cbc2dad2ec308801552e2398fc2de0a07 Mon Sep 17 00:00:00 2001 +From 250fab0e761f4956c009a6333c6799f63440b091 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 4/6] Add V4L2 request API h264 hwaccel @@ -11,12 +11,12 @@ Signed-off-by: Jonas Karlman libavcodec/h264_slice.c | 4 + libavcodec/h264dec.c | 3 + libavcodec/hwaccels.h | 1 + - libavcodec/v4l2_request_h264.c | 368 +++++++++++++++++++++++++++++++++ - 6 files changed, 380 insertions(+) + libavcodec/v4l2_request_h264.c | 367 +++++++++++++++++++++++++++++++++ + 6 files changed, 379 insertions(+) create mode 100644 libavcodec/v4l2_request_h264.c diff --git a/configure b/configure -index c93d67056d..296ca78ce7 100755 +index b163ed8dbe..698a91d5dc 100755 --- a/configure +++ b/configure @@ -2804,6 +2804,8 @@ h264_dxva2_hwaccel_deps="dxva2" @@ -28,7 +28,7 @@ index c93d67056d..296ca78ce7 100755 h264_vaapi_hwaccel_deps="vaapi" h264_vaapi_hwaccel_select="h264_decoder" h264_vdpau_hwaccel_deps="vdpau" -@@ -6239,6 +6241,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;" +@@ -6243,6 +6245,7 @@ check_cc vp8_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP8;" check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns @@ -98,10 +98,10 @@ index ef54de2a3b..003200edea 100644 extern const AVHWAccel ff_h264_videotoolbox_hwaccel; diff --git a/libavcodec/v4l2_request_h264.c b/libavcodec/v4l2_request_h264.c new file mode 100644 -index 0000000000..a5c56d81c3 +index 0000000000..3687325fad --- /dev/null +++ b/libavcodec/v4l2_request_h264.c -@@ -0,0 +1,368 @@ +@@ -0,0 +1,367 @@ +/* + * This file is part of FFmpeg. + * @@ -164,8 +164,10 @@ index 0000000000..a5c56d81c3 + entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_ACTIVE; + if (pic->long_ref) + entry->flags |= V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM; -+ entry->top_field_order_cnt = pic->field_poc[0]; -+ entry->bottom_field_order_cnt = pic->field_poc[1]; ++ if (pic->field_poc[0] != INT_MAX) ++ entry->top_field_order_cnt = pic->field_poc[0]; ++ if (pic->field_poc[1] != INT_MAX) ++ entry->bottom_field_order_cnt = pic->field_poc[1]; +} + +static void fill_dpb(struct v4l2_ctrl_h264_decode_params *decode, const H264Context *h) @@ -174,7 +176,7 @@ index 0000000000..a5c56d81c3 + + for (int i = 0; i < h->short_ref_count; i++) { + const H264Picture *pic = h->short_ref[i]; -+ if (pic) ++ if (pic && (pic->field_poc[0] != INT_MAX || pic->field_poc[1] != INT_MAX)) + fill_dpb_entry(&decode->dpb[entries++], pic); + } + @@ -183,7 +185,7 @@ index 0000000000..a5c56d81c3 + + for (int i = 0; i < FF_ARRAY_ELEMS(h->long_ref); i++) { + const H264Picture *pic = h->long_ref[i]; -+ if (pic) ++ if (pic && (pic->field_poc[0] != INT_MAX || pic->field_poc[1] != INT_MAX)) + fill_dpb_entry(&decode->dpb[entries++], pic); + } +} @@ -299,11 +301,8 @@ index 0000000000..a5c56d81c3 + controls->decode_params = (struct v4l2_ctrl_h264_decode_params) { + .num_slices = 0, + .nal_ref_idc = h->nal_ref_idc, -+ //.ref_pic_list_p0[32] - not required? not set by libva-v4l2-request -+ //.ref_pic_list_b0[32] - not required? not set by libva-v4l2-request -+ //.ref_pic_list_b1[32] - not required? not set by libva-v4l2-request -+ .top_field_order_cnt = h->cur_pic_ptr->field_poc[0], -+ .bottom_field_order_cnt = h->cur_pic_ptr->field_poc[1], ++ .top_field_order_cnt = h->cur_pic_ptr->field_poc[0] != INT_MAX ? h->cur_pic_ptr->field_poc[0] : 0, ++ .bottom_field_order_cnt = h->cur_pic_ptr->field_poc[1] != INT_MAX ? h->cur_pic_ptr->field_poc[1] : 0, + }; + + if (h->picture_idr) diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0005-Add-V4L2-request-API-hevc-hwaccel.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0005-Add-V4L2-request-API-hevc-hwaccel.patch index 7f88aefd26..68164154dc 100644 --- a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0005-Add-V4L2-request-API-hevc-hwaccel.patch +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0005-Add-V4L2-request-API-hevc-hwaccel.patch @@ -1,4 +1,4 @@ -From 25065e4e219c6bd688e6b62e40be74f1cfa08e72 Mon Sep 17 00:00:00 2001 +From 55751072c14f2ef678489be3d527f34604bb5602 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Sat, 15 Dec 2018 22:32:16 +0100 Subject: [PATCH 5/6] Add V4L2 request API hevc hwaccel @@ -15,7 +15,7 @@ Signed-off-by: Jonas Karlman create mode 100644 libavcodec/v4l2_request_hevc.c diff --git a/configure b/configure -index 296ca78ce7..9252ca5794 100755 +index 698a91d5dc..2d39cecbdf 100755 --- a/configure +++ b/configure @@ -2820,6 +2820,8 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" @@ -27,7 +27,7 @@ index 296ca78ce7..9252ca5794 100755 hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" hevc_vaapi_hwaccel_select="hevc_decoder" hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC" -@@ -6242,6 +6244,7 @@ check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" +@@ -6246,6 +6248,7 @@ check_cc vp9_v4l2_m2m linux/videodev2.h "int i = V4L2_PIX_FMT_VP9;" check_func_headers "linux/media.h linux/videodev2.h" v4l2_timeval_to_ns check_cc h264_v4l2_request linux/videodev2.h "int i = V4L2_PIX_FMT_H264_SLICE_RAW;" @@ -103,7 +103,7 @@ index 003200edea..d183675abe 100644 extern const AVHWAccel ff_hevc_videotoolbox_hwaccel; diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c new file mode 100644 -index 0000000000..300c1866ce +index 0000000000..38969d77fb --- /dev/null +++ b/libavcodec/v4l2_request_hevc.c @@ -0,0 +1,391 @@ @@ -480,7 +480,7 @@ index 0000000000..300c1866ce + +static int v4l2_request_hevc_init(AVCodecContext *avctx) +{ -+ return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_HEVC_SLICE, 2 * 1024 * 1024, NULL, 0); ++ return ff_v4l2_request_init(avctx, V4L2_PIX_FMT_HEVC_SLICE, 3 * 1024 * 1024, NULL, 0); +} + +const AVHWAccel ff_hevc_v4l2request_hwaccel = { diff --git a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0006-Add-and-use-private-linux-headers-for-V4L2-request-A.patch b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0006-Add-and-use-private-linux-headers-for-V4L2-request-A.patch index b9a4929287..c93892288f 100644 --- a/packages/multimedia/ffmpeg/patches/ffmpeg-95.0006-Add-and-use-private-linux-headers-for-V4L2-request-A.patch +++ b/packages/multimedia/ffmpeg/patches/ffmpeg-95.0006-Add-and-use-private-linux-headers-for-V4L2-request-A.patch @@ -1,27 +1,50 @@ -From 583677006f15ee59600f6f30f5e79aa5f81935b9 Mon Sep 17 00:00:00 2001 +From d80cbc949372d6f19dc8c3b5f97b336864bd259c Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 14 Feb 2019 23:20:05 +0100 Subject: [PATCH 6/6] Add and use private linux headers for V4L2 request API ctrls --- - libavcodec/h264-ctrls.h | 192 +++++++++++++++++++++++++++++++ - libavcodec/hevc-ctrls.h | 197 ++++++++++++++++++++++++++++++++ + configure | 4 +- + libavcodec/h264-ctrls.h | 197 +++++++++++++++++++++++++++++++ + libavcodec/hevc-ctrls.h | 203 ++++++++++++++++++++++++++++++++ libavcodec/mpeg2-ctrls.h | 82 +++++++++++++ libavcodec/v4l2_request_h264.c | 1 + libavcodec/v4l2_request_hevc.c | 1 + libavcodec/v4l2_request_mpeg2.c | 1 + - 6 files changed, 474 insertions(+) + 7 files changed, 487 insertions(+), 2 deletions(-) create mode 100644 libavcodec/h264-ctrls.h create mode 100644 libavcodec/hevc-ctrls.h create mode 100644 libavcodec/mpeg2-ctrls.h +diff --git a/configure b/configure +index 2d39cecbdf..23b1e57882 100755 +--- a/configure ++++ b/configure +@@ -2804,7 +2804,7 @@ h264_dxva2_hwaccel_deps="dxva2" + h264_dxva2_hwaccel_select="h264_decoder" + h264_nvdec_hwaccel_deps="nvdec" + h264_nvdec_hwaccel_select="h264_decoder" +-h264_v4l2request_hwaccel_deps="v4l2_request h264_v4l2_request" ++h264_v4l2request_hwaccel_deps="v4l2_request" + h264_v4l2request_hwaccel_select="h264_decoder" + h264_vaapi_hwaccel_deps="vaapi" + h264_vaapi_hwaccel_select="h264_decoder" +@@ -2820,7 +2820,7 @@ hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC" + hevc_dxva2_hwaccel_select="hevc_decoder" + hevc_nvdec_hwaccel_deps="nvdec" + hevc_nvdec_hwaccel_select="hevc_decoder" +-hevc_v4l2request_hwaccel_deps="v4l2_request hevc_v4l2_request" ++hevc_v4l2request_hwaccel_deps="v4l2_request" + hevc_v4l2request_hwaccel_select="hevc_decoder" + hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC" + hevc_vaapi_hwaccel_select="hevc_decoder" diff --git a/libavcodec/h264-ctrls.h b/libavcodec/h264-ctrls.h new file mode 100644 -index 0000000000..e2f83b3cdb +index 0000000000..e1404d78d6 --- /dev/null +++ b/libavcodec/h264-ctrls.h -@@ -0,0 +1,192 @@ +@@ -0,0 +1,197 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the H.264 state controls for use with stateless H.264 @@ -35,6 +58,11 @@ index 0000000000..e2f83b3cdb +#ifndef _H264_CTRLS_H_ +#define _H264_CTRLS_H_ + ++#include ++ ++/* Our pixel format isn't stable at the moment */ ++#define V4L2_PIX_FMT_H264_SLICE_RAW v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ ++ +/* + * This is put insanely high to avoid conflicting with controls that + * would be added during the phase where those controls are not @@ -216,10 +244,10 @@ index 0000000000..e2f83b3cdb +#endif diff --git a/libavcodec/hevc-ctrls.h b/libavcodec/hevc-ctrls.h new file mode 100644 -index 0000000000..c8c61079c6 +index 0000000000..eee4479c7a --- /dev/null +++ b/libavcodec/hevc-ctrls.h -@@ -0,0 +1,197 @@ +@@ -0,0 +1,203 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the HEVC state controls for use with stateless HEVC @@ -233,21 +261,27 @@ index 0000000000..c8c61079c6 +#ifndef _HEVC_CTRLS_H_ +#define _HEVC_CTRLS_H_ + -+#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 645) -+#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 646) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 647) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 648) ++#include ++ ++/* The pixel format isn't stable at the moment and will likely be renamed. */ ++#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ ++ ++#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) ++#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) ++#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) ++#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 1011) + +/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_HEVC_SPS 0x0115 -+#define V4L2_CTRL_TYPE_HEVC_PPS 0x0116 -+#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0117 -+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0118 ++#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 ++#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 ++#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 ++#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + ++/* The controls are not stable at the moment and will likely be reworked. */ +struct v4l2_ctrl_hevc_sps { + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ + __u8 chroma_format_idc; @@ -506,7 +540,7 @@ index 0000000000..6601455b3d + +#endif diff --git a/libavcodec/v4l2_request_h264.c b/libavcodec/v4l2_request_h264.c -index a5c56d81c3..a5dbc08a8d 100644 +index 3687325fad..2145a974eb 100644 --- a/libavcodec/v4l2_request_h264.c +++ b/libavcodec/v4l2_request_h264.c @@ -19,6 +19,7 @@ @@ -518,7 +552,7 @@ index a5c56d81c3..a5dbc08a8d 100644 typedef struct V4L2RequestControlsH264 { struct v4l2_ctrl_h264_sps sps; diff --git a/libavcodec/v4l2_request_hevc.c b/libavcodec/v4l2_request_hevc.c -index 300c1866ce..7c7948cfbf 100644 +index 38969d77fb..b73eb2ab03 100644 --- a/libavcodec/v4l2_request_hevc.c +++ b/libavcodec/v4l2_request_hevc.c @@ -19,6 +19,7 @@ diff --git a/packages/network/nss-mdns/package.mk b/packages/network/nss-mdns/package.mk index 3a0b782778..53aa3b3f74 100644 --- a/packages/network/nss-mdns/package.mk +++ b/packages/network/nss-mdns/package.mk @@ -1,12 +1,13 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nss-mdns" -PKG_VERSION="47edc38" -PKG_SHA256="f02e8baeceea30e82a2ecdaa8cafdbcabfdaa33a766f6942e7dc8aa81948f7b6" +PKG_VERSION="0.14.1" +PKG_SHA256="4fe54bffd20e410fc41382dc6c4708cdfa3a65f50c3753f262dc4c78fd864a6e" PKG_LICENSE="GPL" PKG_SITE="https://github.com/lathiat/nss-mdns" -PKG_URL="https://github.com/lathiat/nss-mdns/archive/$PKG_VERSION.tar.gz" +PKG_URL="https://github.com/lathiat/nss-mdns/archive/v$PKG_VERSION.tar.gz" PKG_DEPENDS_TARGET="toolchain avahi" PKG_LONGDESC="A plugin for nss to allow name resolution via Multicast DNS." PKG_TOOLCHAIN="autotools" diff --git a/packages/network/nss-mdns/patches/nss-mdns-fix-out-of-bounds.patch b/packages/network/nss-mdns/patches/nss-mdns-fix-out-of-bounds.patch deleted file mode 100644 index a7fe5edb79..0000000000 --- a/packages/network/nss-mdns/patches/nss-mdns-fix-out-of-bounds.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 29fdeb2387e3a9cd49d5b1aa09ca23cdea60b91a Mon Sep 17 00:00:00 2001 -From: Sergei Trofimovich -Date: Tue, 15 Aug 2017 09:45:29 +0100 -Subject: [PATCH] src/nss.c: fix out-of-bounds memset() -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -out-of-bounds access happens at memset() call site: - - @@ -272,9 +272,9 @@ enum nss_status _nss_mdns_gethostbyname4_r( - // Copy address - memcpy(&(tuple->addr), &(u.data.result[i].address), address_length); - if(address_length < sizeof(ipv6_address_t)) { - memset((&(tuple->addr) + address_length - sizeof(ipv6_address_t)), 0, - (sizeof(ipv6_address_t) - address_length) - ); - } - -The problem here is in 'addr' type: - struct gaih_addrtuple { - ... - uint32_t addr[4]; - ... - }; - -It means pointer addressing is not byte-based as offsets imply and memset() -wipes 12 bytes in hearby memory (of stack in glibc case). - -valgrind detects the overflow as: - - ==12732== Invalid write of size 1 - ==12732== at 0x4C11A29: memset (vg_replace_strmem.c:1239) - ==12732== by 0x57FA348: _nss_mdns_minimal_gethostbyname4_r (nss.c:292) - ==12732== by 0x4F016D8: gaih_inet.constprop.7 (getaddrinfo.c:806) - ==12732== by 0x4F02673: getaddrinfo (getaddrinfo.c:2317) - ==12732== by 0x4800B3B: main (a.c:34) - -The effect is SIGSEGV-ing getaddrinfo() call on systems with -the following nsswitch.conf: - - hosts: files mdns_minimal [NOTFOUND=return] dns - -The fix is to simplify memset()/memcpy() sequence. - -Reported-by: Michał Górny -Bug: https://bugs.gentoo.org/627770 -Signed-off-by: Sergei Trofimovich ---- - src/nss.c | 6 +----- - 1 file changed, 1 insertion(+), 5 deletions(-) - -diff --git a/src/nss.c b/src/nss.c -index ebb887c..1f50bad 100644 ---- a/src/nss.c -+++ b/src/nss.c -@@ -271,12 +271,8 @@ enum nss_status _nss_mdns_gethostbyname4_r( - tuple->family = u.data.result[i].af; - - // Copy address -+ memset(&(tuple->addr), 0, sizeof(ipv6_address_t)); - memcpy(&(tuple->addr), &(u.data.result[i].address), address_length); -- if(address_length < sizeof(ipv6_address_t)) { -- memset((&(tuple->addr) + address_length - sizeof(ipv6_address_t)), 0, -- (sizeof(ipv6_address_t) - address_length) -- ); -- } - - // Assign interface scope id - tuple->scopeid = u.data.result[i].scopeid; diff --git a/packages/network/wireless-regdb/package.mk b/packages/network/wireless-regdb/package.mk index 7fbfb67488..0767c4da1f 100644 --- a/packages/network/wireless-regdb/package.mk +++ b/packages/network/wireless-regdb/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="wireless-regdb" -PKG_VERSION="2019.03.01" -PKG_SHA256="3a4e6f7006599bc5764f86e1e86422710da13ad80e0242147b61c6855ebc915f" +PKG_VERSION="2019.06.03" +PKG_SHA256="cd917ed86b63ce8d93947979f1f18948f03a4ac0ad89ec25227b36ac00dc54bf" PKG_LICENSE="GPL" PKG_SITE="http://wireless.kernel.org/en/developers/Regulatory" PKG_URL="https://www.kernel.org/pub/software/network/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.xz" diff --git a/packages/python/devel/Mako/package.mk b/packages/python/devel/Mako/package.mk index c829adeeee..e103ea5caa 100644 --- a/packages/python/devel/Mako/package.mk +++ b/packages/python/devel/Mako/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="Mako" -PKG_VERSION="1.0.10" -PKG_SHA256="7165919e78e1feb68b4dbe829871ea9941398178fa58e6beedb9ba14acf63965" +PKG_VERSION="1.0.12" +PKG_SHA256="0cfa65de3a835e87eeca6ac856b3013aade55f49e32515f65d999f91a2324162" PKG_LICENSE="GPL" PKG_SITE="https://pypi.org/project/Mako" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz" diff --git a/packages/python/security/pycryptodome/package.mk b/packages/python/security/pycryptodome/package.mk index a191c3f932..77630980df 100644 --- a/packages/python/security/pycryptodome/package.mk +++ b/packages/python/security/pycryptodome/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="pycryptodome" -PKG_VERSION="3.8.1" -PKG_SHA256="68ad0ce4a374577a26bb7f458575abe3c2a342818b5280de6e5738870b7761b3" +PKG_VERSION="3.8.2" +PKG_SHA256="5bc40f8aa7ba8ca7f833ad2477b9d84e1bfd2630b22a46d9bbd221982f8c3ac0" PKG_LICENSE="BSD" PKG_SITE="https://pypi.org/project/pycryptodome" PKG_URL="https://files.pythonhosted.org/packages/source/${PKG_NAME:0:1}/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.gz" diff --git a/packages/security/nss/package.mk b/packages/security/nss/package.mk index 540ccf7e9a..8b3fd439b1 100644 --- a/packages/security/nss/package.mk +++ b/packages/security/nss/package.mk @@ -1,12 +1,13 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nss" -PKG_VERSION="3.37.1" -PKG_SHA256="5ac4a388b06b2785fb7f4f0ae3c909d8cbb2ab370147ff61fe2517cc5bf3c685" +PKG_VERSION="3.44" +PKG_SHA256="298d86e18e96660d3c98476274b5857b48c135d809a10d6528d8661bdf834a49" PKG_LICENSE="Mozilla Public License" PKG_SITE="http://ftp.mozilla.org/" -PKG_URL="http://ftp.mozilla.org/pub/security/nss/releases/NSS_3_37_1_RTM/src/nss-3.37.1-with-nspr-4.19.tar.gz" +PKG_URL="http://ftp.mozilla.org/pub/security/nss/releases/NSS_3_44_RTM/src/nss-3.44-with-nspr-4.21.tar.gz" PKG_DEPENDS_HOST="nspr:host zlib:host" PKG_DEPENDS_TARGET="toolchain nss:host nspr zlib sqlite" PKG_LONGDESC="The Network Security Services (NSS) package is a set of libraries designed to support cross-platform development of security-enabled client and server applications" diff --git a/packages/security/nss/patches/nss-06-always-include-fstar.patch b/packages/security/nss/patches/nss-06-always-include-fstar.patch index 3490e6f3f8..60c0766dc6 100644 --- a/packages/security/nss/patches/nss-06-always-include-fstar.patch +++ b/packages/security/nss/patches/nss-06-always-include-fstar.patch @@ -1,20 +1,15 @@ diff --git a/nss/lib/freebl/Makefile b/nss/lib/freebl/Makefile -index e6a94d35c..0c714c85c 100644 +index bff11c7..0c714c8 100644 --- a/nss/lib/freebl/Makefile +++ b/nss/lib/freebl/Makefile -@@ -535,12 +535,14 @@ ifeq (,$(filter-out i386 x386 x86 x86_64 aarch64,$(CPU_ARCH))) - # All intel architectures get the 64 bit version - # With custom uint128 if necessary (faster than generic 32 bit version). - ECL_SRCS += curve25519_64.c -- VERIFIED_SRCS += Hacl_Curve25519.c FStar.c -+ VERIFIED_SRCS += Hacl_Curve25519.c - else - # All non intel architectures get the generic 32 bit implementation (slow!) +@@ -541,9 +541,7 @@ else ECL_SRCS += curve25519_32.c endif - + +-ifndef HAVE_INT128_SUPPORT +- VERIFIED_SRCS += FStar.c +-endif +VERIFIED_SRCS += FStar.c -+ + ####################################################################### # (5) Execute "global" rules. (OPTIONAL) # - ####################################################################### diff --git a/packages/sysutils/busybox/scripts/apt-get b/packages/sysutils/busybox/scripts/apt-get index 4a39902768..bac29e72eb 100755 --- a/packages/sysutils/busybox/scripts/apt-get +++ b/packages/sysutils/busybox/scripts/apt-get @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2014 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) message="$message\n There is no working 'apt-get'." message="$message\n " @@ -19,7 +20,7 @@ message="$message\n " message="$message\n Also Ubuntu or Debian packages are often outdated and not compatible" message="$message\n with LibreELEC" message="$message\n " -message="$message\n TIP: use XBMC's addon browser to enhance your LibreELEC system" +message="$message\n TIP: use Kodi's addon browser to enhance your LibreELEC system" echo -e $message exit 1 diff --git a/packages/sysutils/e2fsprogs/package.mk b/packages/sysutils/e2fsprogs/package.mk index b29564be7c..ee226c7d8c 100644 --- a/packages/sysutils/e2fsprogs/package.mk +++ b/packages/sysutils/e2fsprogs/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="e2fsprogs" -PKG_VERSION="1.45.1" -PKG_SHA256="24acedbe376a9c1b5c0a0b15c9fb84b3bef4943d669caf40b2e3e41e86d95548" +PKG_VERSION="1.45.2" +PKG_SHA256="4952c9ae91e36d762e13cc5b9e8f7eeb5453e4aee4cd9b7402e73f2d4e65e009" PKG_LICENSE="GPL" PKG_SITE="http://e2fsprogs.sourceforge.net/" PKG_URL="https://www.kernel.org/pub/linux/kernel/people/tytso/$PKG_NAME/v$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.xz" diff --git a/packages/sysutils/libevdev/package.mk b/packages/sysutils/libevdev/package.mk index c90e030f05..34a56e673f 100644 --- a/packages/sysutils/libevdev/package.mk +++ b/packages/sysutils/libevdev/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libevdev" -PKG_VERSION="1.6.0" -PKG_SHA256="f5005c865987d980cc1279b9ec6131b06a89fd9892f649f2a68262b8786ef814" +PKG_VERSION="1.7.0" +PKG_SHA256="11dbe1f2b1d03a51f3e9a196757a75c3a999042ce34cf1fdc00a2363e5a2e369" PKG_LICENSE="GPL" PKG_SITE="http://www.freedesktop.org/wiki/Software/libevdev/" PKG_URL="http://www.freedesktop.org/software/libevdev/$PKG_NAME-$PKG_VERSION.tar.xz" diff --git a/packages/sysutils/systemd/package.mk b/packages/sysutils/systemd/package.mk index d545fe27ba..6cdd0bef26 100644 --- a/packages/sysutils/systemd/package.mk +++ b/packages/sysutils/systemd/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="systemd" -PKG_VERSION="239" -PKG_SHA256="8a11b1b07d620f4c06a16e95bba4dd2a97e90efdf2a5ba47ed0a935085787a14" +PKG_VERSION="242" +PKG_SHA256="ec22be9a5dd94c9640e6348ed8391d1499af8ca2c2f01109198a414cff6c6cba" PKG_LICENSE="LGPL2.1+" PKG_SITE="http://www.freedesktop.org/wiki/Software/systemd" PKG_URL="https://github.com/systemd/systemd/archive/v$PKG_VERSION.tar.gz" @@ -36,12 +36,14 @@ PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Dqrencode=false \ -Dgcrypt=false \ -Dgnutls=false \ + -Dopenssl=false \ -Delfutils=false \ -Dzlib=false \ -Dbzip2=false \ -Dxz=false \ -Dlz4=false \ -Dxkbcommon=false \ + -Dpcre2=false \ -Dglib=false \ -Ddbus=false \ -Ddefault-dnssec=no \ @@ -60,7 +62,6 @@ PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Dnetworkd=false \ -Dtimedated=false \ -Dtimesyncd=true \ - -Dmyhostname=false \ -Dfirstboot=false \ -Drandomseed=false \ -Dbacklight=false \ @@ -77,15 +78,18 @@ PKG_MESON_OPTS_TARGET="--libdir=/usr/lib \ -Dsmack=false \ -Dgshadow=false \ -Didn=false \ + -Dnss-myhostname=false \ + -Dnss-mymachines=false \ + -Dnss-resolve=false \ -Dnss-systemd=false \ -Dman=false \ -Dhtml=false \ -Dbashcompletiondir=no \ -Dzshcompletiondir=no \ - -Dkill-path=/usr/bin/kill \ -Dkmod-path=/usr/bin/kmod \ -Dmount-path=/usr/bin/mount \ - -Dumount-path=/usr/bin/umount" + -Dumount-path=/usr/bin/umount \ + -Dversion-tag=${PKG_VERSION}" pre_configure_target() { export CFLAGS="$CFLAGS -fno-schedule-insns -fno-schedule-insns2 -Wno-format-truncation" diff --git a/packages/sysutils/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch b/packages/sysutils/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch index f51f25efa0..eafb7e9b7e 100644 --- a/packages/sysutils/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch +++ b/packages/sysutils/systemd/patches/systemd-0002-move-hwdb.bin-to-run.patch @@ -1,53 +1,53 @@ -From 73f401a5a33ad3e647791685a9af14e69c7a89f6 Mon Sep 17 00:00:00 2001 -From: Stefan Saraev -Date: Fri, 7 Aug 2015 13:25:23 +0300 -Subject: [PATCH 3/8] move hwdb.bin to /run +From bf2776b7f9403057cb82c2697e4fca8b554db4bd Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Thu, 11 Apr 2019 20:00:05 +0100 +Subject: [PATCH] move hwdb.bin to /run --- - src/hwdb/hwdb.c | 2 +- - src/libsystemd/sd-hwdb/sd-hwdb.c | 2 +- - src/udev/udevadm-hwdb.c | 2 +- + src/libsystemd/sd-hwdb/hwdb-util.c | 2 +- + src/libsystemd/sd-hwdb/sd-hwdb.c | 2 +- + units/systemd-hwdb-update.service.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) -diff --git a/src/hwdb/hwdb.c b/src/hwdb/hwdb.c -index 446de3a..be91bfe 100644 ---- a/src/hwdb/hwdb.c -+++ b/src/hwdb/hwdb.c -@@ -38,7 +38,7 @@ - * Uses a Patricia/radix trie to index all matches for efficient lookup. - */ - --static const char *arg_hwdb_bin_dir = "/etc/udev"; -+static const char *arg_hwdb_bin_dir = "/run"; - static const char *arg_root = ""; +diff --git a/src/libsystemd/sd-hwdb/hwdb-util.c b/src/libsystemd/sd-hwdb/hwdb-util.c +index c83575c..6285f3d 100644 +--- a/src/libsystemd/sd-hwdb/hwdb-util.c ++++ b/src/libsystemd/sd-hwdb/hwdb-util.c +@@ -20,7 +20,7 @@ + #include "strv.h" + #include "tmpfile-util.h" +-static const char *default_hwdb_bin_dir = "/etc/udev"; ++static const char *default_hwdb_bin_dir = "/run"; static const char * const conf_file_dirs[] = { + "/etc/udev/hwdb.d", + UDEVLIBEXECDIR "/hwdb.d", diff --git a/src/libsystemd/sd-hwdb/sd-hwdb.c b/src/libsystemd/sd-hwdb/sd-hwdb.c -index 61c7b44..6e1de7d 100644 +index 79fe1a8..0acbf71 100644 --- a/src/libsystemd/sd-hwdb/sd-hwdb.c +++ b/src/libsystemd/sd-hwdb/sd-hwdb.c -@@ -269,7 +269,7 @@ +@@ -299,7 +299,7 @@ static int trie_search_f(sd_hwdb *hwdb, const char *search) { static const char hwdb_bin_paths[] = "/etc/systemd/hwdb/hwdb.bin\0" - "/etc/udev/hwdb.bin\0" + "/run/hwdb.bin\0" "/usr/lib/systemd/hwdb/hwdb.bin\0" - #ifdef HAVE_SPLIT_USR + #if HAVE_SPLIT_USR "/lib/systemd/hwdb/hwdb.bin\0" -diff --git a/src/udev/udevadm-hwdb.c b/src/udev/udevadm-hwdb.c -index d65e40c..8889df7 100644 ---- a/src/udev/udevadm-hwdb.c -+++ b/src/udev/udevadm-hwdb.c -@@ -562,7 +562,7 @@ static int adm_hwdb(struct udev *udev, int argc, char *argv[]) { - }; - const char *test = NULL; - const char *root = ""; -- const char *hwdb_bin_dir = "/etc/udev"; -+ const char *hwdb_bin_dir = "/run"; - bool update = false; - struct trie *trie = NULL; - int err, c; +diff --git a/units/systemd-hwdb-update.service.in b/units/systemd-hwdb-update.service.in +index 259fe0d..18d617f 100644 +--- a/units/systemd-hwdb-update.service.in ++++ b/units/systemd-hwdb-update.service.in +@@ -16,7 +16,7 @@ After=systemd-remount-fs.service + Before=sysinit.target shutdown.target systemd-update-done.service + ConditionNeedsUpdate=/etc + ConditionPathExists=|!@udevlibexecdir@/hwdb.bin +-ConditionPathExists=|/etc/udev/hwdb.bin ++ConditionPathExists=|/run/hwdb.bin + ConditionDirectoryNotEmpty=|/etc/udev/hwdb.d/ + + [Service] -- -1.7.10.4 +2.14.1 diff --git a/packages/sysutils/systemd/patches/systemd-0006-fix-build-with-glibc_2.28.patch b/packages/sysutils/systemd/patches/systemd-0006-fix-build-with-glibc_2.28.patch deleted file mode 100644 index 57df21e7c9..0000000000 --- a/packages/sysutils/systemd/patches/systemd-0006-fix-build-with-glibc_2.28.patch +++ /dev/null @@ -1,105 +0,0 @@ -From 75720bff62a84896e9a0654afc7cf9408cf89a38 Mon Sep 17 00:00:00 2001 -From: Filipe Brandenburger -Date: Sun, 15 Jul 2018 22:43:35 -0700 -Subject: [PATCH] build-sys: Detect whether struct statx is defined in - sys/stat.h -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Starting with glibc 2.27.9000-36.fc29, include file sys/stat.h will have a -definition for struct statx, in which case include file linux/stat.h should be -avoided, in order to prevent a duplicate definition. - - In file included from ../src/basic/missing.h:18, - from ../src/basic/util.h:28, - from ../src/basic/hashmap.h:10, - from ../src/shared/bus-util.h:12, - from ../src/libsystemd/sd-bus/bus-creds.c:11: - /usr/include/linux/stat.h:99:8: error: redefinition of ‘struct statx’ - struct statx { - ^~~~~ - In file included from /usr/include/sys/stat.h:446, - from ../src/basic/util.h:19, - from ../src/basic/hashmap.h:10, - from ../src/shared/bus-util.h:12, - from ../src/libsystemd/sd-bus/bus-creds.c:11: - /usr/include/bits/statx.h:36:8: note: originally defined here - struct statx - ^~~~~ - -Extend our meson.build to look for struct statx when only sys/stat.h is -included and, in that case, do not include linux/stat.h anymore. - -Tested that systemd builds correctly when using a glibc version that includes a -definition for struct statx. - -glibc Fedora RPM update: -https://src.fedoraproject.org/rpms/glibc/c/28cb5d31fc1e5887912283c889689c47076278ae - -glibc upstream commit: -https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=fd70af45528d59a00eb3190ef6706cb299488fcd ---- - meson.build | 5 +++++ - src/basic/missing.h | 5 ++++- - src/basic/xattr-util.c | 1 - - 3 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/meson.build b/meson.build -index dd904c71487..68423bdfa5e 100644 ---- a/meson.build -+++ b/meson.build -@@ -425,6 +425,7 @@ decl_headers = ''' - #include - ''' - # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail -+# FIXME: these should use -D_GNU_SOURCE, since that is defined at build time - - foreach decl : ['char16_t', - 'char32_t', -@@ -439,6 +440,10 @@ foreach decl : ['char16_t', - conf.set10('HAVE_' + decl.underscorify().to_upper(), have) - endforeach - -+conf.set10('HAVE_STRUCT_STATX_IN_SYS_STAT_H', cc.sizeof('struct statx', prefix : ''' -+#include -+''', args : '-D_GNU_SOURCE') > 0) -+ - foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'], - ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'], - ['IFLA_VRF_TABLE', 'linux/if_link.h'], -diff --git a/src/basic/missing.h b/src/basic/missing.h -index 71a07d05747..14ad3d49140 100644 ---- a/src/basic/missing.h -+++ b/src/basic/missing.h -@@ -15,7 +15,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -25,6 +24,10 @@ - #include - #include - -+#if !HAVE_STRUCT_STATX_IN_SYS_STAT_H -+#include -+#endif -+ - #if HAVE_AUDIT - #include - #endif -diff --git a/src/basic/xattr-util.c b/src/basic/xattr-util.c -index c5c55ea8461..0ee0979837c 100644 ---- a/src/basic/xattr-util.c -+++ b/src/basic/xattr-util.c -@@ -2,7 +2,6 @@ - - #include - #include --#include - #include - #include - #include diff --git a/packages/sysutils/systemd/patches/systemd-0007-fix-build-with-glibc_2.28.patch b/packages/sysutils/systemd/patches/systemd-0007-fix-build-with-glibc_2.28.patch deleted file mode 100644 index b4da33f704..0000000000 --- a/packages/sysutils/systemd/patches/systemd-0007-fix-build-with-glibc_2.28.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 9c869d08d82c73f62ab3527567858ce4b0cf1257 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= -Date: Wed, 18 Jul 2018 17:26:17 +0200 -Subject: [PATCH 1/2] meson: unify linux/stat.h check with other checks and use - _GNU_SOURCE - -Using _GNU_SOURCE is better because that's how we include the headers in the -actual build, and some headers define different stuff when it is defined. -sys/stat.h for example defines 'struct statx' conditionally. ---- - meson.build | 20 ++++++++++++++------ - src/basic/missing.h | 2 +- - 2 files changed, 15 insertions(+), 7 deletions(-) - -diff --git a/meson.build b/meson.build -index 68423bdfa5e..99035d2306c 100644 ---- a/meson.build -+++ b/meson.build -@@ -421,11 +421,9 @@ decl_headers = ''' - #include - #include - #include --#include - #include - ''' - # FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail --# FIXME: these should use -D_GNU_SOURCE, since that is defined at build time - - foreach decl : ['char16_t', - 'char32_t', -@@ -436,13 +434,23 @@ foreach decl : ['char16_t', - ] - - # We get -1 if the size cannot be determined -- have = cc.sizeof(decl, prefix : decl_headers) > 0 -+ have = cc.sizeof(decl, prefix : decl_headers, args : '-D_GNU_SOURCE') > 0 -+ -+ if decl == 'struct statx' -+ if have -+ want_linux_stat_h = false -+ else -+ have = cc.sizeof(decl, -+ prefix : decl_headers + '#include ', -+ args : '-D_GNU_SOURCE') > 0 -+ want_linux_stat_h = have -+ endif -+ endif -+ - conf.set10('HAVE_' + decl.underscorify().to_upper(), have) - endforeach - --conf.set10('HAVE_STRUCT_STATX_IN_SYS_STAT_H', cc.sizeof('struct statx', prefix : ''' --#include --''', args : '-D_GNU_SOURCE') > 0) -+conf.set10('WANT_LINUX_STAT_H', want_linux_stat_h) - - foreach decl : [['IFLA_INET6_ADDR_GEN_MODE', 'linux/if_link.h'], - ['IN6_ADDR_GEN_MODE_STABLE_PRIVACY', 'linux/if_link.h'], -diff --git a/src/basic/missing.h b/src/basic/missing.h -index 14ad3d49140..9044683b15f 100644 ---- a/src/basic/missing.h -+++ b/src/basic/missing.h -@@ -24,7 +24,7 @@ - #include - #include - --#if !HAVE_STRUCT_STATX_IN_SYS_STAT_H -+#if WANT_LINUX_STAT_H - #include - #endif - - -From 1d7aedf11a22d0c1aca40905e953a25f03252cde Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= -Date: Wed, 18 Jul 2018 17:42:06 +0200 -Subject: [PATCH 2/2] meson: remove false check for key_serial_t - -key_serial_t is defined in keyutil.h, which wasn't included in the header list -in the test, so the test always failed. We were always compiling stuff with -!HAVE_KEY_SERIAL_T. - -We could try to add keyutil.h to the test, but then we'd have to first check if -it is available, which just doesn't seem worth the trouble. - -key_serial_t should always be defined as int32_t. Let's keep the uncoditional -define, since repeated compatible typedefs are not a problem, and it allows us -to compile even if the header file is missing. If there's ever a change in the -definition, we'll have to adjust the code for the different type anyway, and -our compiler will tell us. ---- - meson.build | 2 -- - src/basic/missing.h | 2 -- - 2 files changed, 4 deletions(-) - -diff --git a/meson.build b/meson.build -index 99035d2306c..84656cdc7e8 100644 ---- a/meson.build -+++ b/meson.build -@@ -423,11 +423,9 @@ decl_headers = ''' - #include - #include - ''' --# FIXME: key_serial_t is only defined in keyutils.h, this is bound to fail - - foreach decl : ['char16_t', - 'char32_t', -- 'key_serial_t', - 'struct ethtool_link_settings', - 'struct fib_rule_uid_range', - 'struct statx', -diff --git a/src/basic/missing.h b/src/basic/missing.h -index 9044683b15f..477992fbcba 100644 ---- a/src/basic/missing.h -+++ b/src/basic/missing.h -@@ -1183,9 +1183,7 @@ struct input_mask { - #define KEY_ALS_TOGGLE 0x230 - #endif - --#if ! HAVE_KEY_SERIAL_T - typedef int32_t key_serial_t; --#endif - - #ifndef KEYCTL_JOIN_SESSION_KEYRING - #define KEYCTL_JOIN_SESSION_KEYRING 1 diff --git a/packages/sysutils/systemd/patches/systemd-0300-PR9885.patch b/packages/sysutils/systemd/patches/systemd-0300-PR9885.patch deleted file mode 100644 index 5369bde373..0000000000 --- a/packages/sysutils/systemd/patches/systemd-0300-PR9885.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 1c04c791e85f9dd5e16ae846d0c0b0a99a47076e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= -Date: Sun, 19 Aug 2018 19:11:30 +0200 -Subject: [PATCH] meson: rename -Ddebug to -Ddebug-extra - -Meson added -Doptimization and -Ddebug options, which obviously causes -a conflict with our -Ddebug options. Let's rename it. - -Fixes #9883. ---- - meson.build | 2 +- - meson_options.txt | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/meson.build b/meson.build -index f79ac4b12e7..2209c935ad6 100644 ---- a/meson.build -+++ b/meson.build -@@ -763,7 +763,7 @@ substs.set('DEBUGTTY', get_option('debug-tty')) - - enable_debug_hashmap = false - enable_debug_mmap_cache = false --foreach name : get_option('debug') -+foreach name : get_option('debug-extra') - if name == 'hashmap' - enable_debug_hashmap = true - elif name == 'mmap-cache' -diff --git a/meson_options.txt b/meson_options.txt -index e3140c8c110..7b1f61bf464 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -45,7 +45,7 @@ option('debug-shell', type : 'string', value : '/bin/sh', - description : 'path to debug shell binary') - option('debug-tty', type : 'string', value : '/dev/tty9', - description : 'specify the tty device for debug shell') --option('debug', type : 'array', choices : ['hashmap', 'mmap-cache'], value : [], -+option('debug-extra', type : 'array', choices : ['hashmap', 'mmap-cache'], value : [], - description : 'enable extra debugging') - option('memory-accounting-default', type : 'boolean', - description : 'enable MemoryAccounting= by default') diff --git a/packages/tools/atf/patches/01-plat-allwinner-h6-add-wdt_quirk-to-use-r_wdt-instead.patch b/packages/tools/atf/patches/01-plat-allwinner-h6-add-wdt_quirk-to-use-r_wdt-instead.patch new file mode 100644 index 0000000000..51dbfc9610 --- /dev/null +++ b/packages/tools/atf/patches/01-plat-allwinner-h6-add-wdt_quirk-to-use-r_wdt-instead.patch @@ -0,0 +1,36 @@ +From 523ab5be1a84e9aa15fb62c3a15a6338b01d3961 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= +Date: Tue, 9 Apr 2019 00:15:06 +0200 +Subject: [PATCH] plat: allwinner: common: use r_wdog instead of wdog +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Some Allwinner H6 has a broken watchdog that doesn't +make the soc reboot. + +Use the R_WATCHDOG instead. + +Signed-off-by: Clément Péron +Change-Id: Ie95cc30a80ed517b60b30d6bc2e655a1b53f18ba +--- + plat/allwinner/common/sunxi_pm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/plat/allwinner/common/sunxi_pm.c b/plat/allwinner/common/sunxi_pm.c +index 1d2dc93852..13e1353258 100644 +--- a/plat/allwinner/common/sunxi_pm.c ++++ b/plat/allwinner/common/sunxi_pm.c +@@ -20,9 +20,9 @@ + #include + #include + +-#define SUNXI_WDOG0_CTRL_REG (SUNXI_WDOG_BASE + 0x0010) +-#define SUNXI_WDOG0_CFG_REG (SUNXI_WDOG_BASE + 0x0014) +-#define SUNXI_WDOG0_MODE_REG (SUNXI_WDOG_BASE + 0x0018) ++#define SUNXI_WDOG0_CTRL_REG (SUNXI_R_WDOG_BASE + 0x0010) ++#define SUNXI_WDOG0_CFG_REG (SUNXI_R_WDOG_BASE + 0x0014) ++#define SUNXI_WDOG0_MODE_REG (SUNXI_R_WDOG_BASE + 0x0018) + + #define mpidr_is_valid(mpidr) ( \ + MPIDR_AFFLVL3_VAL(mpidr) == 0 && \ diff --git a/packages/tools/procps-ng/package.mk b/packages/tools/procps-ng/package.mk index 900389a0bb..3b91e9ff6b 100644 --- a/packages/tools/procps-ng/package.mk +++ b/packages/tools/procps-ng/package.mk @@ -3,12 +3,13 @@ PKG_NAME="procps-ng" PKG_VERSION="3.3.15" -PKG_SHA256="10bd744ffcb3de2d591d2f6acf1a54a7ba070fdcc432a855931a5057149f0465" +PKG_SHA256="191391fde24a1d3b9b0030d26f8dfdcbf641d36297aab7ecf2f941c5ca927e21" PKG_LICENSE="GPL" PKG_SITE="https://gitlab.com/procps-ng/procps" -PKG_URL="$SOURCEFORGE_SRC/$PKG_NAME/Production/$PKG_NAME-$PKG_VERSION.tar.xz" +PKG_URL="https://gitlab.com/procps-ng/procps/-/archive/v${PKG_VERSION}/procps-v${PKG_VERSION}.tar.bz2" PKG_DEPENDS_TARGET="toolchain ncurses" PKG_LONGDESC="Command line and full screen utilities for browsing procfs." +PKG_TOOLCHAIN="autotools" PKG_BUILD_FLAGS="+pic" PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_malloc_0_nonnull=yes \ diff --git a/packages/tools/u-boot/package.mk b/packages/tools/u-boot/package.mk index 0860e00846..295fd80936 100644 --- a/packages/tools/u-boot/package.mk +++ b/packages/tools/u-boot/package.mk @@ -27,8 +27,8 @@ case "$PROJECT" in PKG_NEED_UNPACK+=" $(get_pkg_directory rkbin)" ;; *) - PKG_VERSION="2019.01" - PKG_SHA256="50bd7e5a466ab828914d080d5f6a432345b500e8fba1ad3b7b61e95e60d51c22" + PKG_VERSION="2019.04" + PKG_SHA256="76b7772d156b3ddd7644c8a1736081e55b78828537ff714065d21dbade229bef" PKG_URL="http://ftp.denx.de/pub/u-boot/u-boot-$PKG_VERSION.tar.bz2" ;; esac diff --git a/packages/web/libmicrohttpd/package.mk b/packages/web/libmicrohttpd/package.mk index 8144bc2934..b75d299dfe 100644 --- a/packages/web/libmicrohttpd/package.mk +++ b/packages/web/libmicrohttpd/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) PKG_NAME="libmicrohttpd" -PKG_VERSION="0.9.63" -PKG_SHA256="37c36f1be177f0e37ef181a645cd3baac1000bd322a01c2eff70f3cc8c91749c" +PKG_VERSION="0.9.64" +PKG_SHA256="e792d8ed5990823a0baadea0adf94365999e702f6f1314ef9c555018dafc350e" PKG_LICENSE="LGPLv2.1" PKG_SITE="http://www.gnu.org/software/libmicrohttpd/" PKG_URL="http://ftpmirror.gnu.org/libmicrohttpd/$PKG_NAME-$PKG_VERSION.tar.gz" diff --git a/packages/web/nghttp2/package.mk b/packages/web/nghttp2/package.mk index e0f68b9a65..0ff720eb1c 100644 --- a/packages/web/nghttp2/package.mk +++ b/packages/web/nghttp2/package.mk @@ -2,8 +2,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="nghttp2" -PKG_VERSION="1.38.0" -PKG_SHA256="ef75c761858241c6b4372fa6397aa0481a984b84b7b07c4ec7dc2d7b9eee87f8" +PKG_VERSION="1.39.1" +PKG_SHA256="679160766401f474731fd60c3aca095f88451e3cc4709b72306e4c34cf981448" PKG_LICENSE="MIT" PKG_SITE="http://www.linuxfromscratch.org/blfs/view/cvs/basicnet/nghttp2.html" PKG_URL="https://github.com/nghttp2/nghttp2/releases/download/v$PKG_VERSION/nghttp2-$PKG_VERSION.tar.xz" diff --git a/packages/x11/data/xkeyboard-config/package.mk b/packages/x11/data/xkeyboard-config/package.mk index 92ebd3dce1..da05e2ffb9 100644 --- a/packages/x11/data/xkeyboard-config/package.mk +++ b/packages/x11/data/xkeyboard-config/package.mk @@ -3,8 +3,8 @@ # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) PKG_NAME="xkeyboard-config" -PKG_VERSION="2.26" -PKG_SHA256="393718c7460cd06c4e8cb819d943ca54812ea476f32714c4d8975c77031a038e" +PKG_VERSION="2.27" +PKG_SHA256="690daec8fea63526c07620c90e6f3f10aae34e94b6db6e30906173480721901f" PKG_LICENSE="MIT" PKG_SITE="http://www.X.org" PKG_URL="http://www.x.org/releases/individual/data/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.bz2" @@ -32,10 +32,3 @@ pre_configure_target() { --with-xkb-rules-symlink=xorg" fi } - -pre_build_target() { -# broken autoreconf - ( cd ${PKG_BUILD} - intltoolize --force - ) -} diff --git a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-pt-layout.patch b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-pt-layout.patch deleted file mode 100644 index 19c1d0603d..0000000000 --- a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0001-pt-layout.patch +++ /dev/null @@ -1,85 +0,0 @@ -From af6c0f29dbee1cc7b280eed891592797c2e31220 Mon Sep 17 00:00:00 2001 -From: Sergey Udaltsov -Date: Thu, 7 Feb 2019 20:40:35 +0000 -Subject: [PATCH] Fixed broken pt layout - -Backticks broke it, removed ---- - symbols/pt | 62 +++++++++++++++++++++++++++--------------------------- - 1 file changed, 31 insertions(+), 31 deletions(-) - -diff --git a/symbols/pt b/symbols/pt -index 73a1b7b..3ec0981 100644 ---- a/symbols/pt -+++ b/symbols/pt -@@ -221,35 +221,35 @@ xkb_symbols "colemak" { - - name[Group1]="Portuguese (Colemak)"; - -- key `` { [ q, Q, at, Greek_OMEGA ] }; -- key `` { [ w, W, lstroke, Lstroke ] }; -- key `` { [ f, F, dstroke, ordfeminine ] }; -- key `` { [ p, P, thorn, THORN ] }; -- key `` { [ g, G, eng, ENG ] }; -- key `` { [ j, J, dead_hook, dead_horn ] }; -- key `` { [ l, L, lstroke, Lstroke ] }; -- key `` { [ u, U, downarrow, uparrow ] }; -- key `` { [ y, Y, leftarrow, yen ] }; -- key `` { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ] }; -- -- key `` { [ a, A, ae, AE ] }; -- key `` { [ r, R, paragraph, registered ] }; -- key `` { [ s, S, ssharp, section ] }; -- key `` { [ t, T, tslash, Tslash ] }; -- key `` { [ d, D, eth, ETH ] }; -- key `` { [ h, H, hstroke, Hstroke ] }; -- key `` { [ n, N, n, N ] }; -- key `` { [ e, E, EuroSign, cent ] }; -- key `` { [ i, I, rightarrow, idotless ] }; -- key `` { [ o, O, oslash, Ooblique ] }; -- -- key `` { [ z, Z, guillemotleft, less ] }; -- key `` { [ x, X, guillemotright, greater ] }; -- key `` { [ c, C, cent, copyright ] }; -- key `` { [ v, V, leftdoublequotemark, leftsinglequotemark ] }; -- key `` { [ b, B, rightdoublequotemark, rightsinglequotemark ] }; -- key `` { [ k, K, kra, ampersand ] }; -- key `` { [ m, M, mu, masculine ] }; -- -- key `` { [ BackSpace, BackSpace, BackSpace, BackSpace ] }; -+ key { [ q, Q, at, Greek_OMEGA ] }; -+ key { [ w, W, lstroke, Lstroke ] }; -+ key { [ f, F, dstroke, ordfeminine ] }; -+ key { [ p, P, thorn, THORN ] }; -+ key { [ g, G, eng, ENG ] }; -+ key { [ j, J, dead_hook, dead_horn ] }; -+ key { [ l, L, lstroke, Lstroke ] }; -+ key { [ u, U, downarrow, uparrow ] }; -+ key { [ y, Y, leftarrow, yen ] }; -+ key { [ ccedilla, Ccedilla, dead_acute, dead_doubleacute ] }; -+ -+ key { [ a, A, ae, AE ] }; -+ key { [ r, R, paragraph, registered ] }; -+ key { [ s, S, ssharp, section ] }; -+ key { [ t, T, tslash, Tslash ] }; -+ key { [ d, D, eth, ETH ] }; -+ key { [ h, H, hstroke, Hstroke ] }; -+ key { [ n, N, n, N ] }; -+ key { [ e, E, EuroSign, cent ] }; -+ key { [ i, I, rightarrow, idotless ] }; -+ key { [ o, O, oslash, Ooblique ] }; -+ -+ key { [ z, Z, guillemotleft, less ] }; -+ key { [ x, X, guillemotright, greater ] }; -+ key { [ c, C, cent, copyright ] }; -+ key { [ v, V, leftdoublequotemark, leftsinglequotemark ] }; -+ key { [ b, B, rightdoublequotemark, rightsinglequotemark ] }; -+ key { [ k, K, kra, ampersand ] }; -+ key { [ m, M, mu, masculine ] }; -+ -+ key { [ BackSpace, BackSpace, BackSpace, BackSpace ] }; - }; --- -2.18.1 - - diff --git a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0002-revert-commits-depending-on-unreleased-packages.patch b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0002-revert-commits-depending-on-unreleased-packages.patch index 72add37985..7cbb8fc69c 100644 --- a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0002-revert-commits-depending-on-unreleased-packages.patch +++ b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0002-revert-commits-depending-on-unreleased-packages.patch @@ -57,10 +57,10 @@ index 90b8278d..f2630ffe 100644 = 255; // #define KEY_RFKILL 247 = 372; // #define KEY_FAVORITES 364 -- = 374; // #define KEY_KEYBOARD 366 +- = 382; // #define KEY_KEYBOARD 374 + = 569; // #define KEY_ROTATE_LOCK_TOGGLE 561 // Fake keycodes for virtual keys - = 92; diff --git a/symbols/inet b/symbols/inet index 4d774fac..469a7d65 100644 --- a/symbols/inet @@ -69,10 +69,10 @@ index 4d774fac..469a7d65 100644 key { [ XF86RFKill ] }; // KEY_RFKILL key { [ XF86Favorites ] }; -- key { [ XF86Keyboard ] }; +- key { [ XF86Keyboard ] }; + key { [ XF86RotationLockToggle ] }; key { [ XF86Tools ] }; - key { [ XF86Launch5 ] }; commit 3dd87655fd92a375ada3fc6d8cfe90d431baecaa Author: Andreas Boll Date: Mon Feb 11 14:55:34 2019 +0100 @@ -97,25 +97,25 @@ diff --git a/keycodes/evdev b/keycodes/evdev index f2630ffe..51a6e26d 100644 --- a/keycodes/evdev +++ b/keycodes/evdev -@@ -284,8 +284,6 @@ default xkb_keycodes "evdev" { +@@ -284,8 +284,7 @@ default xkb_keycodes "evdev" { = 254; // #define KEY_WWAN 246 = 255; // #define KEY_RFKILL 247 - = 372; // #define KEY_FAVORITES 364 -- + = 569; // #define KEY_ROTATE_LOCK_TOGGLE 561 + // Fake keycodes for virtual keys = 92; - = 203; diff --git a/symbols/inet b/symbols/inet index 469a7d65..ef0635a7 100644 --- a/symbols/inet +++ b/symbols/inet -@@ -218,8 +218,6 @@ xkb_symbols "evdev" { +@@ -218,8 +218,7 @@ xkb_symbols "evdev" { key { [ XF86WWAN ] }; // KEY_WWAN key { [ XF86RFKill ] }; // KEY_RFKILL - key { [ XF86Favorites ] }; -- + key { [ XF86RotationLockToggle ] }; + key { [ XF86Tools ] }; key { [ XF86Launch5 ] }; - key { [ XF86Launch6 ] }; diff --git a/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0003-drop-unsupported-keycode.patch b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0003-drop-unsupported-keycode.patch new file mode 100644 index 0000000000..3815c0bf78 --- /dev/null +++ b/packages/x11/data/xkeyboard-config/patches/xkeyboard-config-0003-drop-unsupported-keycode.patch @@ -0,0 +1,45 @@ +From 86c0e56796658a8a3ba1246252e88a997f48a359 Mon Sep 17 00:00:00 2001 +From: MilhouseVH +Date: Fri, 14 Jun 2019 01:00:37 +0100 +Subject: [PATCH] drop unsupported keycodes + +Jun 14 00:55:54 NUC xorg-launch[722]: The XKEYBOARD keymap compiler (xkbcomp) reports: +Jun 14 00:55:54 NUC xorg-launch[722]: > Warning: Unsupported high keycode 569 for name ignored +Jun 14 00:55:54 NUC xorg-launch[722]: > X11 cannot support keycodes above 255. +Jun 14 00:55:54 NUC xorg-launch[722]: > This warning only shows for the first high keycode. +Jun 14 00:55:54 NUC xorg-launch[722]: > Internal error: Could not resolve keysym XF86RotationLockToggle +Jun 14 00:55:54 NUC xorg-launch[722]: Errors from xkbcomp are not fatal to the X server +--- + keycodes/evdev | 2 -- + symbols/inet | 2 -- + 2 files changed, 4 deletions(-) + +diff --git a/keycodes/evdev b/keycodes/evdev +index bac7e36..51a6e26 100644 +--- a/keycodes/evdev ++++ b/keycodes/evdev +@@ -284,8 +284,6 @@ default xkb_keycodes "evdev" { + = 254; // #define KEY_WWAN 246 + = 255; // #define KEY_RFKILL 247 + +- = 569; // #define KEY_ROTATE_LOCK_TOGGLE 561 +- + // Fake keycodes for virtual keys + = 92; + = 203; +diff --git a/symbols/inet b/symbols/inet +index 1229617..39cf9dc 100644 +--- a/symbols/inet ++++ b/symbols/inet +@@ -218,8 +218,6 @@ xkb_symbols "evdev" { + key { [ XF86WWAN ] }; // KEY_WWAN + key { [ XF86RFKill ] }; // KEY_RFKILL + +- key { [ XF86RotationLockToggle ] }; +- + key { [ XF86Tools ] }; + key { [ XF86Launch5 ] }; + key { [ XF86Launch6 ] }; +-- +2.14.1 + diff --git a/packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-02-fix-linux-5.1.patch b/packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-02-fix-linux-5.1.patch new file mode 100644 index 0000000000..b2803b92d9 --- /dev/null +++ b/packages/x11/driver/xf86-video-nvidia-legacy/patches/xf86-video-nvidia-legacy-02-fix-linux-5.1.patch @@ -0,0 +1,16 @@ +diff -Nur nv/kernel/nv-drm.c nv2/kernel/nv-drm.c +--- nv/kernel/nv-drm.c 2018-05-25 06:16:20.000000000 +0200 ++++ nv2/kernel/nv-drm.c 2019-05-09 20:51:33.364278935 +0200 +@@ -146,11 +146,7 @@ + }; + + static struct drm_driver nv_drm_driver = { +-#if defined(DRIVER_LEGACY) + .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_LEGACY, +-#else +- .driver_features = DRIVER_GEM | DRIVER_PRIME, +-#endif + .load = nv_drm_load, + .unload = nv_drm_unload, + .fops = &nv_drm_fops, + diff --git a/projects/Allwinner/devices/A64/options b/projects/Allwinner/devices/A64/options index f2794bbd5e..5d79fdd0fa 100644 --- a/projects/Allwinner/devices/A64/options +++ b/projects/Allwinner/devices/A64/options @@ -28,8 +28,5 @@ # ATF platform ATF_PLATFORM="sun50i_a64" - # additional drivers to install: - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS gpu-sunxi" - # Mali GPU family MALI_FAMILY="400" diff --git a/projects/Allwinner/devices/A64/patches/linux/03-opi-win-bt.patch b/projects/Allwinner/devices/A64/patches/linux/03-opi-win-bt.patch deleted file mode 100644 index dc6dc67d00..0000000000 --- a/projects/Allwinner/devices/A64/patches/linux/03-opi-win-bt.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 398a7c7ab82ab344d693a62ee633351f93046d91 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 11 Mar 2019 17:30:24 +0100 -Subject: [PATCH] orangepi win: wifi & bt - -Signed-off-by: Jernej Skrabec ---- - .../dts/allwinner/sun50i-a64-orangepi-win.dts | 23 +++++++++++++++++++ - 1 file changed, 23 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -index 510f661229dc..5ef3c62c765e 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts -@@ -109,6 +109,8 @@ - wifi_pwrseq: wifi_pwrseq { - compatible = "mmc-pwrseq-simple"; - reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_LOW>; /* PL8 */ -+ clocks = <&rtc 1>; -+ clock-names = "ext_clock"; - }; - }; - -@@ -170,6 +172,14 @@ - bus-width = <4>; - non-removable; - status = "okay"; -+ -+ brcmf: wifi@1 { -+ reg = <1>; -+ compatible = "brcm,bcm4329-fmac"; -+ interrupt-parent = <&r_pio>; -+ interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 */ -+ interrupt-names = "host-wake"; -+ }; - }; - - &ohci0 { -@@ -342,7 +352,20 @@ - &uart1 { - pinctrl-names = "default"; - pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; -+ uart-has-rtscts; - status = "okay"; -+ -+ bluetooth { -+ compatible = "brcm,bcm43438-bt"; -+ max-speed = <1500000>; -+ clocks = <&rtc 1>; -+ clock-names = "lpo"; -+ vbat-supply = <®_dldo2>; -+ vddio-supply = <®_dldo4>; -+ device-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */ -+ host-wakeup-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */ -+ shutdown-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ -+ }; - }; - - /* On Pi-2 connector, RTS/CTS optional */ --- -2.21.0 - diff --git a/projects/Allwinner/devices/H3/options b/projects/Allwinner/devices/H3/options index dbfe882111..9656c4cbdb 100644 --- a/projects/Allwinner/devices/H3/options +++ b/projects/Allwinner/devices/H3/options @@ -37,8 +37,5 @@ # Kernel target KERNEL_TARGET="zImage" - # additional drivers to install: - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS gpu-sunxi" - # Mali GPU family MALI_FAMILY="400" diff --git a/projects/Allwinner/devices/H3/patches/linux/01-increase-bt-speed.patch b/projects/Allwinner/devices/H3/patches/linux/01-increase-bt-speed.patch new file mode 100644 index 0000000000..c96395e739 --- /dev/null +++ b/projects/Allwinner/devices/H3/patches/linux/01-increase-bt-speed.patch @@ -0,0 +1,12 @@ +diff --git a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi +index 39263e74fbb5..0ec6109ec625 100644 +--- a/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi ++++ b/arch/arm/boot/dts/sunxi-bananapi-m2-plus.dtsi +@@ -219,6 +219,7 @@ + + bluetooth { + compatible = "brcm,bcm43438-bt"; ++ max-speed = <1500000>; + clocks = <&rtc 1>; + clock-names = "lpo"; + vbat-supply = <®_vcc3v3>; diff --git a/projects/Allwinner/devices/H6/options b/projects/Allwinner/devices/H6/options index 7d66ff14b1..40b25b1509 100644 --- a/projects/Allwinner/devices/H6/options +++ b/projects/Allwinner/devices/H6/options @@ -28,8 +28,5 @@ # ATF platform ATF_PLATFORM="sun50i_h6" - # additional drivers to install: - ADDITIONAL_DRIVERS="$ADDITIONAL_DRIVERS gpu-sunxi-midgard" - # Mali GPU family MALI_FAMILY="t720" diff --git a/projects/Allwinner/devices/H6/patches/linux/01-add-mali-node.patch b/projects/Allwinner/devices/H6/patches/linux/01-add-mali-node.patch index 4f7213a10f..a74e5a7a1e 100644 --- a/projects/Allwinner/devices/H6/patches/linux/01-add-mali-node.patch +++ b/projects/Allwinner/devices/H6/patches/linux/01-add-mali-node.patch @@ -79,12 +79,12 @@ diff -Nur a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/a }; + gpu: gpu@1800000 { -+ compatible = "arm,malit720", "arm,malit72x", "arm,malit7xx", "arm,mali-midgard"; ++ compatible = "arm,mali-t720", "arm,mali-midgard"; + reg = <0x01800000 0x4000>; + interrupts = , + , + ; -+ interrupt-names = "JOB", "MMU", "GPU"; ++ interrupt-names = "job", "mmu", "gpu"; + + clocks = <&ccu CLK_GPU>, <&ccu CLK_BUS_GPU>; + clock-names = "clk_mali", "clk_bus_mali"; diff --git a/projects/Allwinner/devices/H6/patches/linux/03-VPU.patch b/projects/Allwinner/devices/H6/patches/linux/03-VPU.patch deleted file mode 100644 index 53eb2a0463..0000000000 --- a/projects/Allwinner/devices/H6/patches/linux/03-VPU.patch +++ /dev/null @@ -1,240 +0,0 @@ -From ed19ec00d4d62a74857ad9c2ea1dbf9671ac3580 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 19:36:54 +0100 -Subject: [PATCH 1/6] dt-bindings: media: cedrus: Add H6 compatible - -This adds a compatible for H6. H6 VPU supports 10-bit HEVC decoding and -additional AFBC output format for HEVC. - -Signed-off-by: Jernej Skrabec ---- - Documentation/devicetree/bindings/media/cedrus.txt | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/Documentation/devicetree/bindings/media/cedrus.txt b/Documentation/devicetree/bindings/media/cedrus.txt -index bce0705df953..20c82fb0c343 100644 ---- a/Documentation/devicetree/bindings/media/cedrus.txt -+++ b/Documentation/devicetree/bindings/media/cedrus.txt -@@ -13,6 +13,7 @@ Required properties: - - "allwinner,sun8i-h3-video-engine" - - "allwinner,sun50i-a64-video-engine" - - "allwinner,sun50i-h5-video-engine" -+ - "allwinner,sun50i-h6-video-engine" - - reg : register base and length of VE; - - clocks : list of clock specifiers, corresponding to entries in - the clock-names property; --- -2.20.1 - - -From bb6b00e1225a5b382b723d3c2190429e15a4c607 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 19:45:38 +0100 -Subject: [PATCH 2/6] media: cedrus: Add a quirk for not setting DMA offset - -H6 VPU doesn't work if DMA offset is set. - -Add a quirk for it. - -Signed-off-by: Jernej Skrabec ---- - drivers/staging/media/sunxi/cedrus/cedrus.h | 3 +++ - drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 3 ++- - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index 4aedd24a9848..c57c04b41d2e 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -28,6 +28,8 @@ - - #define CEDRUS_CAPABILITY_UNTILED BIT(0) - -+#define CEDRUS_QUIRK_NO_DMA_OFFSET BIT(0) -+ - enum cedrus_codec { - CEDRUS_CODEC_MPEG2, - -@@ -91,6 +93,7 @@ struct cedrus_dec_ops { - - struct cedrus_variant { - unsigned int capabilities; -+ unsigned int quirks; - }; - - struct cedrus_dev { -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -index 0acf219a8c91..fbfff7c1c771 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -@@ -177,7 +177,8 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - */ - - #ifdef PHYS_PFN_OFFSET -- dev->dev->dma_pfn_offset = PHYS_PFN_OFFSET; -+ if (!(variant->quirks & CEDRUS_QUIRK_NO_DMA_OFFSET)) -+ dev->dev->dma_pfn_offset = PHYS_PFN_OFFSET; - #endif - - ret = of_reserved_mem_device_init(dev->dev); --- -2.20.1 - - -From 744c66f8c328ef40b6fb246f8b9f2daa9cce4d9d Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 19:47:33 +0100 -Subject: [PATCH 3/6] media: cedrus: Add support for H6 - -H6 has improved VPU. It supports 10-bit HEVC decoding and AFBC output -format for HEVC. - -Signed-off-by: Jernej Skrabec ---- - drivers/staging/media/sunxi/cedrus/cedrus.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c -index ff11cbeba205..b98add3cdedd 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c -@@ -396,6 +396,11 @@ static const struct cedrus_variant sun50i_h5_cedrus_variant = { - .capabilities = CEDRUS_CAPABILITY_UNTILED, - }; - -+static const struct cedrus_variant sun50i_h6_cedrus_variant = { -+ .capabilities = CEDRUS_CAPABILITY_UNTILED | CEDRUS_CAPABILITY_H265_DEC, -+ .quirks = CEDRUS_QUIRK_NO_DMA_OFFSET, -+}; -+ - static const struct of_device_id cedrus_dt_match[] = { - { - .compatible = "allwinner,sun4i-a10-video-engine", -@@ -425,6 +430,10 @@ static const struct of_device_id cedrus_dt_match[] = { - .compatible = "allwinner,sun50i-h5-video-engine", - .data = &sun50i_h5_cedrus_variant, - }, -+ { -+ .compatible = "allwinner,sun50i-h6-video-engine", -+ .data = &sun50i_h6_cedrus_variant, -+ }, - { /* sentinel */ } - }; - MODULE_DEVICE_TABLE(of, cedrus_dt_match); --- -2.20.1 - - -From b4ca53c594950b80d71ac320b3505a303e7f6092 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 20:05:47 +0100 -Subject: [PATCH 4/6] dt-bindings: sram: sunxi: Add compatible for the H6 SRAM - C1 - -This introduces a new compatible for the H6 SRAM C1 section, that is -compatible with the SRAM C1 section as found on the A10. - -Signed-off-by: Jernej Skrabec ---- - Documentation/devicetree/bindings/sram/sunxi-sram.txt | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/Documentation/devicetree/bindings/sram/sunxi-sram.txt b/Documentation/devicetree/bindings/sram/sunxi-sram.txt -index ab5a70bb9a64..380246a805f2 100644 ---- a/Documentation/devicetree/bindings/sram/sunxi-sram.txt -+++ b/Documentation/devicetree/bindings/sram/sunxi-sram.txt -@@ -63,6 +63,7 @@ The valid sections compatible for H5 are: - - The valid sections compatible for H6 are: - - allwinner,sun50i-h6-sram-c, allwinner,sun50i-a64-sram-c -+ - allwinner,sun50i-h6-sram-c1, allwinner,sun4i-a10-sram-c1 - - The valid sections compatible for F1C100s are: - - allwinner,suniv-f1c100s-sram-d, allwinner,sun4i-a10-sram-d --- -2.20.1 - - -From 6a505c910b90581b2a980e52f9b6fcb03d234cb7 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 19:53:30 +0100 -Subject: [PATCH 5/6] arm64: dts: allwinner: h6: Add support for the SRAM C1 - section - -Add a node for H6 SRAM C1 section. - -Manual calls it VE SRAM, but for consistency with older SoCs, SRAM C1 -name is used. - -Signed-off-by: Jernej Skrabec ---- - arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -index d93a7add67e7..247dc0a5ce89 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -@@ -167,6 +167,20 @@ - reg = <0x0000 0x1e000>; - }; - }; -+ -+ sram_c1: sram@1a00000 { -+ compatible = "mmio-sram"; -+ reg = <0x01a00000 0x200000>; -+ #address-cells = <1>; -+ #size-cells = <1>; -+ ranges = <0 0x01a00000 0x200000>; -+ -+ ve_sram: sram-section@0 { -+ compatible = "allwinner,sun50i-h6-sram-c1", -+ "allwinner,sun4i-a10-sram-c1"; -+ reg = <0x000000 0x200000>; -+ }; -+ }; - }; - - ccu: clock@3001000 { --- -2.20.1 - - -From c1b3128ac98c05c0afde4e6e065d6b1f2ae1dfa7 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Mon, 28 Jan 2019 19:59:27 +0100 -Subject: [PATCH 6/6] arm64: dts: allwinner: h6: Add Video Engine node - -This adds the Video engine node for H6. It can use whole DRAM range so -there is no need for reserved memory node. - -Signed-off-by: Jernej Skrabec ---- - arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -index 247dc0a5ce89..de4b7a1f1012 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi -@@ -146,6 +146,17 @@ - }; - }; - -+ video-codec@1c0e000 { -+ compatible = "allwinner,sun50i-h6-video-engine"; -+ reg = <0x01c0e000 0x2000>; -+ clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>, -+ <&ccu CLK_MBUS_VE>; -+ clock-names = "ahb", "mod", "ram"; -+ resets = <&ccu RST_BUS_VE>; -+ interrupts = ; -+ allwinner,sram = <&ve_sram 1>; -+ }; -+ - syscon: syscon@3000000 { - compatible = "allwinner,sun50i-h6-system-control", - "allwinner,sun50i-a64-system-control"; --- -2.20.1 - diff --git a/projects/Allwinner/devices/H6/patches/linux/06-10-bit-HEVC-hack.patch b/projects/Allwinner/devices/H6/patches/linux/06-10-bit-HEVC-hack.patch new file mode 100644 index 0000000000..2068b70a1e --- /dev/null +++ b/projects/Allwinner/devices/H6/patches/linux/06-10-bit-HEVC-hack.patch @@ -0,0 +1,91 @@ +From d117460aed81ee5cd384045a1189c9de758d17c6 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Tue, 28 May 2019 21:05:34 +0200 +Subject: [PATCH] 10-bit HEVC hack + +Signed-off-by: Jernej Skrabec +--- + drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 12 ++++++++++++ + drivers/staging/media/sunxi/cedrus/cedrus_regs.h | 4 ++++ + drivers/staging/media/sunxi/cedrus/cedrus_video.c | 13 +++++++++++-- + 3 files changed, 27 insertions(+), 2 deletions(-) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +index 8bbbe69ae51f..04ba7d60ebcd 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +@@ -453,6 +453,18 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, + + cedrus_write(dev, VE_DEC_H265_DEC_PCM_CTRL, reg); + ++ if (sps->bit_depth_luma_minus8) { ++ unsigned int size; ++ ++ size = ALIGN(ctx->src_fmt.width, 16) * ALIGN(ctx->src_fmt.height, 16); ++ ++ reg = (size * 3) / 2; ++ cedrus_write(dev, VE_DEC_H265_OFFSET_ADDR_FIRST_OUT, reg); ++ ++ reg = DIV_ROUND_UP(ctx->src_fmt.width, 4); ++ cedrus_write(dev, VE_DEC_H265_10BIT_CONFIGURE, ALIGN(reg, 32)); ++ } ++ + reg = VE_DEC_H265_DEC_PPS_CTRL0_PPS_CR_QP_OFFSET(pps->pps_cr_qp_offset) | + VE_DEC_H265_DEC_PPS_CTRL0_PPS_CB_QP_OFFSET(pps->pps_cb_qp_offset) | + VE_DEC_H265_DEC_PPS_CTRL0_INIT_QP_MINUS26(pps->init_qp_minus26) | +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +index d1f010ae49ef..dd69031a2779 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +@@ -505,6 +505,10 @@ + + #define VE_DEC_H265_LOW_ADDR (VE_ENGINE_DEC_H265 + 0x80) + ++#define VE_DEC_H265_OFFSET_ADDR_FIRST_OUT (VE_ENGINE_DEC_H265 + 0x84) ++#define VE_DEC_H265_OFFSET_ADDR_SECOND_OUT (VE_ENGINE_DEC_H265 + 0x88) ++#define VE_DEC_H265_10BIT_CONFIGURE (VE_ENGINE_DEC_H265 + 0x8c) ++ + #define VE_DEC_H265_LOW_ADDR_PRIMARY_CHROMA(a) \ + (((a) << 24) & GENMASK(31, 24)) + #define VE_DEC_H265_LOW_ADDR_SECONDARY_CHROMA(a) \ +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c +index d27a9e82ff91..2c2288319c9d 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c +@@ -372,6 +372,7 @@ static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs, + struct cedrus_ctx *ctx = vb2_get_drv_priv(vq); + struct cedrus_dev *dev = ctx->dev; + struct v4l2_pix_format *pix_fmt; ++ unsigned int extra_size = 0; + u32 directions; + + if (V4L2_TYPE_IS_OUTPUT(vq->type)) { +@@ -380,6 +381,14 @@ static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs, + } else { + directions = CEDRUS_DECODE_DST; + pix_fmt = &ctx->dst_fmt; ++ ++ /* The HEVC decoder needs extra size on the output buffer. */ ++ if (ctx->src_fmt.pixelformat == V4L2_PIX_FMT_HEVC_SLICE) { ++ extra_size = DIV_ROUND_UP(pix_fmt->width, 4); ++ extra_size = ALIGN(extra_size, 32); ++ extra_size *= ALIGN(pix_fmt->height, 16) * 3; ++ extra_size /= 2; ++ } + } + + if (!cedrus_check_format(pix_fmt->pixelformat, directions, +@@ -387,8 +396,8 @@ static int cedrus_queue_setup(struct vb2_queue *vq, unsigned int *nbufs, + return -EINVAL; + + if (*nplanes) { +- if (sizes[0] < pix_fmt->sizeimage) +- return -EINVAL; ++ if (sizes[0] < (pix_fmt->sizeimage + extra_size)) ++ sizes[0] = pix_fmt->sizeimage + extra_size; + } else { + sizes[0] = pix_fmt->sizeimage; + *nplanes = 1; +-- +2.21.0 + diff --git a/projects/Allwinner/devices/H6/patches/linux/06-cedrus-increase-frequency.patch b/projects/Allwinner/devices/H6/patches/linux/06-cedrus-increase-frequency.patch deleted file mode 100644 index 7abb69bb99..0000000000 --- a/projects/Allwinner/devices/H6/patches/linux/06-cedrus-increase-frequency.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 18c9a269e2b744ee84f32de9d5c6c66857725ef8 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Sat, 15 Dec 2018 12:56:53 +0100 -Subject: [PATCH 20/20] cedrus increase frequency - ---- - drivers/staging/media/sunxi/cedrus/cedrus_hw.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -index b43c77d54b95..70677571f3d3 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -@@ -16,7 +16,7 @@ - #ifndef _CEDRUS_HW_H_ - #define _CEDRUS_HW_H_ - --#define CEDRUS_CLOCK_RATE_DEFAULT 402000000 -+#define CEDRUS_CLOCK_RATE_DEFAULT 600000000 - - int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec); - void cedrus_engine_disable(struct cedrus_dev *dev); --- -2.20.0 - diff --git a/projects/Allwinner/devices/H6/patches/linux/07-limit-max-pixel-clock.patch b/projects/Allwinner/devices/H6/patches/linux/07-limit-max-pixel-clock.patch deleted file mode 100644 index 29bd0ce45f..0000000000 --- a/projects/Allwinner/devices/H6/patches/linux/07-limit-max-pixel-clock.patch +++ /dev/null @@ -1,20 +0,0 @@ -diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c -index caea5a9f8f1d..ba4ce576b471 100644 ---- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c -+++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c -@@ -48,8 +48,13 @@ static enum drm_mode_status - sun8i_dw_hdmi_mode_valid_h6(struct drm_connector *connector, - const struct drm_display_mode *mode) - { -- /* This is max for HDMI 2.0b (4K@60Hz) */ -- if (mode->clock > 594000) -+ /* -+ * Controller support maximum of 594 MHz, which correlates to -+ * 4K@60Hz 4:4:4 or RGB. However, for frequencies greater than -+ * 340 MHz scrambling has to be enabled. Because scrambling is -+ * not yet implemented, just limit to 340 MHz for now. -+ */ -+ if (mode->clock > 340000) - return MODE_CLOCK_HIGH; - - return MODE_OK; diff --git a/projects/Allwinner/devices/H6/patches/linux/07-opi3.patch b/projects/Allwinner/devices/H6/patches/linux/07-opi3.patch new file mode 100644 index 0000000000..bbfc2b929a --- /dev/null +++ b/projects/Allwinner/devices/H6/patches/linux/07-opi3.patch @@ -0,0 +1,1325 @@ +From 9ea7a168e5cab7ad820439f1c595360e8c2415db Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 19 Feb 2019 21:54:24 +0100 +Subject: [PATCH 01/34] rtc: sun6i: Add support for H6 RTC + +It is mostly the same as on H5 and H3, but with slight differences +in features that are not yet supported by this driver, so we need +a different compatible, but we can re-use sun8i_h3_rtc_clk_init. + +Some differences are already stated in the comments in existing code. +One other difference is that H6 has extra bit in LOSC_CTRL_REG, called +EXT_LOSC_EN to enable/disable external low speed crystal oscillator. + +It also has bit EXT_LOSC_STA in LOSC_AUTO_SWT_STA_REG, to check whether +external low speed oscillator is working correctly. + +Signed-off-by: Ondrej Jirman +--- + drivers/rtc/rtc-sun6i.c | 47 +++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 45 insertions(+), 2 deletions(-) + +diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c +index 11f56de521791..b0fbaa1837dd5 100644 +--- a/drivers/rtc/rtc-sun6i.c ++++ b/drivers/rtc/rtc-sun6i.c +@@ -41,11 +41,15 @@ + /* Control register */ + #define SUN6I_LOSC_CTRL 0x0000 + #define SUN6I_LOSC_CTRL_KEY (0x16aa << 16) ++#define SUN6I_LOSC_CTRL_AUTO_SWT_EN BIT(14) ++#define SUN6I_LOSC_CTRL_AUTO_SWT_BYPASS BIT(15) + #define SUN6I_LOSC_CTRL_ALM_DHMS_ACC BIT(9) + #define SUN6I_LOSC_CTRL_RTC_HMS_ACC BIT(8) + #define SUN6I_LOSC_CTRL_RTC_YMD_ACC BIT(7) ++#define SUN6I_LOSC_CTRL_EXT_LOSC_EN BIT(4) + #define SUN6I_LOSC_CTRL_EXT_OSC BIT(0) + #define SUN6I_LOSC_CTRL_ACC_MASK GENMASK(9, 7) ++#define SUN6I_LOSC_CTRL_EXT_OSC_GSM 0x08 + + #define SUN6I_LOSC_CLK_PRESCAL 0x0008 + +@@ -137,6 +141,8 @@ struct sun6i_rtc_clk_data { + unsigned int has_prescaler : 1; + unsigned int has_out_clk : 1; + unsigned int export_iosc : 1; ++ unsigned int has_losc_en : 1; ++ unsigned int has_auto_swt : 1; + }; + + struct sun6i_rtc_dev { +@@ -199,6 +205,10 @@ static int sun6i_rtc_osc_set_parent(struct clk_hw *hw, u8 index) + val &= ~SUN6I_LOSC_CTRL_EXT_OSC; + val |= SUN6I_LOSC_CTRL_KEY; + val |= index ? SUN6I_LOSC_CTRL_EXT_OSC : 0; ++ if (rtc->data->has_losc_en) { ++ val &= ~SUN6I_LOSC_CTRL_EXT_LOSC_EN; ++ val |= index ? SUN6I_LOSC_CTRL_EXT_LOSC_EN : 0; ++ } + writel(val, rtc->base + SUN6I_LOSC_CTRL); + spin_unlock_irqrestore(&rtc->lock, flags); + +@@ -224,6 +234,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node, + const char *iosc_name = "rtc-int-osc"; + const char *clkout_name = "osc32k-out"; + const char *parents[2]; ++ u32 reg; + + rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); + if (!rtc) +@@ -244,9 +255,23 @@ static void __init sun6i_rtc_clk_init(struct device_node *node, + goto err; + } + ++ reg = SUN6I_LOSC_CTRL_KEY; ++ if (rtc->data->has_auto_swt) { ++ /* Bypass auto-switch to int osc, on ext losc failure */ ++ reg |= SUN6I_LOSC_CTRL_AUTO_SWT_BYPASS; ++ writel(reg, rtc->base + SUN6I_LOSC_CTRL); ++ } ++ + /* Switch to the external, more precise, oscillator */ +- writel(SUN6I_LOSC_CTRL_KEY | SUN6I_LOSC_CTRL_EXT_OSC, +- rtc->base + SUN6I_LOSC_CTRL); ++ reg |= SUN6I_LOSC_CTRL_EXT_OSC; ++ if (rtc->data->has_losc_en) ++ reg |= SUN6I_LOSC_CTRL_EXT_LOSC_EN; ++ writel(reg, rtc->base + SUN6I_LOSC_CTRL); ++ ++ /* Set GSM with some delay, after switching to ext losc. */ ++ udelay(10); ++ reg |= SUN6I_LOSC_CTRL_EXT_OSC_GSM; ++ writel(reg, rtc->base + SUN6I_LOSC_CTRL); + + /* Yes, I know, this is ugly. */ + sun6i_rtc = rtc; +@@ -354,6 +379,23 @@ CLK_OF_DECLARE_DRIVER(sun8i_h3_rtc_clk, "allwinner,sun8i-h3-rtc", + CLK_OF_DECLARE_DRIVER(sun50i_h5_rtc_clk, "allwinner,sun50i-h5-rtc", + sun8i_h3_rtc_clk_init); + ++static const struct sun6i_rtc_clk_data sun50i_h6_rtc_data = { ++ .rc_osc_rate = 16000000, ++ .fixed_prescaler = 32, ++ .has_prescaler = 1, ++ .has_out_clk = 1, ++ .export_iosc = 1, ++ .has_losc_en = 1, ++ .has_auto_swt = 1, ++}; ++ ++static void __init sun50i_h6_rtc_clk_init(struct device_node *node) ++{ ++ sun6i_rtc_clk_init(node, &sun50i_h6_rtc_data); ++} ++CLK_OF_DECLARE_DRIVER(sun50i_h6_rtc_clk, "allwinner,sun50i-h6-rtc", ++ sun50i_h6_rtc_clk_init); ++ + static const struct sun6i_rtc_clk_data sun8i_v3_rtc_data = { + .rc_osc_rate = 32000, + .has_out_clk = 1, +@@ -683,6 +725,7 @@ static const struct of_device_id sun6i_rtc_dt_ids[] = { + { .compatible = "allwinner,sun8i-h3-rtc" }, + { .compatible = "allwinner,sun8i-v3-rtc" }, + { .compatible = "allwinner,sun50i-h5-rtc" }, ++ { .compatible = "allwinner,sun50i-h6-rtc" }, + { /* sentinel */ }, + }; + MODULE_DEVICE_TABLE(of, sun6i_rtc_dt_ids); + +From 80472652eff72ba5198dc5d678612fb91e411ed1 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Fri, 12 Apr 2019 13:32:05 +0200 +Subject: [PATCH 02/34] arm64: dts: sun50i-h6: Add support for RTC and fix the + clock tree + +This patch adds RTC node and fixes the clock properties and nodes +to reflect the real clock tree. + +The device nodes for the internal oscillator and osc32k are removed, +as these clocks are now provided by the RTC device. Clock references +are fixed accordingly, too. + +Signed-off-by: Ondrej Jirman +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 30 +++++++++++--------- + 1 file changed, 16 insertions(+), 14 deletions(-) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index c9e861a50a633..ae7977f3f054c 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -56,14 +56,6 @@ + status = "disabled"; + }; + +- iosc: internal-osc-clk { +- #clock-cells = <0>; +- compatible = "fixed-clock"; +- clock-frequency = <16000000>; +- clock-accuracy = <300000000>; +- clock-output-names = "iosc"; +- }; +- + osc24M: osc24M_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; +@@ -71,11 +63,11 @@ + clock-output-names = "osc24M"; + }; + +- osc32k: osc32k_clk { ++ ext_osc32k: ext_osc32k_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <32768>; +- clock-output-names = "osc32k"; ++ clock-output-names = "ext_osc32k"; + }; + + psci { +@@ -186,7 +178,7 @@ + ccu: clock@3001000 { + compatible = "allwinner,sun50i-h6-ccu"; + reg = <0x03001000 0x1000>; +- clocks = <&osc24M>, <&osc32k>, <&iosc>; ++ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>; + clock-names = "hosc", "losc", "iosc"; + #clock-cells = <1>; + #reset-cells = <1>; +@@ -199,7 +191,7 @@ + , + , + ; +- clocks = <&ccu CLK_APB1>, <&osc24M>, <&osc32k>; ++ clocks = <&ccu CLK_APB1>, <&osc24M>, <&rtc 0>; + clock-names = "apb", "hosc", "losc"; + gpio-controller; + #gpio-cells = <3>; +@@ -583,10 +575,20 @@ + }; + }; + ++ rtc: rtc@7000000 { ++ compatible = "allwinner,sun50i-h6-rtc"; ++ reg = <0x07000000 0x400>; ++ interrupts = , ++ ; ++ clock-output-names = "osc32k", "osc32k-out", "iosc"; ++ clocks = <&ext_osc32k>; ++ #clock-cells = <1>; ++ }; ++ + r_ccu: clock@7010000 { + compatible = "allwinner,sun50i-h6-r-ccu"; + reg = <0x07010000 0x400>; +- clocks = <&osc24M>, <&osc32k>, <&iosc>, ++ clocks = <&osc24M>, <&rtc 0>, <&rtc 2>, + <&ccu CLK_PLL_PERIPH0>; + clock-names = "hosc", "losc", "iosc", "pll-periph"; + #clock-cells = <1>; +@@ -607,7 +609,7 @@ + reg = <0x07022000 0x400>; + interrupts = , + ; +- clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&osc32k>; ++ clocks = <&r_ccu CLK_R_APB1>, <&osc24M>, <&rtc 0>; + clock-names = "apb", "hosc", "losc"; + gpio-controller; + #gpio-cells = <3>; + +From de4dc594bb3cb124d21fd7550ca0497c7fa22ff0 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Thu, 11 Apr 2019 11:20:54 +0200 +Subject: [PATCH 07/34] arm64: dts: h6: Make mmc0_pins the default for &mmc0 + +Signed-off-by: Ondrej Jirman +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index ae7977f3f054c..91623a8cd2a08 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -254,6 +254,8 @@ + resets = <&ccu RST_BUS_MMC0>; + reset-names = "ahb"; + interrupts = ; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc0_pins>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + +From 45bbbb485eb478df71079fd69f7ee8e48d0b0809 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Thu, 11 Apr 2019 11:11:21 +0200 +Subject: [PATCH 08/34] arm64: dts: allwinner: h6: Add Orange Pi 3 DTS + +Orange Pi 3 is a H6 based SBC made by Xulong, released in January 2019. It +has the following features: + +- Allwinner H6 quad-core 64-bit ARM Cortex-A53 +- GPU Mali-T720 +- 1GB or 2GB LPDDR3 RAM +- AXP805 PMIC +- AP6256 Wifi/BT 5.0 +- USB 2.0 host port (A) +- USB 2.0 micro usb, OTG +- USB 3.0 Host + 4 port USB hub (GL3510) +- Gigabit Ethernet (Realtek RTL8211E phy) +- HDMI 2.0 port +- soldered eMMC (optional) +- 3x LED (one is on the bottom) +- microphone +- audio jack +- PCIe + +Add basic support for the board. + +Signed-off-by: Ondrej Jirman +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/Makefile | 1 + + .../dts/allwinner/sun50i-h6-orangepi-3.dts | 215 ++++++++++++++++++ + 2 files changed, 216 insertions(+) + create mode 100644 arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts + +diff --git a/arch/arm64/boot/dts/allwinner/Makefile b/arch/arm64/boot/dts/allwinner/Makefile +index 0b09171110994..13a7e87bc35cc 100644 +--- a/arch/arm64/boot/dts/allwinner/Makefile ++++ b/arch/arm64/boot/dts/allwinner/Makefile +@@ -19,6 +19,7 @@ dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-pc2.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-prime.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h5-orangepi-zero-plus2.dtb ++dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-3.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-lite2.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-orangepi-one-plus.dtb + dtb-$(CONFIG_ARCH_SUNXI) += sun50i-h6-pine-h64.dtb +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +new file mode 100644 +index 0000000000000..17d4969901086 +--- /dev/null ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -0,0 +1,229 @@ ++// SPDX-License-Identifier: (GPL-2.0+ or MIT) ++/* ++ * Copyright (C) 2019 Ondřej Jirman ++ */ ++ ++/dts-v1/; ++ ++#include "sun50i-h6.dtsi" ++ ++#include ++ ++/ { ++ model = "OrangePi 3"; ++ compatible = "xunlong,orangepi-3", "allwinner,sun50i-h6"; ++ ++ aliases { ++ serial0 = &uart0; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ power { ++ label = "orangepi:red:power"; ++ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ ++ default-state = "on"; ++ }; ++ ++ status { ++ label = "orangepi:green:status"; ++ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ ++ }; ++ }; ++ ++ reg_vcc5v: vcc5v { ++ /* board wide 5V supply directly from the DC jack */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-5v"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-always-on; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <®_dcdca>; ++}; ++ ++&ehci0 { ++ status = "okay"; ++}; ++ ++&ehci3 { ++ status = "okay"; ++}; ++ ++&gpu { ++ mali-supply = <®_dcdcc>; ++}; ++ ++&mmc0 { ++ vmmc-supply = <®_cldo1>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&mmc2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc2_pins>; ++ vmmc-supply = <®_cldo1>; ++ non-removable; ++ cap-mmc-hw-reset; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&ohci0 { ++ status = "okay"; ++}; ++ ++&ohci3 { ++ status = "okay"; ++}; ++ ++&pio { ++ vcc-pc-supply = <®_bldo2>; ++ vcc-pd-supply = <®_cldo1>; ++}; ++ ++&r_i2c { ++ status = "okay"; ++ ++ axp805: pmic@36 { ++ compatible = "x-powers,axp805", "x-powers,axp806"; ++ reg = <0x36>; ++ interrupt-parent = <&r_intc>; ++ interrupts = <0 IRQ_TYPE_LEVEL_LOW>; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ x-powers,self-working-mode; ++ vina-supply = <®_vcc5v>; ++ vinb-supply = <®_vcc5v>; ++ vinc-supply = <®_vcc5v>; ++ vind-supply = <®_vcc5v>; ++ vine-supply = <®_vcc5v>; ++ aldoin-supply = <®_vcc5v>; ++ bldoin-supply = <®_vcc5v>; ++ cldoin-supply = <®_vcc5v>; ++ ++ regulators { ++ reg_aldo1: aldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-pl-led-ir"; ++ }; ++ ++ reg_aldo2: aldo2 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-audio-tv-ephy-mac"; ++ }; ++ ++ /* ALDO3 is shorted to CLDO1 */ ++ reg_aldo3: aldo3 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-1"; ++ }; ++ ++ reg_bldo1: bldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc18-dram-bias-pll"; ++ }; ++ ++ reg_bldo2: bldo2 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-efuse-pcie-hdmi-pc"; ++ }; ++ ++ bldo3 { ++ /* unused */ ++ }; ++ ++ bldo4 { ++ /* unused */ ++ }; ++ ++ reg_cldo1: cldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2"; ++ }; ++ ++ cldo2 { ++ /* unused */ ++ }; ++ ++ cldo3 { ++ /* unused */ ++ }; ++ ++ reg_dcdca: dcdca { ++ regulator-always-on; ++ regulator-min-microvolt = <800000>; ++ regulator-max-microvolt = <1160000>; ++ regulator-name = "vdd-cpu"; ++ }; ++ ++ reg_dcdcc: dcdcc { ++ regulator-min-microvolt = <810000>; ++ regulator-max-microvolt = <1080000>; ++ regulator-name = "vdd-gpu"; ++ }; ++ ++ reg_dcdcd: dcdcd { ++ regulator-always-on; ++ regulator-min-microvolt = <960000>; ++ regulator-max-microvolt = <960000>; ++ regulator-name = "vdd-sys"; ++ }; ++ ++ reg_dcdce: dcdce { ++ regulator-always-on; ++ regulator-min-microvolt = <1200000>; ++ regulator-max-microvolt = <1200000>; ++ regulator-name = "vcc-dram"; ++ }; ++ ++ sw { ++ /* unused */ ++ }; ++ }; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ph_pins>; ++ status = "okay"; ++}; ++ ++&usb2otg { ++ /* ++ * This board doesn't have a controllable VBUS even though it ++ * does have an ID pin. Using it as anything but a USB host is ++ * unsafe. ++ */ ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb2phy { ++ usb0_id_det-gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>; /* PC15 */ ++ usb0_vbus-supply = <®_vcc5v>; ++ usb3_vbus-supply = <®_vcc5v>; ++ status = "okay"; ++}; + +From 2a87073bd0857fd9707de2ac96cb04d6d9e0e288 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Tue, 9 Jan 2018 23:58:12 +0800 +Subject: [PATCH 10/34] net: stmmac: sun8i: force select external PHY when no + internal one + +From e6d3f7e02d211522c7f1cc09df946292601b55b6 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Wed, 27 Mar 2019 13:21:06 +0100 +Subject: [PATCH 13/34] arm64: dts: allwinner: orange-pi-3: Enable ethernet + +Orange Pi 3 has two regulators that power the Realtek RTL8211E. According +to the phy datasheet, both regulators need to be enabled at the same time, +but we can only specify a single phy-supply in the DT. + +This can be achieved by making one regulator depedning on the other via +vin-supply. While it's not a technically correct description of the +hardware, it achieves the purpose. + +All values of RX/TX delay were tested exhaustively and a middle one of the +working values was chosen. + +Signed-off-by: Ondrej Jirman +--- + .../dts/allwinner/sun50i-h6-orangepi-3.dts | 44 +++++++++++++++++++ + 1 file changed, 44 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +index 17d4969901086..6d6b1f66796d9 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -15,6 +15,7 @@ + + aliases { + serial0 = &uart0; ++ ethernet0 = &emac; + }; + + chosen { +@@ -44,6 +45,27 @@ + regulator-max-microvolt = <5000000>; + regulator-always-on; + }; ++ ++ /* ++ * The board uses 2.5V RGMII signalling. Power sequence to enable ++ * the phy is to enable GMAC-2V5 and GMAC-3V3 (aldo2) power rails ++ * at the same time and to wait 100ms. ++ */ ++ reg_gmac_2v5: gmac-2v5 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-2v5"; ++ regulator-min-microvolt = <2500000>; ++ regulator-max-microvolt = <2500000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ ++ /* The real parent of gmac-2v5 is reg_vcc5v, but we need to ++ * enable two regulators to power the phy. This is one way ++ * to achieve that. ++ */ ++ vin-supply = <®_aldo2>; /* GMAC-3V3 */ ++ }; + }; + + &cpu0 { +@@ -58,6 +80,28 @@ + status = "okay"; + }; + ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_2v5>; ++ allwinner,rx-delay-ps = <1500>; ++ allwinner,tx-delay-ps = <700>; ++ status = "okay"; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ ++ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */ ++ reset-assert-us = <15000>; ++ reset-deassert-us = <40000>; ++ }; ++}; ++ + &mmc0 { + vmmc-supply = <®_cldo1>; + cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ + +From b641bc59468e93ab57fd016ad36b037f3890b994 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 26 Mar 2019 15:06:37 +0100 +Subject: [PATCH 15/34] drm: sun4i: Add support for enabling DDC I2C bus power + to dw_hdmi glue + +Orange Pi 3 board requires enabling DDC I2C bus via some GPIO connected +transistors, before the bus can be used. + +Model this as a power supply for DDC bus on the HDMI connector connected +to the output port (port 1) of the HDMI controller. + +Signed-off-by: Ondrej Jirman +--- + drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c | 60 ++++++++++++++++++++++++++- + drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 2 + + 2 files changed, 60 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +index 39d8509d96a0d..1b6ffba41177f 100644 +--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c ++++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c +@@ -98,6 +98,30 @@ static u32 sun8i_dw_hdmi_find_possible_crtcs(struct drm_device *drm, + return crtcs; + } + ++static int sun8i_dw_hdmi_find_connector_pdev(struct device *dev, ++ struct platform_device **pdev_out) ++{ ++ struct platform_device* pdev; ++ struct device_node *remote; ++ ++ remote = of_graph_get_remote_node(dev->of_node, 1, -1); ++ if (!remote) ++ return -ENODEV; ++ ++ if (!of_device_is_compatible(remote, "hdmi-connector")) { ++ of_node_put(remote); ++ return -ENODEV; ++ } ++ ++ pdev = of_find_device_by_node(remote); ++ of_node_put(remote); ++ if (!pdev) ++ return -ENODEV; ++ ++ *pdev_out = pdev; ++ return 0; ++} ++ + static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, + void *data) + { +@@ -151,16 +175,34 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, + return PTR_ERR(hdmi->regulator); + } + ++ ret = sun8i_dw_hdmi_find_connector_pdev(dev, &hdmi->connector_pdev); ++ if (!ret) { ++ hdmi->ddc_regulator = regulator_get(&hdmi->connector_pdev->dev, "ddc"); ++ if (IS_ERR(hdmi->ddc_regulator)) { ++ platform_device_put(hdmi->connector_pdev); ++ dev_err(dev, "Couldn't get ddc regulator\n"); ++ return PTR_ERR(hdmi->ddc_regulator); ++ } ++ } ++ + ret = regulator_enable(hdmi->regulator); + if (ret) { + dev_err(dev, "Failed to enable regulator\n"); +- return ret; ++ goto err_unref_ddc_regulator; ++ } ++ ++ if (hdmi->ddc_regulator) { ++ ret = regulator_enable(hdmi->ddc_regulator); ++ if (ret) { ++ dev_err(dev, "Failed to enable ddc regulator\n"); ++ goto err_disable_regulator; ++ } + } + + ret = reset_control_deassert(hdmi->rst_ctrl); + if (ret) { + dev_err(dev, "Could not deassert ctrl reset control\n"); +- goto err_disable_regulator; ++ goto err_disable_ddc_regulator; + } + + ret = clk_prepare_enable(hdmi->clk_tmds); +@@ -213,8 +255,15 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master, + clk_disable_unprepare(hdmi->clk_tmds); + err_assert_ctrl_reset: + reset_control_assert(hdmi->rst_ctrl); ++err_disable_ddc_regulator: ++ if (hdmi->ddc_regulator) ++ regulator_disable(hdmi->ddc_regulator); + err_disable_regulator: + regulator_disable(hdmi->regulator); ++err_unref_ddc_regulator: ++ if (hdmi->ddc_regulator) ++ regulator_put(hdmi->ddc_regulator); ++ platform_device_put(hdmi->connector_pdev); + + return ret; + } +@@ -229,6 +278,13 @@ static void sun8i_dw_hdmi_unbind(struct device *dev, struct device *master, + clk_disable_unprepare(hdmi->clk_tmds); + reset_control_assert(hdmi->rst_ctrl); + regulator_disable(hdmi->regulator); ++ ++ if (hdmi->ddc_regulator) { ++ regulator_disable(hdmi->ddc_regulator); ++ regulator_put(hdmi->ddc_regulator); ++ } ++ ++ platform_device_put(hdmi->connector_pdev); + } + + static const struct component_ops sun8i_dw_hdmi_ops = { +diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +index 720c5aa8adc14..60f5200aee73b 100644 +--- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h ++++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +@@ -188,8 +188,10 @@ struct sun8i_dw_hdmi { + struct sun8i_hdmi_phy *phy; + struct dw_hdmi_plat_data plat_data; + struct regulator *regulator; ++ struct regulator *ddc_regulator; + const struct sun8i_dw_hdmi_quirks *quirks; + struct reset_control *rst_ctrl; ++ struct platform_device *connector_pdev; + }; + + static inline struct sun8i_dw_hdmi * + +From c1d7c7796ea7e76829c71b993c7531f23c0f5913 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 9 Apr 2019 01:41:58 +0200 +Subject: [PATCH 16/34] arm64: dts: allwinner: orange-pi-3: Enable HDMI output + +Orange Pi 3 has a DDC_CEC_EN signal connected to PH2, that enables the DDC +I2C bus voltage shifter. Before EDID can be read, we need to pull PH2 high. + +Signed-off-by: Ondrej Jirman +--- + .../dts/allwinner/sun50i-h6-orangepi-3.dts | 35 +++++++++++++++++++ + 1 file changed, 35 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +index 6d6b1f66796d9..58a6635c909e3 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -22,6 +22,18 @@ + stdout-path = "serial0:115200n8"; + }; + ++ connector { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ddc-supply = <®_ddc>; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ + leds { + compatible = "gpio-leds"; + +@@ -37,6 +49,15 @@ + }; + }; + ++ reg_ddc: ddc-io { ++ compatible = "regulator-fixed"; ++ regulator-name = "ddc-io"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ enable-active-high; ++ gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ }; ++ + reg_vcc5v: vcc5v { + /* board wide 5V supply directly from the DC jack */ + compatible = "regulator-fixed"; +@@ -72,6 +93,10 @@ + cpu-supply = <®_dcdca>; + }; + ++&de { ++ status = "okay"; ++}; ++ + &ehci0 { + status = "okay"; + }; +@@ -91,6 +116,16 @@ + status = "okay"; + }; + ++&hdmi { ++ status = "okay"; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ + &mdio { + ext_rgmii_phy: ethernet-phy@1 { + compatible = "ethernet-phy-ieee802.3-c22"; + +From 756b0ba6d79844dbc04c6c4ea0fc25b52209721a Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Fri, 5 Apr 2019 22:21:00 +0200 +Subject: [PATCH 17/34] brcmfmac: Loading the correct firmware for brcm43456 + +SDIO based brcm43456 is currently misdetected as brcm43455 and the wrong +firmware name is used. Correct the detection and load the correct firmware +file. Chiprev for brcm43456 is "9". + +Signed-off-by: Ondrej Jirman +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +index 4d104ab80fd8e..50e56fd056baa 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +@@ -622,6 +622,7 @@ BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio"); + /* Note the names are not postfixed with a1 for backward compatibility */ + BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio"); + BRCMF_FW_DEF(43455, "brcmfmac43455-sdio"); ++BRCMF_FW_DEF(43456, "brcmfmac43456-sdio"); + BRCMF_FW_DEF(4354, "brcmfmac4354-sdio"); + BRCMF_FW_DEF(4356, "brcmfmac4356-sdio"); + BRCMF_FW_DEF(4373, "brcmfmac4373-sdio"); +@@ -642,7 +643,8 @@ static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = { + BRCMF_FW_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339), + BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0), + BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1), +- BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455), ++ BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0x00000200, 43456), ++ BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFDC0, 43455), + BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354), + BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356), + BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373), + +From 5bf634f86c57f59f5c4a4fade9ccfe582334464f Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Mon, 18 Feb 2019 13:53:18 +0100 +Subject: [PATCH 18/34] arm64: dts: allwinner: h6: Add MMC1 pins + +MMC1 is used on some H6 boards we want to support. Typical use is 4-bit +SDIO interface with a WiFi chip. Add pin definitions for this use case. + +As this is the only possible configration for mmc1, make it the default +one, too. + +Signed-off-by: Ondrej Jirman +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 91623a8cd2a08..c5c0608e67403 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -219,6 +219,15 @@ + bias-pull-up; + }; + ++ /omit-if-no-ref/ ++ mmc1_pins: mmc1-pins { ++ pins = "PG0", "PG1", "PG2", "PG3", ++ "PG4", "PG5"; ++ function = "mmc1"; ++ drive-strength = <30>; ++ bias-pull-up; ++ }; ++ + mmc2_pins: mmc2-pins { + pins = "PC1", "PC4", "PC5", "PC6", + "PC7", "PC8", "PC9", "PC10", +@@ -270,6 +279,8 @@ + resets = <&ccu RST_BUS_MMC1>; + reset-names = "ahb"; + interrupts = ; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc1_pins>; + status = "disabled"; + #address-cells = <1>; + #size-cells = <0>; + +From 200cf18794214700f023440021cb7fd40dcc0f01 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 9 Apr 2019 00:16:35 +0200 +Subject: [PATCH 19/34] arm64: dts: allwinner: orange-pi-3: Enable WiFi + +Orange Pi 3 has AP6256 WiFi/BT module. WiFi part of the module is called +bcm43356 and can be used with the brcmfmac driver. The module is powered by +the two always on regulators (not AXP805). + +WiFi uses a PG port with 1.8V voltage level signals. SoC needs to be +configured so that it sets up an 1.8V input bias on this port. This is done +by the pio driver by reading the vcc-pg-supply voltage. + +You'll need a fw_bcm43456c5_ag.bin firmware file and nvram.txt +configuration that can be found in the Xulongs's repository for H6: + +https://github.com/orangepi-xunlong/OrangePiH6_external/tree/master/ap6256 + +Mainline brcmfmac driver expects the firmware and nvram at the following +paths relative to the firmware directory: + + brcm/brcmfmac43456-sdio.bin + brcm/brcmfmac43456-sdio.txt + +Signed-off-by: Ondrej Jirman +--- + .../dts/allwinner/sun50i-h6-orangepi-3.dts | 48 +++++++++++++++++++ + 1 file changed, 48 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +index 58a6635c909e3..f795362f5b77e 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -67,6 +67,26 @@ + regulator-always-on; + }; + ++ reg_vcc33_wifi: vcc33-wifi { ++ /* Always on 3.3V regulator for WiFi and BT */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc33-wifi"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-always-on; ++ vin-supply = <®_vcc5v>; ++ }; ++ ++ reg_vcc_wifi_io: vcc-wifi-io { ++ /* Always on 1.8V/300mA regulator for WiFi and BT IO */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-wifi-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-always-on; ++ vin-supply = <®_vcc33_wifi>; ++ }; ++ + /* + * The board uses 2.5V RGMII signalling. Power sequence to enable + * the phy is to enable GMAC-2V5 and GMAC-3V3 (aldo2) power rails +@@ -87,6 +107,14 @@ + */ + vin-supply = <®_aldo2>; /* GMAC-3V3 */ + }; ++ ++ wifi_pwrseq: wifi_pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ clocks = <&rtc 1>; ++ clock-names = "ext_clock"; ++ reset-gpios = <&r_pio 1 3 GPIO_ACTIVE_LOW>; /* PM3 */ ++ post-power-on-delay-ms = <200>; ++ }; + }; + + &cpu0 { +@@ -144,6 +172,25 @@ + status = "okay"; + }; + ++&mmc1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc1_pins>; ++ vmmc-supply = <®_vcc33_wifi>; ++ vqmmc-supply = <®_vcc_wifi_io>; ++ mmc-pwrseq = <&wifi_pwrseq>; ++ bus-width = <4>; ++ non-removable; ++ status = "okay"; ++ ++ brcm: sdio-wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ interrupt-parent = <&r_pio>; ++ interrupts = <1 0 IRQ_TYPE_LEVEL_LOW>; /* PM0 */ ++ interrupt-names = "host-wake"; ++ }; ++}; ++ + &ohci0 { + status = "okay"; + }; +@@ -155,6 +202,7 @@ + &pio { + vcc-pc-supply = <®_bldo2>; + vcc-pd-supply = <®_cldo1>; ++ vcc-pg-supply = <®_vcc_wifi_io>; + }; + + &r_i2c { + +From 5fd2d3bd956cc875d07433454f18dcbc14e120d5 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 26 Mar 2019 15:14:14 +0100 +Subject: [PATCH 24/34] bluetooth: bcm: Add support for loading firmware for + BCM4345C5 + +WIP + +Signed-off-by: Ondrej Jirman +--- + drivers/bluetooth/btbcm.c | 3 +++ + drivers/bluetooth/hci_bcm.c | 1 + + 2 files changed, 4 insertions(+) + +diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c +index d5d6e6e5da3bf..a58bf860bcbfc 100644 +--- a/drivers/bluetooth/btbcm.c ++++ b/drivers/bluetooth/btbcm.c +@@ -37,6 +37,7 @@ + #define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}}) + #define BDADDR_BCM4330B1 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb1, 0x30, 0x43}}) + #define BDADDR_BCM43341B (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0x1b, 0x34, 0x43}}) ++#define BDADDR_BCM4345C5 (&(bdaddr_t) {{0xac, 0x1f, 0x00, 0xc5, 0x45, 0x43}}) + + int btbcm_check_bdaddr(struct hci_dev *hdev) + { +@@ -82,6 +83,7 @@ int btbcm_check_bdaddr(struct hci_dev *hdev) + !bacmp(&bda->bdaddr, BDADDR_BCM4324B3) || + !bacmp(&bda->bdaddr, BDADDR_BCM4330B1) || ++ !bacmp(&bda->bdaddr, BDADDR_BCM4345C5) || + !bacmp(&bda->bdaddr, BDADDR_BCM43430A0) || + !bacmp(&bda->bdaddr, BDADDR_BCM43341B)) { + bt_dev_info(hdev, "BCM: Using default device address (%pMR)", + &bda->bdaddr); +@@ -339,6 +341,7 @@ static const struct bcm_subver_table bcm_uart_subver_table[] = { + { 0x2122, "BCM4343A0" }, /* 001.001.034 */ + { 0x2209, "BCM43430A1" }, /* 001.002.009 */ + { 0x6119, "BCM4345C0" }, /* 003.001.025 */ ++ { 0x6606, "BCM4345C5" }, /* 003.006.006 */ + { 0x230f, "BCM4356A2" }, /* 001.003.015 */ + { 0x220e, "BCM20702A1" }, /* 001.002.014 */ + { 0x4217, "BCM4329B1" }, /* 002.002.023 */ +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index ddbe518c3e5b8..d5d5ddc3cf1b8 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -1419,6 +1419,7 @@ static void bcm_serdev_remove(struct serdev_device *serdev) + #ifdef CONFIG_OF + static const struct of_device_id bcm_bluetooth_of_match[] = { + { .compatible = "brcm,bcm20702a1" }, ++ { .compatible = "brcm,bcm4345c5" }, + { .compatible = "brcm,bcm4330-bt" }, + { .compatible = "brcm,bcm43438-bt" }, + { }, + +From d5626d424fbdc9dde5f8a2e525e88de33fc898cc Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Fri, 12 Apr 2019 13:24:26 +0200 +Subject: [PATCH 25/34] bluetooth: hci_bcm: Give more time to come out of reset + +Some devices need more time to come out of reset (eg. BCM4345). +Increase the post-reset delay. I don't have datasheet, so rather +be safe than to get intermittent failures during probe. + +Signed-off-by: Ondrej Jirman +--- + drivers/bluetooth/hci_bcm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index d5d5ddc3cf1b8..9eacaf8f72ec3 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -263,7 +263,7 @@ static int bcm_gpio_set_power(struct bcm_device *dev, bool powered) + } + + /* wait for device to power on and come out of reset */ +- usleep_range(10000, 20000); ++ usleep_range(50000, 60000); + + dev->res_enabled = powered; + + +From 5141fbafc9bf5f1a7cbb6923bc719f595ce54dae Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Mon, 25 Dec 2017 12:10:06 +0800 +Subject: [PATCH 26/34] arm64: dts: allwinner: h6: add USB3 device nodes + +Allwinner H6 SoC features USB3 functionality, with a DWC3 controller and +a custom PHY. + +Add device tree nodes for them. + +Signed-off-by: Icenowy Zheng +Reviewed-by: Chen-Yu Tsai +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 32 ++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index c5c0608e67403..38784589558ca 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -420,6 +420,38 @@ + status = "disabled"; + }; + ++ dwc3: dwc3@5200000 { ++ compatible = "snps,dwc3"; ++ reg = <0x05200000 0x10000>; ++ interrupts = ; ++ clocks = <&ccu CLK_BUS_XHCI>, ++ <&ccu CLK_BUS_XHCI>, ++ <&rtc 0>; ++ clock-names = "ref", "bus_early", "suspend"; ++ resets = <&ccu RST_BUS_XHCI>; ++ /* ++ * The datasheet of the chip doesn't declare the ++ * peripheral function, and there's no boards known ++ * to have a USB Type-B port routed to the port. ++ * In addition, no one has tested the peripheral ++ * function yet. ++ * So set the dr_mode to "host" in the DTSI file. ++ */ ++ dr_mode = "host"; ++ phys = <&usb3phy>; ++ phy-names = "usb3-phy"; ++ status = "disabled"; ++ }; ++ ++ usb3phy: phy@5210000 { ++ compatible = "allwinner,sun50i-h6-usb3-phy"; ++ reg = <0x5210000 0x10000>; ++ clocks = <&ccu CLK_USB_PHY1>; ++ resets = <&ccu RST_USB_PHY1>; ++ #phy-cells = <0>; ++ status = "disabled"; ++ }; ++ + ehci3: usb@5311000 { + compatible = "allwinner,sun50i-h6-ehci", "generic-ehci"; + reg = <0x05311000 0x100>; + +FFrom 19ed1005f6d1d2955c9e3e88c3fe037b46284ca8 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Tue, 26 Mar 2019 15:13:34 +0100 +Subject: [PATCH 32/34] arm64: dts: allwinner: h6: Add pin configs for uart1 + +Orange Pi 3 uses UART1 for bluetooth. Add pinconfigs so that +we can use them. + +Signed-off-by: Ondrej Jirman +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 5c5b1240c7790..dc785da9ce0a2 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -322,6 +322,16 @@ + pins = "PH0", "PH1"; + function = "uart0"; + }; ++ ++ uart1_pins: uart1-pins { ++ pins = "PG6", "PG7"; ++ function = "uart1"; ++ }; ++ ++ uart1_rts_cts_pins: uart1-rts-cts-pins { ++ pins = "PG8", "PG9"; ++ function = "uart1"; ++ }; + }; + + gic: interrupt-controller@3021000 { + +From 785248f1b1d89bbd8a25435f873bfa91c27fa123 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Wed, 27 Mar 2019 13:48:59 +0100 +Subject: [PATCH 33/34] arm64: dts: allwinner: orange-pi-3: Enable UART1 / + Bluetooth + +The board contains AP6256 WiFi/BT module that has its bluetooth +part connected to SoC's UART1 port. Enable this port, and add +node for the bluetooth device. + +Bluetooth part is named bcm4345c5. + +You'll need a BCM4345C5.hcd firmware file that can be found in +the Xulongs's repository for H6: + +https://github.com/orangepi-xunlong/OrangePiH6_external/tree/master/ap6256 + +Mainline brcmbt driver expects the firmware at the following path +relative to the firmware directory: + + brcm/BCM4345C5.hcd + +Signed-off-by: Ondrej Jirman +--- + .../dts/allwinner/sun50i-h6-orangepi-3.dts | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +index f795362f5b77e..d9e8610b5f83f 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -15,6 +15,7 @@ + + aliases { + serial0 = &uart0; ++ serial1 = &uart1; + ethernet0 = &emac; + }; + +@@ -324,6 +325,24 @@ + status = "okay"; + }; + ++/* There's the BT part of the AP6256 connected to that UART */ ++&uart1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; ++ uart-has-rtscts; ++ status = "okay"; ++ ++ bluetooth { ++ compatible = "brcm,bcm4345c5"; ++ clocks = <&rtc 1>; ++ clock-names = "lpo"; ++ device-wakeup-gpios = <&r_pio 1 2 GPIO_ACTIVE_HIGH>; /* PM2 */ ++ host-wakeup-gpios = <&r_pio 1 1 GPIO_ACTIVE_HIGH>; /* PM1 */ ++ shutdown-gpios = <&r_pio 1 4 GPIO_ACTIVE_HIGH>; /* PM4 */ ++ max-speed = <1500000>; ++ }; ++}; ++ + &usb2otg { + /* + * This board doesn't have a controllable VBUS even though it + +From c74e4ba1e28d5808cda02b34eee59dc1a5f15a6d Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Wed, 27 Mar 2019 13:43:25 +0100 +Subject: [PATCH 34/34] arm64: dts: allwinner: orange-pi-3: Enable USB 3.0 host + support + +Enable Allwinner's USB 3.0 phy and the host controller. Orange Pi 3 +board has GL3510 USB 3.0 4-port hub connected to the SoC's USB 3.0 +port. All four ports are exposed via USB3-A connectors. The hub is +powered directly from DCIN/VCC-5V. + +Signed-off-by: Ondrej Jirman +--- + arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +index d9e8610b5f83f..afee79fb88f18 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-3.dts +@@ -126,6 +126,10 @@ + status = "okay"; + }; + ++&dwc3 { ++ status = "okay"; ++}; ++ + &ehci0 { + status = "okay"; + }; +@@ -359,3 +363,8 @@ + usb3_vbus-supply = <®_vcc5v>; + status = "okay"; + }; ++ ++&usb3phy { ++ phy-supply = <®_vcc5v>; ++ status = "okay"; ++}; diff --git a/projects/Allwinner/devices/H6/patches/linux/08-arm64-dts-allwinner-OrangePiOnePlus-updates.patch b/projects/Allwinner/devices/H6/patches/linux/08-arm64-dts-allwinner-OrangePiOnePlus-updates.patch new file mode 100644 index 0000000000..a83150bb81 --- /dev/null +++ b/projects/Allwinner/devices/H6/patches/linux/08-arm64-dts-allwinner-OrangePiOnePlus-updates.patch @@ -0,0 +1,91 @@ +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts +index 12e17567ab56..fd9dcefcd223 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-orangepi-one-plus.dts +@@ -9,4 +9,86 @@ + / { + model = "OrangePi One Plus"; + compatible = "xunlong,orangepi-one-plus", "allwinner,sun50i-h6"; ++ ++ aliases { ++ ethernet0 = &emac; ++ }; ++ ++ connector { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ddc-supply = <®_ddc>; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ reg_ddc: ddc-io { ++ compatible = "regulator-fixed"; ++ regulator-name = "ddc-io"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ enable-active-high; ++ gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ }; ++ ++ reg_gmac_3v3: gmac-3v3 { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-gmac-3v3"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ vin-supply = <®_aldo2>; ++ }; ++ ++ reg_usb_vbus: vbus { ++ compatible = "regulator-fixed"; ++ regulator-name = "usb-vbus"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ startup-delay-us = <100000>; ++ gpio = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; ++ enable-active-high; ++ }; ++}; ++ ++&de { ++ status = "okay"; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_3v3>; ++ allwinner,rx-delay-ps = <200>; ++ allwinner,tx-delay-ps = <200>; ++ status = "okay"; ++}; ++ ++&gpu { ++ mali-supply = <®_dcdcc>; ++}; ++ ++&hdmi { ++ status = "okay"; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ }; + }; diff --git a/projects/Allwinner/devices/H6/patches/linux/08-clock-fixes.patch b/projects/Allwinner/devices/H6/patches/linux/08-clock-fixes.patch deleted file mode 100644 index 68c1d5a8c8..0000000000 --- a/projects/Allwinner/devices/H6/patches/linux/08-clock-fixes.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 9413130f5b213551519c97482462a6daea9a5343 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Tue, 2 Apr 2019 19:32:01 +0200 -Subject: [PATCH 1/2] clk: sunxi-ng: h6: Change CEC clock parent - -Signed-off-by: Jernej Skrabec ---- - drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 11 +++++++++++ - 1 file changed, 11 insertions(+) - -diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -index daf78966555e..33980067b06e 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -+++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -@@ -656,6 +656,8 @@ static const char * const hdmi_cec_parents[] = { "osc32k", "pll-periph0-2x" }; - static const struct ccu_mux_fixed_prediv hdmi_cec_predivs[] = { - { .index = 1, .div = 36621 }, - }; -+ -+#define SUN50I_H6_HDMI_CEC_CLK_REG 0xb10 - static struct ccu_mux hdmi_cec_clk = { - .enable = BIT(31), - -@@ -1200,6 +1202,15 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev) - val &= ~(GENMASK(21, 16) | BIT(0)); - writel(val | (7 << 16), reg + SUN50I_H6_PLL_AUDIO_REG); - -+ /* -+ * First clock parent (osc32K) is unusable for CEC. But since there -+ * is no good way to force parent switch (both run with same frequency), -+ * just set second clock parent here. -+ */ -+ val = readl(reg + SUN50I_H6_HDMI_CEC_CLK_REG); -+ val |= BIT(24); -+ writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG); -+ - return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc); - } - --- -2.21.0 - - -From eab64a1ccf6b7cda339fdfdbfa9e1973e4cc0c85 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Tue, 2 Apr 2019 21:15:45 +0200 -Subject: [PATCH 2/2] clk: sunxi-ng: h6: Allow video & vpu clocks to change - parent rate - -Video related clocks need to set rate as close as possible to the -requested one, so they should be able to change parent clock rate. - -VPU clock sometimes has to be set to higher than default parent clock -rate. This is requ - -Add CLK_SET_RATE_PARENT flag to tcon-lcd0, tcon-tv0 and ve. - -Signed-off-by: Jernej Skrabec ---- - drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -index 33980067b06e..3c32d7798f27 100644 ---- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -+++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c -@@ -311,7 +311,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, - 0, 3, /* M */ - 24, 1, /* mux */ - BIT(31), /* gate */ -- 0); -+ CLK_SET_RATE_PARENT); - - static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "psi-ahb1-ahb2", - 0x69c, BIT(0), 0); -@@ -691,7 +691,7 @@ static SUNXI_CCU_MUX_WITH_GATE(tcon_lcd0_clk, "tcon-lcd0", - tcon_lcd0_parents, 0xb60, - 24, 3, /* mux */ - BIT(31), /* gate */ -- 0); -+ CLK_SET_RATE_PARENT); - - static SUNXI_CCU_GATE(bus_tcon_lcd0_clk, "bus-tcon-lcd0", "ahb3", - 0xb7c, BIT(0), 0); -@@ -706,7 +706,7 @@ static SUNXI_CCU_MP_WITH_MUX_GATE(tcon_tv0_clk, "tcon-tv0", - 8, 2, /* P */ - 24, 3, /* mux */ - BIT(31), /* gate */ -- 0); -+ CLK_SET_RATE_PARENT); - - static SUNXI_CCU_GATE(bus_tcon_tv0_clk, "bus-tcon-tv0", "ahb3", - 0xb9c, BIT(0), 0); --- -2.21.0 - diff --git a/projects/Allwinner/devices/H6/patches/u-boot/002-orange-pi-3-support.patch b/projects/Allwinner/devices/H6/patches/u-boot/002-orange-pi-3-support.patch new file mode 100644 index 0000000000..7894506e42 --- /dev/null +++ b/projects/Allwinner/devices/H6/patches/u-boot/002-orange-pi-3-support.patch @@ -0,0 +1,362 @@ +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 0e2ffdb87f..ad60ae0179 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -467,6 +467,7 @@ dtb-$(CONFIG_MACH_SUN50I_H5) += \ + sun50i-h5-orangepi-prime.dtb \ + sun50i-h5-orangepi-zero-plus2.dtb + dtb-$(CONFIG_MACH_SUN50I_H6) += \ ++ sun50i-h6-orangepi-3.dtb \ + sun50i-h6-orangepi-lite2.dtb \ + sun50i-h6-orangepi-one-plus.dtb \ + sun50i-h6-pine-h64.dtb +diff --git a/arch/arm/dts/sun50i-h6-orangepi-3.dts b/arch/arm/dts/sun50i-h6-orangepi-3.dts +new file mode 100644 +index 0000000000..8070adc39b +--- /dev/null ++++ b/arch/arm/dts/sun50i-h6-orangepi-3.dts +@@ -0,0 +1,326 @@ ++// SPDX-License-Identifier: (GPL-2.0+ or MIT) ++/* ++ * Copyright (C) 2019 Ondřej Jirman ++ */ ++ ++/dts-v1/; ++ ++#include "sun50i-h6.dtsi" ++ ++#include ++ ++/ { ++ model = "OrangePi 3"; ++ compatible = "xunlong,orangepi-3", "allwinner,sun50i-h6"; ++ ++ aliases { ++ serial0 = &uart0; ++ serial1 = &uart1; ++ ethernet0 = &emac; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ connector { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ddc-supply = <®_ddc>; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ ++ power { ++ label = "orangepi:red:power"; ++ gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ ++ default-state = "on"; ++ }; ++ ++ status { ++ label = "orangepi:green:status"; ++ gpios = <&r_pio 0 7 GPIO_ACTIVE_HIGH>; /* PL7 */ ++ }; ++ }; ++ ++ reg_ddc: ddc-io { ++ compatible = "regulator-fixed"; ++ regulator-name = "ddc-io"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ enable-active-high; ++ gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ }; ++ ++ reg_vcc5v: vcc5v { ++ /* board wide 5V supply directly from the DC jack */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-5v"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ regulator-always-on; ++ }; ++ ++ reg_vcc33_wifi: vcc33-wifi { ++ /* Always on 3.3V regulator for WiFi and BT */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc33-wifi"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-always-on; ++ vin-supply = <®_vcc5v>; ++ }; ++ ++ reg_vcc_wifi_io: vcc-wifi-io { ++ /* Always on 1.8V/300mA regulator for WiFi and BT IO */ ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc-wifi-io"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-always-on; ++ vin-supply = <®_vcc33_wifi>; ++ }; ++ ++ /* ++ * The board uses 2.5V RGMII signalling. Power sequence to enable ++ * the phy is to enable GMAC-2V5 and GMAC-3V3 (aldo2) power rails ++ * at the same time and to wait 100ms. ++ */ ++ reg_gmac_2v5: gmac-2v5 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-2v5"; ++ regulator-min-microvolt = <2500000>; ++ regulator-max-microvolt = <2500000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ ++ /* The real parent of gmac-2v5 is reg_vcc5v, but we need to ++ * enable two regulators to power the phy. This is one way ++ * to achieve that. ++ */ ++ vin-supply = <®_aldo2>; /* GMAC-3V3 */ ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <®_dcdca>; ++}; ++ ++&de { ++ status = "okay"; ++}; ++ ++&ehci0 { ++ status = "okay"; ++}; ++ ++&ehci3 { ++ status = "okay"; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_2v5>; ++ allwinner,rx-delay-ps = <1500>; ++ allwinner,tx-delay-ps = <700>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ status = "okay"; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ ++ reset-gpios = <&pio 3 14 GPIO_ACTIVE_LOW>; /* PD14 */ ++ reset-assert-us = <15000>; ++ reset-deassert-us = <40000>; ++ }; ++}; ++ ++&mmc0 { ++ vmmc-supply = <®_cldo1>; ++ cd-gpios = <&pio 5 6 GPIO_ACTIVE_LOW>; /* PF6 */ ++ bus-width = <4>; ++ status = "okay"; ++}; ++ ++&mmc2 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mmc2_pins>; ++ vmmc-supply = <®_cldo1>; ++ non-removable; ++ cap-mmc-hw-reset; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&ohci0 { ++ status = "okay"; ++}; ++ ++&ohci3 { ++ status = "okay"; ++}; ++ ++&pio { ++ vcc-pc-supply = <®_bldo2>; ++ vcc-pd-supply = <®_cldo1>; ++ vcc-pg-supply = <®_vcc_wifi_io>; ++}; ++ ++&r_i2c { ++ status = "okay"; ++ ++ axp805: pmic@36 { ++ compatible = "x-powers,axp805", "x-powers,axp806"; ++ reg = <0x36>; ++ interrupt-parent = <&r_intc>; ++ interrupts = <0 IRQ_TYPE_LEVEL_LOW>; ++ interrupt-controller; ++ #interrupt-cells = <1>; ++ x-powers,self-working-mode; ++ vina-supply = <®_vcc5v>; ++ vinb-supply = <®_vcc5v>; ++ vinc-supply = <®_vcc5v>; ++ vind-supply = <®_vcc5v>; ++ vine-supply = <®_vcc5v>; ++ aldoin-supply = <®_vcc5v>; ++ bldoin-supply = <®_vcc5v>; ++ cldoin-supply = <®_vcc5v>; ++ ++ regulators { ++ reg_aldo1: aldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc-pl-led-ir"; ++ }; ++ ++ reg_aldo2: aldo2 { ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-audio-tv-ephy-mac"; ++ }; ++ ++ /* ALDO3 is shorted to CLDO1 */ ++ reg_aldo3: aldo3 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-1"; ++ }; ++ ++ reg_bldo1: bldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc18-dram-bias-pll"; ++ }; ++ ++ reg_bldo2: bldo2 { ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-name = "vcc-efuse-pcie-hdmi-pc"; ++ }; ++ ++ bldo3 { ++ /* unused */ ++ }; ++ ++ bldo4 { ++ /* unused */ ++ }; ++ ++ reg_cldo1: cldo1 { ++ regulator-always-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-name = "vcc33-io-pd-emmc-sd-usb-uart-2"; ++ }; ++ ++ cldo2 { ++ /* unused */ ++ }; ++ ++ cldo3 { ++ /* unused */ ++ }; ++ ++ reg_dcdca: dcdca { ++ regulator-always-on; ++ regulator-min-microvolt = <800000>; ++ regulator-max-microvolt = <1160000>; ++ regulator-name = "vdd-cpu"; ++ }; ++ ++ reg_dcdcc: dcdcc { ++ regulator-min-microvolt = <810000>; ++ regulator-max-microvolt = <1080000>; ++ regulator-name = "vdd-gpu"; ++ }; ++ ++ reg_dcdcd: dcdcd { ++ regulator-always-on; ++ regulator-min-microvolt = <960000>; ++ regulator-max-microvolt = <960000>; ++ regulator-name = "vdd-sys"; ++ }; ++ ++ reg_dcdce: dcdce { ++ regulator-always-on; ++ regulator-min-microvolt = <1200000>; ++ regulator-max-microvolt = <1200000>; ++ regulator-name = "vcc-dram"; ++ }; ++ ++ sw { ++ /* unused */ ++ }; ++ }; ++ }; ++}; ++ ++&uart0 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_ph_pins>; ++ status = "okay"; ++}; ++ ++&usb2otg { ++ /* ++ * This board doesn't have a controllable VBUS even though it ++ * does have an ID pin. Using it as anything but a USB host is ++ * unsafe. ++ */ ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb2phy { ++ usb0_id_det-gpios = <&pio 2 15 GPIO_ACTIVE_HIGH>; /* PC15 */ ++ usb0_vbus-supply = <®_vcc5v>; ++ usb3_vbus-supply = <®_vcc5v>; ++ status = "okay"; ++}; +diff --git a/configs/orangepi_3_defconfig b/configs/orangepi_3_defconfig +new file mode 100644 +index 0000000000..9a9cd28142 +--- /dev/null ++++ b/configs/orangepi_3_defconfig +@@ -0,0 +1,12 @@ ++CONFIG_ARM=y ++CONFIG_ARCH_SUNXI=y ++CONFIG_SPL=y ++CONFIG_MACH_SUN50I_H6=y ++CONFIG_MMC0_CD_PIN="PF6" ++# CONFIG_PSCI_RESET is not set ++CONFIG_NR_DRAM_BANKS=1 ++# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set ++# CONFIG_CMD_FLASH is not set ++# CONFIG_SPL_DOS_PARTITION is not set ++# CONFIG_SPL_EFI_PARTITION is not set ++CONFIG_DEFAULT_DEVICE_TREE="sun50i-h6-orangepi-3" diff --git a/projects/Allwinner/devices/H6/patches/u-boot/003-Update-Orange-Pi-One-Plus-for-LibreELEC.patch b/projects/Allwinner/devices/H6/patches/u-boot/003-Update-Orange-Pi-One-Plus-for-LibreELEC.patch new file mode 100644 index 0000000000..396da014fb --- /dev/null +++ b/projects/Allwinner/devices/H6/patches/u-boot/003-Update-Orange-Pi-One-Plus-for-LibreELEC.patch @@ -0,0 +1,82 @@ +diff --git a/arch/arm/dts/sun50i-h6-orangepi-one-plus.dts b/arch/arm/dts/sun50i-h6-orangepi-one-plus.dts +index 12e17567ab..4c3447417f 100644 +--- a/arch/arm/dts/sun50i-h6-orangepi-one-plus.dts ++++ b/arch/arm/dts/sun50i-h6-orangepi-one-plus.dts +@@ -9,4 +9,77 @@ + / { + model = "OrangePi One Plus"; + compatible = "xunlong,orangepi-one-plus", "allwinner,sun50i-h6"; ++ ++ aliases { ++ ethernet0 = &emac; ++ }; ++ ++ connector { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ddc-supply = <®_ddc>; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ reg_ddc: ddc-io { ++ compatible = "regulator-fixed"; ++ regulator-name = "ddc-io"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ enable-active-high; ++ gpio = <&pio 7 2 GPIO_ACTIVE_HIGH>; /* PH2 */ ++ }; ++ ++ reg_gmac_2v5: gmac-2v5 { ++ compatible = "regulator-fixed"; ++ regulator-name = "gmac-2v5"; ++ regulator-min-microvolt = <2500000>; ++ regulator-max-microvolt = <2500000>; ++ startup-delay-us = <100000>; ++ enable-active-high; ++ gpio = <&pio 3 6 GPIO_ACTIVE_HIGH>; /* PD6 */ ++ ++ /* The real parent of gmac-2v5 is reg_vcc5v, but we need to ++ * enable two regulators to power the phy. This is one way ++ * to achieve that. ++ */ ++ vin-supply = <®_aldo2>; /* GMAC-3V3 */ ++ }; ++}; ++ ++&de { ++ status = "okay"; ++}; ++ ++&emac { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&ext_rgmii_pins>; ++ phy-mode = "rgmii"; ++ phy-handle = <&ext_rgmii_phy>; ++ phy-supply = <®_gmac_2v5>; ++ allwinner,rx-delay-ps = <1500>; ++ allwinner,tx-delay-ps = <700>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ status = "okay"; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&mdio { ++ ext_rgmii_phy: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <1>; ++ }; + }; diff --git a/projects/Allwinner/linux/linux.aarch64.conf b/projects/Allwinner/linux/linux.aarch64.conf index 43978f63cf..e35244c61e 100644 --- a/projects/Allwinner/linux/linux.aarch64.conf +++ b/projects/Allwinner/linux/linux.aarch64.conf @@ -1,15 +1,16 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 5.0.2 Kernel Configuration +# Linux/arm64 5.1.6 Kernel Configuration # # -# Compiler: aarch64-linux-gnu-gcc.real (Linaro GCC 7.3-2018.05) 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701] +# Compiler: aarch64-linux-gnu-gcc.real (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) 8.3.0 # CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=70301 +CONFIG_GCC_VERSION=80300 CONFIG_CLANG_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -180,6 +181,7 @@ CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y +CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y @@ -247,6 +249,7 @@ CONFIG_ARCH_SUNXI=y # CONFIG_ARCH_BCM2835 is not set # CONFIG_ARCH_BCM_IPROC is not set # CONFIG_ARCH_BERLIN is not set +# CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_BRCMSTB is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_K3 is not set @@ -293,6 +296,7 @@ CONFIG_ARM64_ERRATUM_1024718=y CONFIG_ARM64_ERRATUM_1188873=y CONFIG_ARM64_ERRATUM_1165522=y CONFIG_ARM64_ERRATUM_1286807=y +CONFIG_ARM64_ERRATUM_1463225=y CONFIG_CAVIUM_ERRATUM_22375=y CONFIG_CAVIUM_ERRATUM_23144=y CONFIG_CAVIUM_ERRATUM_23154=y @@ -305,6 +309,7 @@ CONFIG_QCOM_QDF2400_ERRATUM_0065=y CONFIG_SOCIONEXT_SYNQUACER_PREITS=y CONFIG_HISILICON_ERRATUM_161600802=y CONFIG_QCOM_FALKOR_ERRATUM_E1041=y +CONFIG_FUJITSU_ERRATUM_010001=y CONFIG_ARM64_4K_PAGES=y # CONFIG_ARM64_16K_PAGES is not set # CONFIG_ARM64_64K_PAGES is not set @@ -389,6 +394,7 @@ CONFIG_EFI=y CONFIG_DMI=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y +CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y # # Power management options @@ -426,6 +432,7 @@ CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y # CONFIG_CPU_IDLE_GOV_LADDER is not set CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set CONFIG_DT_IDLE_STATES=y # @@ -472,7 +479,6 @@ CONFIG_ARM_SCPI_POWER_DOMAIN=y # CONFIG_ARM_SDE_INTERFACE is not set CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set -# CONFIG_INTEL_STRATIX10_SERVICE is not set CONFIG_HAVE_ARM_SMCCC=y # CONFIG_GOOGLE_FIRMWARE is not set @@ -488,6 +494,7 @@ CONFIG_EFI_ARMSTUB_DTB_LOADER=y CONFIG_EFI_CAPSULE_LOADER=y # CONFIG_EFI_TEST is not set # CONFIG_RESET_ATTACK_MITIGATION is not set +CONFIG_EFI_EARLYCON=y # # Tegra firmware driver @@ -571,6 +578,7 @@ CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_64BIT_TIME=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y CONFIG_VMAP_STACK=y @@ -580,15 +588,15 @@ CONFIG_ARCH_HAS_STRICT_MODULE_RWX=y CONFIG_STRICT_MODULE_RWX=y CONFIG_REFCOUNT_FULL=y CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y +CONFIG_ARCH_USE_MEMREMAP_PROT=y # # GCOV-based kernel profiling # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -CONFIG_PLUGIN_HOSTCC="g++" +CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y -# CONFIG_GCC_PLUGINS is not set CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y @@ -708,6 +716,7 @@ CONFIG_SKB_EXTENSIONS=y CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y +CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y @@ -819,6 +828,7 @@ CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m @@ -960,8 +970,6 @@ CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_LOG_ARP is not set CONFIG_NF_LOG_IPV4=m CONFIG_NF_REJECT_IPV4=m -CONFIG_NF_NAT_IPV4=m -CONFIG_NF_NAT_MASQUERADE_IPV4=y CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set @@ -990,8 +998,6 @@ CONFIG_IP_NF_MANGLE=m # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m CONFIG_NF_LOG_IPV6=m -CONFIG_NF_NAT_IPV6=m -CONFIG_NF_NAT_MASQUERADE_IPV6=y CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set @@ -1214,7 +1220,6 @@ CONFIG_NET_9P=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y # CONFIG_NET_DEVLINK is not set -CONFIG_MAY_USE_DEVLINK=y CONFIG_FAILOVER=y CONFIG_HAVE_EBPF_JIT=y @@ -1258,17 +1263,6 @@ CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set -CONFIG_DMA_CMA=y - -# -# Default contiguous memory area size: -# -CONFIG_CMA_SIZE_MBYTES=256 -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_ALIGNMENT=8 CONFIG_GENERIC_ARCH_TOPOLOGY=y # @@ -1364,9 +1358,9 @@ CONFIG_MTD_NAND_DENALI_DT=y # # CONFIG_MTD_LPDDR is not set CONFIG_MTD_SPI_NOR=y -# CONFIG_MTD_MT81xx_NOR is not set CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y # CONFIG_SPI_CADENCE_QUADSPI is not set +# CONFIG_SPI_MTK_QUADSPI is not set # CONFIG_MTD_UBI is not set CONFIG_DTC=y CONFIG_OF=y @@ -1459,6 +1453,7 @@ CONFIG_EEPROM_AT25=m # # VOP Bus Driver # +# CONFIG_VOP_BUS is not set # # Intel MIC Host Driver @@ -1526,7 +1521,6 @@ CONFIG_SCSI_UFSHCD_PLATFORM=m # CONFIG_SCSI_UFS_BSG is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_HAVE_PATA_PLATFORM=y CONFIG_ATA=y CONFIG_ATA_VERBOSE_ERROR=y @@ -1603,6 +1597,7 @@ CONFIG_DUMMY=m # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m CONFIG_MACVTAP=m +CONFIG_IPVLAN_L3S=y CONFIG_IPVLAN=m # CONFIG_IPVTAP is not set CONFIG_VXLAN=m @@ -1698,8 +1693,8 @@ CONFIG_STMMAC_ETH=y CONFIG_STMMAC_PLATFORM=y # CONFIG_DWMAC_DWC_QOS_ETH is not set CONFIG_DWMAC_GENERIC=y -CONFIG_DWMAC_SUNXI=y -CONFIG_DWMAC_SUN8I=y +CONFIG_DWMAC_SUNXI=m +CONFIG_DWMAC_SUN8I=m CONFIG_NET_VENDOR_SYNOPSYS=y # CONFIG_DWC_XLGMAC is not set CONFIG_NET_VENDOR_VIA=y @@ -1715,6 +1710,7 @@ CONFIG_MDIO_BITBANG=y CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_GPIO is not set CONFIG_MDIO_BUS_MUX_MMIOREG=y +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_GPIO is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MSCC_MIIM is not set @@ -1939,7 +1935,6 @@ CONFIG_KEYBOARD_GPIO=y # CONFIG_KEYBOARD_OMAP4 is not set # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set # CONFIG_KEYBOARD_XTKBD is not set -CONFIG_KEYBOARD_CROS_EC=y # CONFIG_KEYBOARD_CAP11XX is not set # CONFIG_KEYBOARD_BCM is not set # CONFIG_INPUT_MOUSE is not set @@ -2016,6 +2011,7 @@ CONFIG_INPUT_MISC=y # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set @@ -2077,6 +2073,7 @@ CONFIG_LEGACY_PTY_COUNT=16 # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set +CONFIG_LDISC_AUTOLOAD=y CONFIG_DEVMEM=y # @@ -2129,7 +2126,6 @@ CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_IPMI_HANDLER is not set CONFIG_HW_RANDOM=m # CONFIG_HW_RANDOM_TIMERIOMEM is not set -# CONFIG_R3964 is not set # CONFIG_RAW_DRIVER is not set CONFIG_TCG_TPM=y # CONFIG_TCG_TIS is not set @@ -2201,7 +2197,6 @@ CONFIG_I2C_RK3X=y # # Other I2C/SMBus bus drivers # -CONFIG_I2C_CROS_EC_TUNNEL=y # CONFIG_I2C_STUB is not set CONFIG_I2C_SLAVE=y # CONFIG_I2C_SLAVE_EEPROM is not set @@ -2222,12 +2217,14 @@ CONFIG_SPI_MEM=y # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_NXP_FLEXSPI is not set # CONFIG_SPI_GPIO is not set # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_OC_TINY is not set CONFIG_SPI_PL022=y CONFIG_SPI_ROCKCHIP=y # CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set # CONFIG_SPI_SUN4I is not set # CONFIG_SPI_SUN6I is not set # CONFIG_SPI_MXIC is not set @@ -2314,12 +2311,14 @@ CONFIG_GPIO_PL061=y # CONFIG_GPIO_SYSCON is not set CONFIG_GPIO_XGENE=y # CONFIG_GPIO_XILINX is not set +# CONFIG_GPIO_AMD_FCH is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_GW_PLD is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set CONFIG_GPIO_PCA953X=y @@ -2330,7 +2329,6 @@ CONFIG_GPIO_PCA953X_IRQ=y # # MFD GPIO expanders # -# CONFIG_GPIO_BD9571MWV is not set CONFIG_GPIO_MAX77620=y # @@ -2395,7 +2393,6 @@ CONFIG_AXP20X_POWER=y # CONFIG_CHARGER_SMB347 is not set # CONFIG_BATTERY_GAUGE_LTC2941 is not set # CONFIG_CHARGER_RT9455 is not set -# CONFIG_CHARGER_CROS_USBPD is not set CONFIG_HWMON=y # CONFIG_HWMON_DEBUG_CHIP is not set @@ -2570,7 +2567,7 @@ CONFIG_ARM_SP805_WATCHDOG=y # CONFIG_ARM_SBSA_WATCHDOG is not set # CONFIG_CADENCE_WATCHDOG is not set # CONFIG_DW_WATCHDOG is not set -# CONFIG_SUNXI_WATCHDOG is not set +CONFIG_SUNXI_WATCHDOG=y # CONFIG_MAX63XX_WATCHDOG is not set # CONFIG_MAX77620_WATCHDOG is not set # CONFIG_MEN_A21_WDT is not set @@ -2602,13 +2599,12 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_ATMEL_FLEXCOM is not set # CONFIG_MFD_ATMEL_HLCDC is not set # CONFIG_MFD_BCM590XX is not set -CONFIG_MFD_BD9571MWV=y +# CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AC100 is not set CONFIG_MFD_AXP20X=y CONFIG_MFD_AXP20X_I2C=y CONFIG_MFD_AXP20X_RSB=y -CONFIG_MFD_CROS_EC=y -CONFIG_MFD_CROS_EC_CHARDEV=m +# CONFIG_MFD_CROS_EC is not set # CONFIG_MFD_MADERA is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set @@ -2680,6 +2676,8 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set # CONFIG_MFD_TC3589X is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_LOCHNAGAR is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set @@ -2688,6 +2686,7 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_STPMIC1 is not set CONFIG_MFD_VEXPRESS_SYSREG=y # CONFIG_RAVE_SP_CORE is not set CONFIG_REGULATOR=y @@ -2700,7 +2699,6 @@ CONFIG_REGULATOR_FIXED_VOLTAGE=y # CONFIG_REGULATOR_AD5398 is not set # CONFIG_REGULATOR_ANATOP is not set CONFIG_REGULATOR_AXP20X=y -CONFIG_REGULATOR_BD9571MWV=y # CONFIG_REGULATOR_DA9210 is not set # CONFIG_REGULATOR_DA9211 is not set CONFIG_REGULATOR_FAN53555=y @@ -3067,10 +3065,6 @@ CONFIG_VIDEO_MT9V011=m # Miscellaneous helper chips # -# -# Sensors used on soc_camera driver -# - # # Media SPI Adapters # @@ -3260,8 +3254,13 @@ CONFIG_DRM_I2C_CH7006=m CONFIG_DRM_I2C_SIL164=m # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set + +# +# ARM devices +# # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_KOMEDA is not set # # ACP (Audio CoProcessor) Configuration @@ -3298,6 +3297,7 @@ CONFIG_DRM_PANEL_SIMPLE=m # CONFIG_DRM_PANEL_SAMSUNG_S6E8AA0 is not set # CONFIG_DRM_PANEL_SEIKO_43WVF1G is not set # CONFIG_DRM_PANEL_SITRONIX_ST7789V is not set +# CONFIG_DRM_PANEL_TPO_TPG110 is not set CONFIG_DRM_BRIDGE=y CONFIG_DRM_PANEL_BRIDGE=y @@ -3324,6 +3324,7 @@ CONFIG_DRM_DW_HDMI=y # CONFIG_DRM_DW_HDMI_AHB_AUDIO is not set CONFIG_DRM_DW_HDMI_I2S_AUDIO=y CONFIG_DRM_DW_HDMI_CEC=y +# CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_HISI_KIRIN is not set # CONFIG_DRM_MXSFB is not set @@ -3468,9 +3469,11 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_FSL_SSI is not set # CONFIG_SND_SOC_FSL_SPDIF is not set # CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set # # STMicroelectronics STM32 SOC audio support @@ -3487,6 +3490,8 @@ CONFIG_SND_SUN4I_I2S=y CONFIG_SND_SUN4I_SPDIF=y CONFIG_SND_SUN8I_ADDA_PR_REGMAP=y # CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set # CONFIG_ZX_TDM is not set CONFIG_SND_SOC_I2C_AND_SPI=y @@ -3514,6 +3519,7 @@ CONFIG_SND_SOC_AK4613=m # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set # CONFIG_SND_SOC_CS42L42 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set @@ -3525,6 +3531,7 @@ CONFIG_SND_SOC_AK4613=m # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_DMIC is not set @@ -3556,6 +3563,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_RK3328 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_SGTL5000 is not set @@ -3602,6 +3610,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_WM8804_I2C is not set # CONFIG_SND_SOC_WM8804_SPI is not set # CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set @@ -3610,6 +3619,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ZX_AUD96P22 is not set # CONFIG_SND_SOC_MAX9759 is not set # CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8822 is not set @@ -3617,9 +3627,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y -# CONFIG_SND_SIMPLE_SCU_CARD is not set CONFIG_SND_AUDIO_GRAPH_CARD=y -# CONFIG_SND_AUDIO_GRAPH_SCU_CARD is not set # # HID support @@ -3659,12 +3667,12 @@ CONFIG_HID_EZKEY=y # CONFIG_HID_GEMBIRD is not set # CONFIG_HID_GFRM is not set # CONFIG_HID_HOLTEK is not set -# CONFIG_HID_GOOGLE_HAMMER is not set # CONFIG_HID_GT683R is not set # CONFIG_HID_KEYTOUCH is not set # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set CONFIG_HID_ITE=y @@ -3681,6 +3689,7 @@ CONFIG_HID_LOGITECH=y # CONFIG_LOGIG940_FF is not set # CONFIG_LOGIWHEELS_FF is not set # CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set CONFIG_HID_REDRAGON=y CONFIG_HID_MICROSOFT=y @@ -3749,6 +3758,7 @@ CONFIG_USB_OTG=y # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_OTG_FSM is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 # CONFIG_USB_MON is not set # CONFIG_USB_WUSB_CBAF is not set @@ -3762,6 +3772,7 @@ CONFIG_USB_XHCI_PLATFORM=y CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y +# CONFIG_USB_EHCI_FSL is not set CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set @@ -4067,6 +4078,7 @@ CONFIG_RTC_INTF_DEV=y # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set @@ -4093,8 +4105,10 @@ CONFIG_RTC_DRV_RK808=m # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set # CONFIG_RTC_DRV_RV8803 is not set CONFIG_RTC_DRV_S5M=y +# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers @@ -4143,7 +4157,6 @@ CONFIG_RTC_DRV_EFI=y # CONFIG_RTC_DRV_RP5C01 is not set # CONFIG_RTC_DRV_V3020 is not set # CONFIG_RTC_DRV_ZYNQMP is not set -CONFIG_RTC_DRV_CROS_EC=y # # on-CPU RTC drivers @@ -4151,6 +4164,7 @@ CONFIG_RTC_DRV_CROS_EC=y # CONFIG_RTC_DRV_PL030 is not set CONFIG_RTC_DRV_PL031=y CONFIG_RTC_DRV_SUN6I=y +# CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_R7301 is not set @@ -4158,7 +4172,6 @@ CONFIG_RTC_DRV_SUN6I=y # # HID Sensor RTC drivers # -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set @@ -4175,6 +4188,7 @@ CONFIG_BCM_SBA_RAID=m CONFIG_DMA_SUN6I=y # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set # CONFIG_INTEL_IDMA64 is not set CONFIG_MV_XOR_V2=y CONFIG_PL330_DMA=y @@ -4227,7 +4241,6 @@ CONFIG_RTL8723BS=m # # Analog to digital converters # -# CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set @@ -4242,7 +4255,6 @@ CONFIG_RTL8723BS=m # Capacitance to digital converters # # CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # @@ -4274,6 +4286,10 @@ CONFIG_STAGING_MEDIA=y CONFIG_VIDEO_SUNXI=y CONFIG_VIDEO_SUNXI_CEDRUS=y +# +# soc_camera sensor drivers +# + # # Android # @@ -4289,7 +4305,6 @@ CONFIG_VIDEO_SUNXI_CEDRUS=y # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_PI433 is not set -# CONFIG_MTK_MMC is not set # # Gasket devices @@ -4297,11 +4312,7 @@ CONFIG_VIDEO_SUNXI_CEDRUS=y # CONFIG_XIL_AXIS_FIFO is not set # CONFIG_EROFS_FS is not set # CONFIG_GOLDFISH is not set -CONFIG_CHROME_PLATFORMS=y -CONFIG_CROS_EC_CTL=m -CONFIG_CROS_EC_I2C=y -CONFIG_CROS_EC_SPI=y -CONFIG_CROS_EC_PROTO=y +# CONFIG_CHROME_PLATFORMS is not set CONFIG_CLKDEV_LOOKUP=y CONFIG_HAVE_CLK_PREPARE=y CONFIG_COMMON_CLK=y @@ -4327,6 +4338,7 @@ CONFIG_COMMON_CLK_SCPI=y # CONFIG_COMMON_CLK_XGENE is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_SUNXI_CCU=y CONFIG_SUN50I_A64_CCU=y CONFIG_SUN50I_H6_CCU=y @@ -4429,10 +4441,10 @@ CONFIG_EXTCON=y # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set CONFIG_EXTCON_USB_GPIO=y -CONFIG_EXTCON_USBC_CROS_EC=y CONFIG_MEMORY=y # CONFIG_ARM_PL172_MPMC is not set CONFIG_IIO=y @@ -4440,7 +4452,6 @@ CONFIG_IIO_BUFFER=y # CONFIG_IIO_BUFFER_CB is not set # CONFIG_IIO_BUFFER_HW_CONSUMER is not set CONFIG_IIO_KFIFO_BUF=m -CONFIG_IIO_TRIGGERED_BUFFER=m # CONFIG_IIO_CONFIGFS is not set CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 @@ -4489,7 +4500,10 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set # CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set @@ -4529,6 +4543,7 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8688 is not set +# CONFIG_TI_ADS124S08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_VF610_ADC is not set @@ -4549,9 +4564,10 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set +# CONFIG_PMS7003 is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SPS30 is not set # CONFIG_VZ89X is not set -CONFIG_IIO_CROS_EC_SENSORS_CORE=m -CONFIG_IIO_CROS_EC_SENSORS=m # # Hid Sensor IIO Common @@ -4600,6 +4616,7 @@ CONFIG_IIO_CROS_EC_SENSORS=m # CONFIG_TI_DAC082S085 is not set # CONFIG_TI_DAC5571 is not set # CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set # CONFIG_VF610_DAC is not set # @@ -4682,7 +4699,6 @@ CONFIG_IIO_CROS_EC_SENSORS=m # CONFIG_CM3323 is not set # CONFIG_CM3605 is not set # CONFIG_CM36651 is not set -CONFIG_IIO_CROS_EC_LIGHT_PROX=m # CONFIG_GP2AP020A00F is not set # CONFIG_SENSORS_ISL29018 is not set # CONFIG_SENSORS_ISL29028 is not set @@ -4692,6 +4708,7 @@ CONFIG_IIO_CROS_EC_LIGHT_PROX=m # CONFIG_LTR501 is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set @@ -4765,7 +4782,6 @@ CONFIG_IIO_CROS_EC_LIGHT_PROX=m # # CONFIG_ABP060MG is not set # CONFIG_BMP280 is not set -CONFIG_IIO_CROS_EC_BARO=m # CONFIG_HP03 is not set # CONFIG_MPL115_I2C is not set # CONFIG_MPL115_SPI is not set @@ -4811,7 +4827,6 @@ CONFIG_IIO_CROS_EC_BARO=m # CONFIG_TSYS02D is not set CONFIG_PWM=y CONFIG_PWM_SYSFS=y -CONFIG_PWM_CROS_EC=m # CONFIG_PWM_FSL_FTM is not set # CONFIG_PWM_PCA9685 is not set # CONFIG_PWM_SUN4I is not set @@ -4839,9 +4854,12 @@ CONFIG_RESET_SUNXI=y CONFIG_GENERIC_PHY=y CONFIG_PHY_XGENE=y CONFIG_PHY_SUN4I_USB=y +# CONFIG_PHY_SUN6I_MIPI_DPHY is not set # CONFIG_PHY_SUN9I_USB is not set +CONFIG_PHY_SUN50I_USB3=y # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_CADENCE_DP is not set +# CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_FSL_IMX8MQ_USB is not set # CONFIG_PHY_PXA_28NM_HSIC is not set @@ -4886,11 +4904,13 @@ CONFIG_NVMEM=y CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set @@ -4898,7 +4918,6 @@ CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_ENCRYPTION is not set # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set @@ -4928,7 +4947,6 @@ CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y # CONFIG_F2FS_FS_SECURITY is not set # CONFIG_F2FS_CHECK_FS is not set -# CONFIG_F2FS_FS_ENCRYPTION is not set # CONFIG_F2FS_FAULT_INJECTION is not set # CONFIG_FS_DAX is not set CONFIG_FS_POSIX_ACL=y @@ -5163,13 +5181,14 @@ CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_SECURITY_APPARMOR is not set # CONFIG_SECURITY_LOADPIN is not set # CONFIG_SECURITY_YAMA is not set +# CONFIG_SECURITY_SAFESETID is not set CONFIG_INTEGRITY=y # CONFIG_INTEGRITY_SIGNATURE is not set CONFIG_INTEGRITY_AUDIT=y # CONFIG_IMA is not set # CONFIG_EVM is not set CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" +CONFIG_LSM="yama,loadpin,safesetid,integrity" CONFIG_XOR_BLOCKS=m CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y @@ -5400,7 +5419,8 @@ CONFIG_HAS_DMA=y CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y -CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE=y CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU=y CONFIG_ARCH_HAS_DMA_COHERENT_TO_PFN=y @@ -5408,6 +5428,18 @@ CONFIG_ARCH_HAS_DMA_MMAP_PGPROT=y CONFIG_SWIOTLB=y CONFIG_DMA_REMAP=y CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=384 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y CONFIG_CPU_RMAP=y CONFIG_DQL=y @@ -5438,6 +5470,7 @@ CONFIG_SBITMAP=y # printk and dmesg options # CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -5457,7 +5490,6 @@ CONFIG_FRAME_WARN=2048 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_PAGE_OWNER is not set CONFIG_DEBUG_FS=y # CONFIG_HEADERS_CHECK is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set @@ -5475,6 +5507,7 @@ CONFIG_DEBUG_KERNEL=y # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_OBJECTS is not set @@ -5563,7 +5596,6 @@ CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set -# CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set @@ -5586,6 +5618,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set +# CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_FIND_BIT_BENCHMARK is not set @@ -5595,6 +5628,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_STACKINIT is not set CONFIG_MEMTEST=y # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_SAMPLES is not set @@ -5602,6 +5636,7 @@ CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set diff --git a/projects/Allwinner/linux/linux.arm.conf b/projects/Allwinner/linux/linux.arm.conf index a2a6548133..0a00501b8b 100644 --- a/projects/Allwinner/linux/linux.arm.conf +++ b/projects/Allwinner/linux/linux.arm.conf @@ -1,15 +1,16 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 5.0.2 Kernel Configuration +# Linux/arm 5.1.9 Kernel Configuration # # -# Compiler: armv7ve-libreelec-linux-gnueabi-gcc-8.2.0 (GCC) 8.2.0 +# Compiler: armv7ve-libreelec-linux-gnueabi-gcc-8.3.0 (GCC) 8.3.0 # CONFIG_CC_IS_GCC=y -CONFIG_GCC_VERSION=80200 +CONFIG_GCC_VERSION=80300 CONFIG_CLANG_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y @@ -178,6 +179,7 @@ CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y +CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y @@ -278,6 +280,7 @@ CONFIG_ARCH_MULTI_V6_V7=y # CONFIG_ARCH_KEYSTONE is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MILBEAUT is not set # CONFIG_ARCH_MMP is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NPCM is not set @@ -488,6 +491,7 @@ CONFIG_CPUFREQ_DT_PLATDEV=y CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set # # ARM CPU Idle Drivers @@ -536,7 +540,6 @@ CONFIG_ARM_PSCI_FW=y # CONFIG_ARM_PSCI_CHECKER is not set # CONFIG_FIRMWARE_MEMMAP is not set # CONFIG_FW_CFG_SYSFS is not set -# CONFIG_INTEL_STRATIX10_SERVICE is not set CONFIG_HAVE_ARM_SMCCC=y # CONFIG_GOOGLE_FIRMWARE is not set @@ -569,6 +572,7 @@ CONFIG_GENERIC_IDLE_POLL_SETUP=y CONFIG_ARCH_HAS_FORTIFY_SOURCE=y CONFIG_ARCH_HAS_SET_MEMORY=y CONFIG_HAVE_ARCH_THREAD_STRUCT_WHITELIST=y +CONFIG_ARCH_32BIT_OFF_T=y CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y CONFIG_HAVE_RSEQ=y CONFIG_HAVE_CLK=y @@ -594,6 +598,8 @@ CONFIG_ARCH_MMAP_RND_BITS=8 CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_OLD_SIGACTION=y +CONFIG_64BIT_TIME=y +CONFIG_COMPAT_32BIT_TIME=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y @@ -608,9 +614,8 @@ CONFIG_REFCOUNT_FULL=y # # CONFIG_GCOV_KERNEL is not set CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y -CONFIG_PLUGIN_HOSTCC="g++" +CONFIG_PLUGIN_HOSTCC="" CONFIG_HAVE_GCC_PLUGINS=y -# CONFIG_GCC_PLUGINS is not set CONFIG_RT_MUTEXES=y CONFIG_BASE_SMALL=0 CONFIG_MODULES=y @@ -731,6 +736,7 @@ CONFIG_SKB_EXTENSIONS=y CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y +CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set CONFIG_XFRM=y @@ -838,6 +844,7 @@ CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_TFTP=m CONFIG_NF_NAT_REDIRECT=y +CONFIG_NF_NAT_MASQUERADE=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m @@ -973,8 +980,6 @@ CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set # CONFIG_NF_REJECT_IPV4 is not set -CONFIG_NF_NAT_IPV4=m -CONFIG_NF_NAT_MASQUERADE_IPV4=y CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set @@ -998,7 +1003,6 @@ CONFIG_IP_NF_TARGET_REDIRECT=m # CONFIG_NF_DUP_IPV6 is not set # CONFIG_NF_REJECT_IPV6 is not set # CONFIG_NF_LOG_IPV6 is not set -# CONFIG_NF_NAT_IPV6 is not set # CONFIG_IP6_NF_IPTABLES is not set CONFIG_NF_DEFRAG_IPV6=m # CONFIG_BRIDGE_NF_EBTABLES is not set @@ -1171,16 +1175,23 @@ CONFIG_BT_LEDS=y CONFIG_BT_INTEL=m CONFIG_BT_BCM=m CONFIG_BT_RTL=m +CONFIG_BT_QCA=m CONFIG_BT_HCIBTUSB=m # CONFIG_BT_HCIBTUSB_AUTOSUSPEND is not set CONFIG_BT_HCIBTUSB_BCM=y CONFIG_BT_HCIBTUSB_RTL=y CONFIG_BT_HCIBTSDIO=m CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_SERDEV=y CONFIG_BT_HCIUART_H4=y +# CONFIG_BT_HCIUART_NOKIA is not set CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_LL=y +CONFIG_BT_HCIUART_3WIRE=y CONFIG_BT_HCIUART_INTEL=y +CONFIG_BT_HCIUART_BCM=y +CONFIG_BT_HCIUART_QCA=y CONFIG_BT_HCIUART_AG6XX=y CONFIG_BT_HCIUART_MRVL=y CONFIG_BT_HCIBCM203X=m @@ -1190,6 +1201,7 @@ CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m CONFIG_BT_MRVL_SDIO=m CONFIG_BT_ATH3K=m +CONFIG_BT_MTKUART=m # CONFIG_AF_RXRPC is not set # CONFIG_AF_KCM is not set CONFIG_WIRELESS=y @@ -1230,7 +1242,6 @@ CONFIG_MAC80211_STA_HASH_MAX_SIZE=0 CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y # CONFIG_NET_DEVLINK is not set -CONFIG_MAY_USE_DEVLINK=y # CONFIG_FAILOVER is not set CONFIG_HAVE_EBPF_JIT=y @@ -1272,17 +1283,6 @@ CONFIG_REGMAP_MMIO=y CONFIG_REGMAP_IRQ=y CONFIG_DMA_SHARED_BUFFER=y # CONFIG_DMA_FENCE_TRACE is not set -CONFIG_DMA_CMA=y - -# -# Default contiguous memory area size: -# -CONFIG_CMA_SIZE_MBYTES=256 -CONFIG_CMA_SIZE_SEL_MBYTES=y -# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set -# CONFIG_CMA_SIZE_SEL_MIN is not set -# CONFIG_CMA_SIZE_SEL_MAX is not set -CONFIG_CMA_ALIGNMENT=8 CONFIG_GENERIC_ARCH_TOPOLOGY=y # @@ -1391,6 +1391,7 @@ CONFIG_EEPROM_93CX6=m # # VOP Bus Driver # +# CONFIG_VOP_BUS is not set # # Intel MIC Host Driver @@ -1451,7 +1452,6 @@ CONFIG_SCSI_LOWLEVEL=y # CONFIG_SCSI_UFSHCD is not set # CONFIG_SCSI_DEBUG is not set # CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_ATA=y CONFIG_ATA_VERBOSE_ERROR=y CONFIG_SATA_PMP=y @@ -1525,6 +1525,7 @@ CONFIG_DUMMY=m # CONFIG_NET_TEAM is not set CONFIG_MACVLAN=m # CONFIG_MACVTAP is not set +CONFIG_IPVLAN_L3S=y CONFIG_IPVLAN=m # CONFIG_IPVTAP is not set CONFIG_VXLAN=m @@ -1588,6 +1589,7 @@ CONFIG_NET_VENDOR_NI=y # CONFIG_ETHOC is not set CONFIG_NET_VENDOR_QUALCOMM=y # CONFIG_QCA7000_SPI is not set +# CONFIG_QCA7000_UART is not set # CONFIG_QCOM_EMAC is not set # CONFIG_RMNET is not set CONFIG_NET_VENDOR_RENESAS=y @@ -1615,6 +1617,7 @@ CONFIG_MDIO_BUS=y CONFIG_MDIO_BUS_MUX=y # CONFIG_MDIO_BUS_MUX_GPIO is not set # CONFIG_MDIO_BUS_MUX_MMIOREG is not set +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set # CONFIG_MDIO_HISI_FEMAC is not set # CONFIG_MDIO_MSCC_MIIM is not set CONFIG_MDIO_SUN4I=y @@ -1910,6 +1913,7 @@ CONFIG_INPUT_MISC=y # CONFIG_INPUT_ATMEL_CAPTOUCH is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_GP2A is not set # CONFIG_INPUT_GPIO_BEEPER is not set @@ -1968,6 +1972,7 @@ CONFIG_LEGACY_PTY_COUNT=256 # CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set +CONFIG_LDISC_AUTOLOAD=y CONFIG_DEVMEM=y CONFIG_DEVKMEM=y @@ -2010,12 +2015,12 @@ CONFIG_SERIAL_CORE_CONSOLE=y # CONFIG_SERIAL_FSL_LPUART is not set # CONFIG_SERIAL_CONEXANT_DIGICOLOR is not set # CONFIG_SERIAL_ST_ASC is not set -# CONFIG_SERIAL_DEV_BUS is not set +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y # CONFIG_TTY_PRINTK is not set # CONFIG_HVC_DCC is not set # CONFIG_IPMI_HANDLER is not set # CONFIG_HW_RANDOM is not set -# CONFIG_R3964 is not set # CONFIG_RAW_DRIVER is not set # CONFIG_TCG_TPM is not set # CONFIG_XILLYBUS is not set @@ -2094,11 +2099,13 @@ CONFIG_SPI_MASTER=y # CONFIG_SPI_BITBANG is not set # CONFIG_SPI_CADENCE is not set # CONFIG_SPI_DESIGNWARE is not set +# CONFIG_SPI_NXP_FLEXSPI is not set # CONFIG_SPI_GPIO is not set # CONFIG_SPI_FSL_SPI is not set # CONFIG_SPI_OC_TINY is not set # CONFIG_SPI_ROCKCHIP is not set # CONFIG_SPI_SC18IS602 is not set +# CONFIG_SPI_SIFIVE is not set CONFIG_SPI_SUN4I=y CONFIG_SPI_SUN6I=y # CONFIG_SPI_MXIC is not set @@ -2183,12 +2190,14 @@ CONFIG_GPIO_SYSFS=y # CONFIG_GPIO_SYSCON is not set # CONFIG_GPIO_XILINX is not set # CONFIG_GPIO_ZEVIO is not set +# CONFIG_GPIO_AMD_FCH is not set # # I2C GPIO expanders # # CONFIG_GPIO_ADP5588 is not set # CONFIG_GPIO_ADNP is not set +# CONFIG_GPIO_GW_PLD is not set # CONFIG_GPIO_MAX7300 is not set # CONFIG_GPIO_MAX732X is not set # CONFIG_GPIO_PCA953X is not set @@ -2541,6 +2550,8 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_T7L66XB is not set # CONFIG_MFD_TC6387XB is not set # CONFIG_MFD_TC6393XB is not set +# CONFIG_MFD_TQMX86 is not set +# CONFIG_MFD_LOCHNAGAR is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set @@ -2549,6 +2560,8 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WM8350_I2C is not set # CONFIG_MFD_WM8994 is not set # CONFIG_MFD_ROHM_BD718XX is not set +# CONFIG_MFD_STPMIC1 is not set +# CONFIG_RAVE_SP_CORE is not set CONFIG_REGULATOR=y # CONFIG_REGULATOR_DEBUG is not set CONFIG_REGULATOR_FIXED_VOLTAGE=y @@ -2902,10 +2915,6 @@ CONFIG_VIDEO_OV7640=m # Miscellaneous helper chips # -# -# Sensors used on soc_camera driver -# - # # Media SPI Adapters # @@ -3088,8 +3097,13 @@ CONFIG_DRM_KMS_CMA_HELPER=y # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set + +# +# ARM devices +# # CONFIG_DRM_HDLCD is not set # CONFIG_DRM_MALI_DISPLAY is not set +# CONFIG_DRM_KOMEDA is not set # # ACP (Audio CoProcessor) Configuration @@ -3158,6 +3172,7 @@ CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_I2S_AUDIO=y CONFIG_DRM_DW_HDMI_CEC=y # CONFIG_DRM_STI is not set +# CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_ARCPGU is not set # CONFIG_DRM_MXSFB is not set # CONFIG_DRM_TINYDRM is not set @@ -3273,9 +3288,11 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y # CONFIG_SND_SOC_FSL_SSI is not set # CONFIG_SND_SOC_FSL_SPDIF is not set # CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set +# CONFIG_SND_SOC_MTK_BTCVSD is not set # # STMicroelectronics STM32 SOC audio support @@ -3291,6 +3308,8 @@ CONFIG_SND_SUN4I_I2S=y CONFIG_SND_SUN4I_SPDIF=y CONFIG_SND_SUN8I_ADDA_PR_REGMAP=y # CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set # CONFIG_ZX_TDM is not set CONFIG_SND_SOC_I2C_AND_SPI=y @@ -3318,6 +3337,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set # CONFIG_SND_SOC_CS42L42 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set @@ -3329,6 +3349,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y # CONFIG_SND_SOC_CS4271_SPI is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set # CONFIG_SND_SOC_DMIC is not set @@ -3359,6 +3380,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_PCM3168A_SPI is not set # CONFIG_SND_SOC_PCM512x_I2C is not set # CONFIG_SND_SOC_PCM512x_SPI is not set +# CONFIG_SND_SOC_RK3328 is not set # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set # CONFIG_SND_SOC_SGTL5000 is not set @@ -3405,6 +3427,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_WM8804_I2C is not set # CONFIG_SND_SOC_WM8804_SPI is not set # CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set @@ -3413,6 +3436,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_ZX_AUD96P22 is not set # CONFIG_SND_SOC_MAX9759 is not set # CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8822 is not set @@ -3420,9 +3444,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_TPA6130A2 is not set CONFIG_SND_SIMPLE_CARD_UTILS=y CONFIG_SND_SIMPLE_CARD=y -CONFIG_SND_SIMPLE_SCU_CARD=y CONFIG_SND_AUDIO_GRAPH_CARD=y -CONFIG_SND_AUDIO_GRAPH_SCU_CARD=y # # HID support @@ -3467,6 +3489,7 @@ CONFIG_HID_EZKEY=y # CONFIG_HID_KYE is not set # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set # CONFIG_HID_GYRATION is not set # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -3483,6 +3506,7 @@ CONFIG_HID_LOGITECH=y # CONFIG_LOGIG940_FF is not set # CONFIG_LOGIWHEELS_FF is not set # CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y @@ -3550,6 +3574,7 @@ CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # CONFIG_USB_WUSB_CBAF is not set @@ -3561,6 +3586,7 @@ CONFIG_USB_MON=m CONFIG_USB_EHCI_HCD=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_EHCI_TT_NEWSCHED=y +# CONFIG_USB_EHCI_FSL is not set CONFIG_USB_EHCI_HCD_PLATFORM=y # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set @@ -3872,6 +3898,7 @@ CONFIG_RTC_INTF_DEV=y # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set @@ -3896,7 +3923,9 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set # CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers @@ -3949,6 +3978,7 @@ CONFIG_RTC_I2C_AND_SPI=y # on-CPU RTC drivers # CONFIG_RTC_DRV_SUN6I=y +# CONFIG_RTC_DRV_CADENCE is not set # CONFIG_RTC_DRV_FTRTC010 is not set # CONFIG_RTC_DRV_SNVS is not set # CONFIG_RTC_DRV_R7301 is not set @@ -3956,7 +3986,6 @@ CONFIG_RTC_DRV_SUN6I=y # # HID Sensor RTC drivers # -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set @@ -3970,6 +3999,7 @@ CONFIG_DMA_OF=y CONFIG_DMA_SUN6I=y # CONFIG_DW_AXI_DMAC is not set # CONFIG_FSL_EDMA is not set +# CONFIG_FSL_QDMA is not set # CONFIG_INTEL_IDMA64 is not set # CONFIG_NBPFAXI_DMA is not set # CONFIG_QCOM_HIDMA_MGMT is not set @@ -4018,7 +4048,6 @@ CONFIG_STAGING=y # # Analog to digital converters # -# CONFIG_AD7606 is not set # CONFIG_AD7780 is not set # CONFIG_AD7816 is not set # CONFIG_AD7192 is not set @@ -4033,7 +4062,6 @@ CONFIG_STAGING=y # Capacitance to digital converters # # CONFIG_AD7150 is not set -# CONFIG_AD7152 is not set # CONFIG_AD7746 is not set # @@ -4065,6 +4093,10 @@ CONFIG_STAGING_MEDIA=y CONFIG_VIDEO_SUNXI=y CONFIG_VIDEO_SUNXI_CEDRUS=y +# +# soc_camera sensor drivers +# + # # Android # @@ -4080,7 +4112,6 @@ CONFIG_VIDEO_SUNXI_CEDRUS=y # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_PI433 is not set -# CONFIG_MTK_MMC is not set # # Gasket devices @@ -4109,6 +4140,7 @@ CONFIG_COMMON_CLK=y # CONFIG_CLK_QORIQ is not set # CONFIG_COMMON_CLK_PWM is not set # CONFIG_COMMON_CLK_VC5 is not set +# CONFIG_COMMON_CLK_FIXED_MMIO is not set CONFIG_SUNXI_CCU=y CONFIG_SUN8I_A23_CCU=y CONFIG_SUN8I_A33_CCU=y @@ -4198,6 +4230,7 @@ CONFIG_EXTCON=y # CONFIG_EXTCON_ADC_JACK is not set # CONFIG_EXTCON_GPIO is not set # CONFIG_EXTCON_MAX3355 is not set +# CONFIG_EXTCON_PTN5150 is not set # CONFIG_EXTCON_RT8973A is not set # CONFIG_EXTCON_SM5502 is not set # CONFIG_EXTCON_USB_GPIO is not set @@ -4254,7 +4287,10 @@ CONFIG_IIO_SW_TRIGGER=y # CONFIG_AD7291 is not set # CONFIG_AD7298 is not set # CONFIG_AD7476 is not set +# CONFIG_AD7606_IFACE_PARALLEL is not set +# CONFIG_AD7606_IFACE_SPI is not set # CONFIG_AD7766 is not set +# CONFIG_AD7768_1 is not set # CONFIG_AD7791 is not set # CONFIG_AD7793 is not set # CONFIG_AD7887 is not set @@ -4292,6 +4328,7 @@ CONFIG_SUN4I_GPADC=y # CONFIG_TI_ADS1015 is not set # CONFIG_TI_ADS7950 is not set # CONFIG_TI_ADS8688 is not set +# CONFIG_TI_ADS124S08 is not set # CONFIG_TI_TLC4541 is not set # CONFIG_VF610_ADC is not set @@ -4312,6 +4349,9 @@ CONFIG_SUN4I_GPADC=y # CONFIG_BME680 is not set # CONFIG_CCS811 is not set # CONFIG_IAQCORE is not set +# CONFIG_PMS7003 is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SPS30 is not set # CONFIG_VZ89X is not set # @@ -4361,6 +4401,7 @@ CONFIG_SUN4I_GPADC=y # CONFIG_TI_DAC082S085 is not set # CONFIG_TI_DAC5571 is not set # CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set # CONFIG_VF610_DAC is not set # @@ -4452,6 +4493,7 @@ CONFIG_SUN4I_GPADC=y # CONFIG_LTR501 is not set # CONFIG_LV0104CS is not set # CONFIG_MAX44000 is not set +# CONFIG_MAX44009 is not set # CONFIG_OPT3001 is not set # CONFIG_PA12203001 is not set # CONFIG_SI1133 is not set @@ -4586,10 +4628,14 @@ CONFIG_RESET_SUNXI=y # PHY Subsystem # CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PHY_MIPI_DPHY=y CONFIG_PHY_SUN4I_USB=y +CONFIG_PHY_SUN6I_MIPI_DPHY=y CONFIG_PHY_SUN9I_USB=y +CONFIG_PHY_SUN50I_USB3=y # CONFIG_BCM_KONA_USB2_PHY is not set # CONFIG_PHY_CADENCE_DP is not set +# CONFIG_PHY_CADENCE_DPHY is not set # CONFIG_PHY_CADENCE_SIERRA is not set # CONFIG_PHY_FSL_IMX8MQ_USB is not set # CONFIG_PHY_PXA_28NM_HSIC is not set @@ -4627,11 +4673,13 @@ CONFIG_NVMEM_SUNXI_SID=y CONFIG_PM_OPP=y # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set @@ -4639,7 +4687,6 @@ CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_ENCRYPTION is not set # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set @@ -4670,7 +4717,6 @@ CONFIG_F2FS_FS_XATTR=y CONFIG_F2FS_FS_POSIX_ACL=y # CONFIG_F2FS_FS_SECURITY is not set # CONFIG_F2FS_CHECK_FS is not set -# CONFIG_F2FS_FS_ENCRYPTION is not set # CONFIG_F2FS_FAULT_INJECTION is not set CONFIG_FS_POSIX_ACL=y CONFIG_EXPORTFS=y @@ -4869,7 +4915,7 @@ CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" +CONFIG_LSM="yama,loadpin,safesetid,integrity" CONFIG_CRYPTO=y # @@ -5085,8 +5131,22 @@ CONFIG_HAS_IOMEM=y CONFIG_HAS_IOPORT_MAP=y CONFIG_HAS_DMA=y CONFIG_NEED_DMA_MAP_STATE=y -CONFIG_HAVE_GENERIC_DMA_COHERENT=y +CONFIG_DMA_DECLARE_COHERENT=y +CONFIG_ARCH_HAS_SETUP_DMA_OPS=y +CONFIG_ARCH_HAS_TEARDOWN_DMA_OPS=y CONFIG_DMA_REMAP=y +CONFIG_DMA_CMA=y + +# +# Default contiguous memory area size: +# +CONFIG_CMA_SIZE_MBYTES=256 +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_ALIGNMENT=8 +# CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y CONFIG_CPU_RMAP=y CONFIG_DQL=y @@ -5116,6 +5176,7 @@ CONFIG_SBITMAP=y # printk and dmesg options # CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -5131,7 +5192,6 @@ CONFIG_FRAME_WARN=1024 # CONFIG_STRIP_ASM_SYMS is not set # CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_PAGE_OWNER is not set CONFIG_DEBUG_FS=y # CONFIG_HEADERS_CHECK is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set @@ -5147,6 +5207,7 @@ CONFIG_DEBUG_KERNEL=y # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_RODATA_TEST is not set # CONFIG_DEBUG_OBJECTS is not set @@ -5231,7 +5292,6 @@ CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_TRACING_SUPPORT=y # CONFIG_FTRACE is not set -# CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set @@ -5254,6 +5314,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set +# CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_FIND_BIT_BENCHMARK is not set @@ -5263,12 +5324,14 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_STACKINIT is not set # CONFIG_MEMTEST is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_SAMPLES is not set CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set # CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y # CONFIG_STRICT_DEVMEM is not set # CONFIG_ARM_PTDUMP_DEBUGFS is not set diff --git a/projects/Allwinner/options b/projects/Allwinner/options index 3e0aa6c8d8..cd43653a28 100644 --- a/projects/Allwinner/options +++ b/projects/Allwinner/options @@ -8,15 +8,6 @@ # u-boot version to use (default) UBOOT_VERSION="default" - # Configuration for u-boot - UBOOT_CONFIG="" - - # Target Configfile for u-boot - UBOOT_CONFIGFILE="" - - # Kernel extra targets to build - KERNEL_UBOOT_EXTRA_TARGET="" - # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" diff --git a/projects/Allwinner/patches/linux/0001-hdmi-sound-improvements.patch b/projects/Allwinner/patches/linux/0001-hdmi-sound-improvements.patch index d62f69510e..105944ec2a 100644 --- a/projects/Allwinner/patches/linux/0001-hdmi-sound-improvements.patch +++ b/projects/Allwinner/patches/linux/0001-hdmi-sound-improvements.patch @@ -401,9 +401,9 @@ index ccb5aa8468e0..e78be449e763 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -156,6 +156,8 @@ void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense); - void dw_hdmi_set_sample_rate(struct dw_hdmi *hdmi, unsigned int rate); void dw_hdmi_audio_enable(struct dw_hdmi *hdmi); void dw_hdmi_audio_disable(struct dw_hdmi *hdmi); + void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi); +void dw_hdmi_set_update_eld(struct dw_hdmi *hdmi, + void (*update_eld)(struct device *dev, u8 *eld)); diff --git a/projects/Allwinner/patches/linux/0003-fixes-from-5.2.patch b/projects/Allwinner/patches/linux/0002-backport-from-5.2.patch similarity index 65% rename from projects/Allwinner/patches/linux/0003-fixes-from-5.2.patch rename to projects/Allwinner/patches/linux/0002-backport-from-5.2.patch index 738a3a4b50..cfeada910b 100644 --- a/projects/Allwinner/patches/linux/0003-fixes-from-5.2.patch +++ b/projects/Allwinner/patches/linux/0002-backport-from-5.2.patch @@ -674,3 +674,316 @@ index b98add3cdedd..d0429c0e6b6b 100644 -- 2.21.0 +From ed19ec00d4d62a74857ad9c2ea1dbf9671ac3580 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Mon, 28 Jan 2019 19:36:54 +0100 +Subject: [PATCH 1/6] dt-bindings: media: cedrus: Add H6 compatible + +This adds a compatible for H6. H6 VPU supports 10-bit HEVC decoding and +additional AFBC output format for HEVC. + +Signed-off-by: Jernej Skrabec +--- + Documentation/devicetree/bindings/media/cedrus.txt | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/Documentation/devicetree/bindings/media/cedrus.txt b/Documentation/devicetree/bindings/media/cedrus.txt +index bce0705df953..20c82fb0c343 100644 +--- a/Documentation/devicetree/bindings/media/cedrus.txt ++++ b/Documentation/devicetree/bindings/media/cedrus.txt +@@ -13,6 +13,7 @@ Required properties: + - "allwinner,sun8i-h3-video-engine" + - "allwinner,sun50i-a64-video-engine" + - "allwinner,sun50i-h5-video-engine" ++ - "allwinner,sun50i-h6-video-engine" + - reg : register base and length of VE; + - clocks : list of clock specifiers, corresponding to entries in + the clock-names property; +-- +2.20.1 + + +From 744c66f8c328ef40b6fb246f8b9f2daa9cce4d9d Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Mon, 28 Jan 2019 19:47:33 +0100 +Subject: [PATCH 3/6] media: cedrus: Add support for H6 + +H6 has improved VPU. It supports 10-bit HEVC decoding and AFBC output +format for HEVC. + +Signed-off-by: Jernej Skrabec +--- + drivers/staging/media/sunxi/cedrus/cedrus.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c +index ff11cbeba205..b98add3cdedd 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus.c +@@ -396,6 +396,11 @@ static const struct cedrus_variant sun50i_h5_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, + }; + ++static const struct cedrus_variant sun50i_h6_cedrus_variant = { ++ .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .quirks = CEDRUS_QUIRK_NO_DMA_OFFSET, ++}; ++ + static const struct of_device_id cedrus_dt_match[] = { + { + .compatible = "allwinner,sun4i-a10-video-engine", +@@ -425,6 +430,10 @@ static const struct of_device_id cedrus_dt_match[] = { + .compatible = "allwinner,sun50i-h5-video-engine", + .data = &sun50i_h5_cedrus_variant, + }, ++ { ++ .compatible = "allwinner,sun50i-h6-video-engine", ++ .data = &sun50i_h6_cedrus_variant, ++ }, + { /* sentinel */ } + }; + MODULE_DEVICE_TABLE(of, cedrus_dt_match); +-- +2.20.1 + + +From c1b3128ac98c05c0afde4e6e065d6b1f2ae1dfa7 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Mon, 28 Jan 2019 19:59:27 +0100 +Subject: [PATCH 6/6] arm64: dts: allwinner: h6: Add Video Engine node + +This adds the Video engine node for H6. It can use whole DRAM range so +there is no need for reserved memory node. + +Signed-off-by: Jernej Skrabec +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 247dc0a5ce89..de4b7a1f1012 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -146,6 +146,17 @@ + }; + }; + ++ video-codec@1c0e000 { ++ compatible = "allwinner,sun50i-h6-video-engine"; ++ reg = <0x01c0e000 0x2000>; ++ clocks = <&ccu CLK_BUS_VE>, <&ccu CLK_VE>, ++ <&ccu CLK_MBUS_VE>; ++ clock-names = "ahb", "mod", "ram"; ++ resets = <&ccu RST_BUS_VE>; ++ interrupts = ; ++ allwinner,sram = <&ve_sram 1>; ++ }; ++ + syscon: syscon@3000000 { + compatible = "allwinner,sun50i-h6-system-control", + "allwinner,sun50i-a64-system-control"; +-- +2.20.1 + +From 87effaae9e90474546d441b9123bca824e670a0b Mon Sep 17 00:00:00 2001 +From: Fish Lin +Date: Thu, 28 Mar 2019 23:20:46 -0400 +Subject: [PATCH] media: v4l: add I / P frame min max QP definitions + +Add following V4L2 QP parameters for H.264: +* V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP +* V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP +* V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP +* V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP + +These controls will limit QP range for intra and inter frame, +provide more manual control to improve video encode quality. + +Signed-off-by: Fish Lin +Signed-off-by: Hans Verkuil +Signed-off-by: Mauro Carvalho Chehab +--- + .../media/uapi/v4l/ext-ctrls-codec.rst | 24 +++++++++++++++++++ + drivers/media/v4l2-core/v4l2-ctrls.c | 4 ++++ + include/uapi/linux/v4l2-controls.h | 4 ++++ + 3 files changed, 32 insertions(+) + +diff --git a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +index 67a122339c0e..4a8446203085 100644 +--- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst ++++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +@@ -1055,6 +1055,30 @@ enum v4l2_mpeg_video_h264_entropy_mode - + Quantization parameter for an B frame for H264. Valid range: from 0 + to 51. + ++``V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP (integer)`` ++ Minimum quantization parameter for the H264 I frame to limit I frame ++ quality to a range. Valid range: from 0 to 51. If ++ V4L2_CID_MPEG_VIDEO_H264_MIN_QP is also set, the quantization parameter ++ should be chosen to meet both requirements. ++ ++``V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP (integer)`` ++ Maximum quantization parameter for the H264 I frame to limit I frame ++ quality to a range. Valid range: from 0 to 51. If ++ V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter ++ should be chosen to meet both requirements. ++ ++``V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP (integer)`` ++ Minimum quantization parameter for the H264 P frame to limit P frame ++ quality to a range. Valid range: from 0 to 51. If ++ V4L2_CID_MPEG_VIDEO_H264_MIN_QP is also set, the quantization parameter ++ should be chosen to meet both requirements. ++ ++``V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP (integer)`` ++ Maximum quantization parameter for the H264 P frame to limit P frame ++ quality to a range. Valid range: from 0 to 51. If ++ V4L2_CID_MPEG_VIDEO_H264_MAX_QP is also set, the quantization parameter ++ should be chosen to meet both requirements. ++ + ``V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (integer)`` + Quantization parameter for an I frame for MPEG4. Valid range: from 1 + to 31. +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index b1ae2e555c68..89a1fe564675 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -828,6 +828,10 @@ const char *v4l2_ctrl_get_name(u32 id) + case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION: + return "H264 Constrained Intra Pred"; + case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET: return "H264 Chroma QP Index Offset"; ++ case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP: return "H264 I-Frame Minimum QP Value"; ++ case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP: return "H264 I-Frame Maximum QP Value"; ++ case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP: return "H264 P-Frame Minimum QP Value"; ++ case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP: return "H264 P-Frame Maximum QP Value"; + case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value"; +diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h +index 78816ec88751..37807f23231e 100644 +--- a/include/uapi/linux/v4l2-controls.h ++++ b/include/uapi/linux/v4l2-controls.h +@@ -539,6 +539,10 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type { + #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_BASE+382) + #define V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION (V4L2_CID_MPEG_BASE+383) + #define V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET (V4L2_CID_MPEG_BASE+384) ++#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP (V4L2_CID_MPEG_BASE+385) ++#define V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP (V4L2_CID_MPEG_BASE+386) ++#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP (V4L2_CID_MPEG_BASE+387) ++#define V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP (V4L2_CID_MPEG_BASE+388) + #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (V4L2_CID_MPEG_BASE+400) + #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (V4L2_CID_MPEG_BASE+401) + #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (V4L2_CID_MPEG_BASE+402) +-- +2.21.0 + +From 26fae7a41313506931c9be5f532c12d8d654f153 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Tue, 2 Apr 2019 23:06:22 +0200 +Subject: [PATCH] clk: sunxi-ng: h6: Preset hdmi-cec clock parent + +H6 manual and BSP clock driver both states that hdmi-cec clock has two +possible parents, osc32k and pll-periph0-2x with 36621 predivider. +Because pll-periph0-2x is always 1.2 GHz, both parents give same +hdmi-cec rate - 32768 Hz, which is exactly the rate needed for HDMI CEC +controller to operate correctly. + +However, for some reason, HDMI CEC controller doesn't work if default +parent (osc32k) is used. BSP HDMI driver also always use pll-periph0-2x +as hdmi-cec clock parent. + +In order to solve the issue, preset hdmi-cec clock parent to +pll-periph0-2x. + +Signed-off-by: Jernej Skrabec +Signed-off-by: Maxime Ripard +--- + drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +index daf78966555e..33980067b06e 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +@@ -656,6 +656,8 @@ static const char * const hdmi_cec_parents[] = { "osc32k", "pll-periph0-2x" }; + static const struct ccu_mux_fixed_prediv hdmi_cec_predivs[] = { + { .index = 1, .div = 36621 }, + }; ++ ++#define SUN50I_H6_HDMI_CEC_CLK_REG 0xb10 + static struct ccu_mux hdmi_cec_clk = { + .enable = BIT(31), + +@@ -1200,6 +1202,15 @@ static int sun50i_h6_ccu_probe(struct platform_device *pdev) + val &= ~(GENMASK(21, 16) | BIT(0)); + writel(val | (7 << 16), reg + SUN50I_H6_PLL_AUDIO_REG); + ++ /* ++ * First clock parent (osc32K) is unusable for CEC. But since there ++ * is no good way to force parent switch (both run with same frequency), ++ * just set second clock parent here. ++ */ ++ val = readl(reg + SUN50I_H6_HDMI_CEC_CLK_REG); ++ val |= BIT(24); ++ writel(val, reg + SUN50I_H6_HDMI_CEC_CLK_REG); ++ + return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_h6_ccu_desc); + } + +-- +2.21.0 + +From 6597ce3de9e443f0cab693496fc529f55ae6eb01 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Wed, 3 Apr 2019 17:14:03 +0200 +Subject: [PATCH] clk: sunxi-ng: h6: Allow video & vpu clocks to change parent + rate + +Video related clocks need to set rate as close as possible to the +requested one, so they should be able to change parent clock rate. + +When processing 4K video, VPU clock has to be set to higher rate than it +is default parent rate. Because of that, VPU clock should be able to +change parent clock rate. + +Add CLK_SET_RATE_PARENT flag to tcon-lcd0, tcon-tv0 and ve. + +Signed-off-by: Jernej Skrabec +Signed-off-by: Maxime Ripard +--- + drivers/clk/sunxi-ng/ccu-sun50i-h6.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +index 33980067b06e..3c32d7798f27 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6.c ++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6.c +@@ -311,7 +311,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(ve_clk, "ve", ve_parents, 0x690, + 0, 3, /* M */ + 24, 1, /* mux */ + BIT(31), /* gate */ +- 0); ++ CLK_SET_RATE_PARENT); + + static SUNXI_CCU_GATE(bus_ve_clk, "bus-ve", "psi-ahb1-ahb2", + 0x69c, BIT(0), 0); +@@ -691,7 +691,7 @@ static SUNXI_CCU_MUX_WITH_GATE(tcon_lcd0_clk, "tcon-lcd0", + tcon_lcd0_parents, 0xb60, + 24, 3, /* mux */ + BIT(31), /* gate */ +- 0); ++ CLK_SET_RATE_PARENT); + + static SUNXI_CCU_GATE(bus_tcon_lcd0_clk, "bus-tcon-lcd0", "ahb3", + 0xb7c, BIT(0), 0); +@@ -706,7 +706,7 @@ static SUNXI_CCU_MP_WITH_MUX_GATE(tcon_tv0_clk, "tcon-tv0", + 8, 2, /* P */ + 24, 3, /* mux */ + BIT(31), /* gate */ +- 0); ++ CLK_SET_RATE_PARENT); + + static SUNXI_CCU_GATE(bus_tcon_tv0_clk, "bus-tcon-tv0", "ahb3", + 0xb9c, BIT(0), 0); +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0002-fixes-from-5.1.patch b/projects/Allwinner/patches/linux/0002-fixes-from-5.1.patch deleted file mode 100644 index 0744eecd7a..0000000000 --- a/projects/Allwinner/patches/linux/0002-fixes-from-5.1.patch +++ /dev/null @@ -1,1571 +0,0 @@ -From e2d8ffe2e76028457759988ba6216fd13eeea01b Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Tue, 13 Nov 2018 03:52:18 -0500 -Subject: [PATCH] media: v4l2-mem2mem: add v4l2_m2m_buf_copy_data helper - function - -Memory-to-memory devices should copy various parts of -struct v4l2_buffer from the output buffer to the capture buffer. - -Add a helper function that does that to simplify the driver code. - -Signed-off-by: Hans Verkuil -Reviewed-by: Paul Kocialkowski -Reviewed-by: Alexandre Courbot -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/v4l2-core/v4l2-mem2mem.c | 20 ++++++++++++++++++++ - include/media/v4l2-mem2mem.h | 20 ++++++++++++++++++++ - 2 files changed, 40 insertions(+) - -diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c -index 5bbdec55b7d7..631f4e2aa942 100644 ---- a/drivers/media/v4l2-core/v4l2-mem2mem.c -+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c -@@ -975,6 +975,26 @@ void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, - } - EXPORT_SYMBOL_GPL(v4l2_m2m_buf_queue); - -+void v4l2_m2m_buf_copy_data(const struct vb2_v4l2_buffer *out_vb, -+ struct vb2_v4l2_buffer *cap_vb, -+ bool copy_frame_flags) -+{ -+ u32 mask = V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_TSTAMP_SRC_MASK; -+ -+ if (copy_frame_flags) -+ mask |= V4L2_BUF_FLAG_KEYFRAME | V4L2_BUF_FLAG_PFRAME | -+ V4L2_BUF_FLAG_BFRAME; -+ -+ cap_vb->vb2_buf.timestamp = out_vb->vb2_buf.timestamp; -+ -+ if (out_vb->flags & V4L2_BUF_FLAG_TIMECODE) -+ cap_vb->timecode = out_vb->timecode; -+ cap_vb->field = out_vb->field; -+ cap_vb->flags &= ~mask; -+ cap_vb->flags |= out_vb->flags & mask; -+} -+EXPORT_SYMBOL_GPL(v4l2_m2m_buf_copy_data); -+ - void v4l2_m2m_request_queue(struct media_request *req) - { - struct media_request_object *obj, *obj_safe; -diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h -index 5467264771ec..43e447dcf69d 100644 ---- a/include/media/v4l2-mem2mem.h -+++ b/include/media/v4l2-mem2mem.h -@@ -622,6 +622,26 @@ v4l2_m2m_dst_buf_remove_by_idx(struct v4l2_m2m_ctx *m2m_ctx, unsigned int idx) - return v4l2_m2m_buf_remove_by_idx(&m2m_ctx->cap_q_ctx, idx); - } - -+/** -+ * v4l2_m2m_buf_copy_data() - copy buffer data from the output buffer to the -+ * capture buffer -+ * -+ * @out_vb: the output buffer that is the source of the data. -+ * @cap_vb: the capture buffer that will receive the data. -+ * @copy_frame_flags: copy the KEY/B/PFRAME flags as well. -+ * -+ * This helper function copies the timestamp, timecode (if the TIMECODE -+ * buffer flag was set), field and the TIMECODE, KEYFRAME, BFRAME, PFRAME -+ * and TSTAMP_SRC_MASK flags from @out_vb to @cap_vb. -+ * -+ * If @copy_frame_flags is false, then the KEYFRAME, BFRAME and PFRAME -+ * flags are not copied. This is typically needed for encoders that -+ * set this bits explicitly. -+ */ -+void v4l2_m2m_buf_copy_data(const struct vb2_v4l2_buffer *out_vb, -+ struct vb2_v4l2_buffer *cap_vb, -+ bool copy_frame_flags); -+ - /* v4l2 request helper */ - - void v4l2_m2m_request_queue(struct media_request *req); --- -2.20.1 - -From c2eb8effb265ac5cdd960d8e61ecb931e9c767cd Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Wed, 24 Oct 2018 06:50:34 -0400 -Subject: [PATCH] media: videodev2.h: add v4l2_timeval_to_ns inline function - -We want to be able to uniquely identify buffers for stateless -codecs. The internal timestamp (a u64) as stored internally in the -kernel is a suitable candidate for that, but in struct v4l2_buffer -it is represented as a struct timeval. - -Add a v4l2_timeval_to_ns() function that converts the struct timeval -into a u64 in the same way that the kernel does. This makes it possible -to use this u64 elsewhere as a unique identifier of the buffer. - -Since timestamps are also copied from the output buffer to the -corresponding capture buffer(s) by M2M devices, the u64 can be -used to refer to both output and capture buffers. - -The plan is that in the future we redesign struct v4l2_buffer and use -u64 for the timestamp instead of a struct timeval (which has lots of -problems with 32 vs 64 bit and y2038 layout changes), and then there -is no more need to use this function. - -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - include/uapi/linux/videodev2.h | 12 ++++++++++++ - 1 file changed, 12 insertions(+) - -diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h -index b5671ce2724f..d6eed479c3a6 100644 ---- a/include/uapi/linux/videodev2.h -+++ b/include/uapi/linux/videodev2.h -@@ -973,6 +973,18 @@ struct v4l2_buffer { - }; - }; - -+/** -+ * v4l2_timeval_to_ns - Convert timeval to nanoseconds -+ * @ts: pointer to the timeval variable to be converted -+ * -+ * Returns the scalar nanosecond representation of the timeval -+ * parameter. -+ */ -+static inline __u64 v4l2_timeval_to_ns(const struct timeval *tv) -+{ -+ return (__u64)tv->tv_sec * 1000000000ULL + tv->tv_usec * 1000; -+} -+ - /* Flags for 'flags' field */ - /* Buffer is mapped (flag) */ - #define V4L2_BUF_FLAG_MAPPED 0x00000001 --- -2.20.1 - -From 245ede423b43a6e081e94e0e5d4e895bd1f31228 Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Wed, 24 Oct 2018 06:51:01 -0400 -Subject: [PATCH] media: vb2: add vb2_find_timestamp() - -Use v4l2_timeval_to_ns instead of timeval_to_ns to ensure that -both kernelspace and userspace will use the same conversion -function. - -Next add a new vb2_find_timestamp() function to find buffers -with a specific timestamp. - -This function will only look at DEQUEUED and DONE buffers, i.e. -buffers that are already processed. - -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - .../media/common/videobuf2/videobuf2-v4l2.c | 19 ++++++++++++++++++- - include/media/videobuf2-v4l2.h | 17 +++++++++++++++++ - 2 files changed, 35 insertions(+), 1 deletion(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c -index 3a0ca2f9854f..75ea90e795d8 100644 ---- a/drivers/media/common/videobuf2/videobuf2-v4l2.c -+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c -@@ -143,7 +143,7 @@ static void __copy_timestamp(struct vb2_buffer *vb, const void *pb) - * and the timecode field and flag if needed. - */ - if (q->copy_timestamp) -- vb->timestamp = timeval_to_ns(&b->timestamp); -+ vb->timestamp = v4l2_timeval_to_ns(&b->timestamp); - vbuf->flags |= b->flags & V4L2_BUF_FLAG_TIMECODE; - if (b->flags & V4L2_BUF_FLAG_TIMECODE) - vbuf->timecode = b->timecode; -@@ -589,6 +589,23 @@ static const struct vb2_buf_ops v4l2_buf_ops = { - .copy_timestamp = __copy_timestamp, - }; - -+int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp, -+ unsigned int start_idx) -+{ -+ unsigned int i; -+ -+ for (i = start_idx; i < q->num_buffers; i++) { -+ struct vb2_buffer *vb = q->bufs[i]; -+ -+ if ((vb->state == VB2_BUF_STATE_DEQUEUED || -+ vb->state == VB2_BUF_STATE_DONE) && -+ vb->timestamp == timestamp) -+ return i; -+ } -+ return -1; -+} -+EXPORT_SYMBOL_GPL(vb2_find_timestamp); -+ - /* - * vb2_querybuf() - query video buffer information - * @q: videobuf queue -diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h -index 727855463838..a9961bc776dc 100644 ---- a/include/media/videobuf2-v4l2.h -+++ b/include/media/videobuf2-v4l2.h -@@ -55,6 +55,23 @@ struct vb2_v4l2_buffer { - #define to_vb2_v4l2_buffer(vb) \ - container_of(vb, struct vb2_v4l2_buffer, vb2_buf) - -+/** -+ * vb2_find_timestamp() - Find buffer with given timestamp in the queue -+ * -+ * @q: pointer to &struct vb2_queue with videobuf2 queue. -+ * @timestamp: the timestamp to find. Only buffers in state DEQUEUED or DONE -+ * are considered. -+ * @start_idx: the start index (usually 0) in the buffer array to start -+ * searching from. Note that there may be multiple buffers -+ * with the same timestamp value, so you can restart the search -+ * by setting @start_idx to the previously found index + 1. -+ * -+ * Returns the buffer index of the buffer with the given @timestamp, or -+ * -1 if no buffer with @timestamp was found. -+ */ -+int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp, -+ unsigned int start_idx); -+ - int vb2_querybuf(struct vb2_queue *q, struct v4l2_buffer *b); - - /** --- -2.20.1 - -From d998e03e322fc497454f584adfc35743713a44c5 Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Fri, 9 Nov 2018 04:16:21 -0500 -Subject: [PATCH] media: cedrus: identify buffers by timestamp - -Use the new v4l2_m2m_buf_copy_data helper function and use -timestamps to refer to reference frames instead of using -buffer indices. - -Also remove the padding fields in the structs, that's a bad -idea. Just use the right types to keep everything aligned. - -Signed-off-by: Hans Verkuil -Tested-by: Paul Kocialkowski -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/v4l2-core/v4l2-ctrls.c | 9 -------- - drivers/staging/media/sunxi/cedrus/cedrus.h | 9 +++++--- - .../staging/media/sunxi/cedrus/cedrus_dec.c | 2 ++ - .../staging/media/sunxi/cedrus/cedrus_mpeg2.c | 23 +++++++++---------- - include/media/mpeg2-ctrls.h | 14 ++++------- - 5 files changed, 24 insertions(+), 33 deletions(-) - -diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 5e3806feb5d7..e3bd441fa29a 100644 ---- a/drivers/media/v4l2-core/v4l2-ctrls.c -+++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -1661,15 +1661,6 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, - return -EINVAL; - } - -- if (p_mpeg2_slice_params->backward_ref_index >= VIDEO_MAX_FRAME || -- p_mpeg2_slice_params->forward_ref_index >= VIDEO_MAX_FRAME) -- return -EINVAL; -- -- if (p_mpeg2_slice_params->pad || -- p_mpeg2_slice_params->picture.pad || -- p_mpeg2_slice_params->sequence.pad) -- return -EINVAL; -- - return 0; - - case V4L2_CTRL_TYPE_MPEG2_QUANTIZATION: -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index 3acfdcf83691..4aedd24a9848 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -140,11 +140,14 @@ static inline dma_addr_t cedrus_buf_addr(struct vb2_buffer *buf, - } - - static inline dma_addr_t cedrus_dst_buf_addr(struct cedrus_ctx *ctx, -- unsigned int index, -- unsigned int plane) -+ int index, unsigned int plane) - { -- struct vb2_buffer *buf = ctx->dst_bufs[index]; -+ struct vb2_buffer *buf; - -+ if (index < 0) -+ return 0; -+ -+ buf = ctx->dst_bufs[index]; - return buf ? cedrus_buf_addr(buf, &ctx->dst_fmt, plane) : 0; - } - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -index 591d191d4286..443fb037e1cf 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -@@ -50,6 +50,8 @@ void cedrus_device_run(void *priv) - break; - } - -+ v4l2_m2m_buf_copy_data(run.src, run.dst, true); -+ - dev->dec_ops[ctx->current_codec]->setup(ctx, &run); - - /* Complete request(s) controls if needed. */ -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c -index 9abd39cae38c..cb45fda9aaeb 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c -@@ -82,7 +82,10 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) - dma_addr_t fwd_luma_addr, fwd_chroma_addr; - dma_addr_t bwd_luma_addr, bwd_chroma_addr; - struct cedrus_dev *dev = ctx->dev; -+ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; - const u8 *matrix; -+ int forward_idx; -+ int backward_idx; - unsigned int i; - u32 reg; - -@@ -156,23 +159,19 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) - cedrus_write(dev, VE_DEC_MPEG_PICBOUNDSIZE, reg); - - /* Forward and backward prediction reference buffers. */ -+ forward_idx = vb2_find_timestamp(cap_q, -+ slice_params->forward_ref_ts, 0); - -- fwd_luma_addr = cedrus_dst_buf_addr(ctx, -- slice_params->forward_ref_index, -- 0); -- fwd_chroma_addr = cedrus_dst_buf_addr(ctx, -- slice_params->forward_ref_index, -- 1); -+ fwd_luma_addr = cedrus_dst_buf_addr(ctx, forward_idx, 0); -+ fwd_chroma_addr = cedrus_dst_buf_addr(ctx, forward_idx, 1); - - cedrus_write(dev, VE_DEC_MPEG_FWD_REF_LUMA_ADDR, fwd_luma_addr); - cedrus_write(dev, VE_DEC_MPEG_FWD_REF_CHROMA_ADDR, fwd_chroma_addr); - -- bwd_luma_addr = cedrus_dst_buf_addr(ctx, -- slice_params->backward_ref_index, -- 0); -- bwd_chroma_addr = cedrus_dst_buf_addr(ctx, -- slice_params->backward_ref_index, -- 1); -+ backward_idx = vb2_find_timestamp(cap_q, -+ slice_params->backward_ref_ts, 0); -+ bwd_luma_addr = cedrus_dst_buf_addr(ctx, backward_idx, 0); -+ bwd_chroma_addr = cedrus_dst_buf_addr(ctx, backward_idx, 1); - - cedrus_write(dev, VE_DEC_MPEG_BWD_REF_LUMA_ADDR, bwd_luma_addr); - cedrus_write(dev, VE_DEC_MPEG_BWD_REF_CHROMA_ADDR, bwd_chroma_addr); -diff --git a/include/media/mpeg2-ctrls.h b/include/media/mpeg2-ctrls.h -index d21f40edc09e..6601455b3d5e 100644 ---- a/include/media/mpeg2-ctrls.h -+++ b/include/media/mpeg2-ctrls.h -@@ -30,10 +30,9 @@ struct v4l2_mpeg2_sequence { - __u32 vbv_buffer_size; - - /* ISO/IEC 13818-2, ITU-T Rec. H.262: Sequence extension */ -- __u8 profile_and_level_indication; -+ __u16 profile_and_level_indication; - __u8 progressive_sequence; - __u8 chroma_format; -- __u8 pad; - }; - - struct v4l2_mpeg2_picture { -@@ -51,23 +50,20 @@ struct v4l2_mpeg2_picture { - __u8 intra_vlc_format; - __u8 alternate_scan; - __u8 repeat_first_field; -- __u8 progressive_frame; -- __u8 pad; -+ __u16 progressive_frame; - }; - - struct v4l2_ctrl_mpeg2_slice_params { - __u32 bit_size; - __u32 data_bit_offset; -+ __u64 backward_ref_ts; -+ __u64 forward_ref_ts; - - struct v4l2_mpeg2_sequence sequence; - struct v4l2_mpeg2_picture picture; - - /* ISO/IEC 13818-2, ITU-T Rec. H.262: Slice */ -- __u8 quantiser_scale_code; -- -- __u8 backward_ref_index; -- __u8 forward_ref_index; -- __u8 pad; -+ __u32 quantiser_scale_code; - }; - - struct v4l2_ctrl_mpeg2_quantization { --- -2.20.1 - -From 03535e7a3a9937da99ee18304309e0574d2504fc Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Thu, 24 Jan 2019 06:47:49 -0200 -Subject: [PATCH] media: vb2: vb2_find_timestamp: drop restriction on buffer - state - -There really is no reason why vb2_find_timestamp can't just find -buffers in any state. Drop that part of the test. - -This also means that vb->timestamp should only be set to 0 when -the driver doesn't copy timestamps. - -This change allows for more efficient pipelining (i.e. you can use -a buffer for a reference frame even when it is queued). - -Signed-off-by: Hans Verkuil -Reviewed-by: Tomasz Figa -Reviewed-by: Alexandre Courbot -Reviewed-by: Paul Kocialkowski -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/common/videobuf2/videobuf2-v4l2.c | 11 +++-------- - include/media/videobuf2-v4l2.h | 3 +-- - 2 files changed, 4 insertions(+), 10 deletions(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c -index 75ea90e795d8..2f3b3ca5bde6 100644 ---- a/drivers/media/common/videobuf2/videobuf2-v4l2.c -+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c -@@ -567,7 +567,7 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct vb2_plane *planes) - struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); - unsigned int plane; - -- if (!vb->vb2_queue->is_output || !vb->vb2_queue->copy_timestamp) -+ if (!vb->vb2_queue->copy_timestamp) - vb->timestamp = 0; - - for (plane = 0; plane < vb->num_planes; ++plane) { -@@ -594,14 +594,9 @@ int vb2_find_timestamp(const struct vb2_queue *q, u64 timestamp, - { - unsigned int i; - -- for (i = start_idx; i < q->num_buffers; i++) { -- struct vb2_buffer *vb = q->bufs[i]; -- -- if ((vb->state == VB2_BUF_STATE_DEQUEUED || -- vb->state == VB2_BUF_STATE_DONE) && -- vb->timestamp == timestamp) -+ for (i = start_idx; i < q->num_buffers; i++) -+ if (q->bufs[i]->timestamp == timestamp) - return i; -- } - return -1; - } - EXPORT_SYMBOL_GPL(vb2_find_timestamp); -diff --git a/include/media/videobuf2-v4l2.h b/include/media/videobuf2-v4l2.h -index a9961bc776dc..8a10889dc2fd 100644 ---- a/include/media/videobuf2-v4l2.h -+++ b/include/media/videobuf2-v4l2.h -@@ -59,8 +59,7 @@ struct vb2_v4l2_buffer { - * vb2_find_timestamp() - Find buffer with given timestamp in the queue - * - * @q: pointer to &struct vb2_queue with videobuf2 queue. -- * @timestamp: the timestamp to find. Only buffers in state DEQUEUED or DONE -- * are considered. -+ * @timestamp: the timestamp to find. - * @start_idx: the start index (usually 0) in the buffer array to start - * searching from. Note that there may be multiple buffers - * with the same timestamp value, so you can restart the search --- -2.20.1 - -From 2cc1802f62e562611e86f04d9dae1337c824991e Mon Sep 17 00:00:00 2001 -From: Pawel Osciak -Date: Thu, 24 Jan 2019 07:51:55 -0200 -Subject: [PATCH] media: vb2: Keep dma-buf buffers mapped until they are freed - -When using vb2 for video decoding, dequeued capture buffers may still -be accessed by the hardware: this is the case when they are used as -reference frames for decoding subsequent frames. - -When the buffer is imported with dma-buf, it needs to be mapped before -access. Until now, it was mapped when queuing and unmapped when -dequeuing, which doesn't work for access as a reference frames. - -One way to solve this would be to map the buffer again when it is -needed as a reference, but the mapping/unmapping operations can -seriously impact performance. As a result, map the buffer once (when it -is first needed when queued) and keep it mapped until it is freed. - -Reviewed-on: https://chromium-review.googlesource.com/334103 -[Paul: Updated for mainline and changed commit message] - -Signed-off-by: Pawel Osciak -Signed-off-by: Paul Kocialkowski -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/common/videobuf2/videobuf2-core.c | 11 +++-------- - 1 file changed, 3 insertions(+), 8 deletions(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c -index 70e8c3366f9c..ce9294a635cc 100644 ---- a/drivers/media/common/videobuf2/videobuf2-core.c -+++ b/drivers/media/common/videobuf2/videobuf2-core.c -@@ -1196,6 +1196,9 @@ static int __prepare_dmabuf(struct vb2_buffer *vb) - * userspace knows sooner rather than later if the dma-buf map fails. - */ - for (plane = 0; plane < vb->num_planes; ++plane) { -+ if (vb->planes[plane].dbuf_mapped) -+ continue; -+ - ret = call_memop(vb, map_dmabuf, vb->planes[plane].mem_priv); - if (ret) { - dprintk(1, "failed to map dmabuf for plane %d\n", -@@ -1758,14 +1761,6 @@ static void __vb2_dqbuf(struct vb2_buffer *vb) - - vb->state = VB2_BUF_STATE_DEQUEUED; - -- /* unmap DMABUF buffer */ -- if (q->memory == VB2_MEMORY_DMABUF) -- for (i = 0; i < vb->num_planes; ++i) { -- if (!vb->planes[i].dbuf_mapped) -- continue; -- call_void_memop(vb, unmap_dmabuf, vb->planes[i].mem_priv); -- vb->planes[i].dbuf_mapped = 0; -- } - call_void_bufop(q, init_buffer, vb); - } - --- -2.20.1 - -From 6f2c6afa79e0513d339871337bfc8c6c621d3ab1 Mon Sep 17 00:00:00 2001 -From: Ondrej Jirman -Date: Fri, 21 Dec 2018 11:56:41 -0500 -Subject: [PATCH] media: sunxi: cedrus: Fix missing error message context - -When cedrus_hw_probe is called, v4l2_dev is not yet initialized. -Use dev_err instead. - -Signed-off-by: Ondrej Jirman -Acked-by: Paul Kocialkowski -Signed-off-by: Mauro Carvalho Chehab ---- - .../staging/media/sunxi/cedrus/cedrus_hw.c | 28 +++++++++---------- - 1 file changed, 14 insertions(+), 14 deletions(-) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -index 300339fee1bc..0acf219a8c91 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -@@ -157,14 +157,14 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - irq_dec = platform_get_irq(dev->pdev, 0); - if (irq_dec <= 0) { -- v4l2_err(&dev->v4l2_dev, "Failed to get IRQ\n"); -+ dev_err(dev->dev, "Failed to get IRQ\n"); - - return irq_dec; - } - ret = devm_request_irq(dev->dev, irq_dec, cedrus_irq, - 0, dev_name(dev->dev), dev); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to request IRQ\n"); -+ dev_err(dev->dev, "Failed to request IRQ\n"); - - return ret; - } -@@ -182,21 +182,21 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - ret = of_reserved_mem_device_init(dev->dev); - if (ret && ret != -ENODEV) { -- v4l2_err(&dev->v4l2_dev, "Failed to reserve memory\n"); -+ dev_err(dev->dev, "Failed to reserve memory\n"); - - return ret; - } - - ret = sunxi_sram_claim(dev->dev); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to claim SRAM\n"); -+ dev_err(dev->dev, "Failed to claim SRAM\n"); - - goto err_mem; - } - - dev->ahb_clk = devm_clk_get(dev->dev, "ahb"); - if (IS_ERR(dev->ahb_clk)) { -- v4l2_err(&dev->v4l2_dev, "Failed to get AHB clock\n"); -+ dev_err(dev->dev, "Failed to get AHB clock\n"); - - ret = PTR_ERR(dev->ahb_clk); - goto err_sram; -@@ -204,7 +204,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - dev->mod_clk = devm_clk_get(dev->dev, "mod"); - if (IS_ERR(dev->mod_clk)) { -- v4l2_err(&dev->v4l2_dev, "Failed to get MOD clock\n"); -+ dev_err(dev->dev, "Failed to get MOD clock\n"); - - ret = PTR_ERR(dev->mod_clk); - goto err_sram; -@@ -212,7 +212,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - dev->ram_clk = devm_clk_get(dev->dev, "ram"); - if (IS_ERR(dev->ram_clk)) { -- v4l2_err(&dev->v4l2_dev, "Failed to get RAM clock\n"); -+ dev_err(dev->dev, "Failed to get RAM clock\n"); - - ret = PTR_ERR(dev->ram_clk); - goto err_sram; -@@ -220,7 +220,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - dev->rstc = devm_reset_control_get(dev->dev, NULL); - if (IS_ERR(dev->rstc)) { -- v4l2_err(&dev->v4l2_dev, "Failed to get reset control\n"); -+ dev_err(dev->dev, "Failed to get reset control\n"); - - ret = PTR_ERR(dev->rstc); - goto err_sram; -@@ -229,7 +229,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - res = platform_get_resource(dev->pdev, IORESOURCE_MEM, 0); - dev->base = devm_ioremap_resource(dev->dev, res); - if (IS_ERR(dev->base)) { -- v4l2_err(&dev->v4l2_dev, "Failed to map registers\n"); -+ dev_err(dev->dev, "Failed to map registers\n"); - - ret = PTR_ERR(dev->base); - goto err_sram; -@@ -237,35 +237,35 @@ int cedrus_hw_probe(struct cedrus_dev *dev) - - ret = clk_set_rate(dev->mod_clk, CEDRUS_CLOCK_RATE_DEFAULT); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to set clock rate\n"); -+ dev_err(dev->dev, "Failed to set clock rate\n"); - - goto err_sram; - } - - ret = clk_prepare_enable(dev->ahb_clk); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to enable AHB clock\n"); -+ dev_err(dev->dev, "Failed to enable AHB clock\n"); - - goto err_sram; - } - - ret = clk_prepare_enable(dev->mod_clk); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to enable MOD clock\n"); -+ dev_err(dev->dev, "Failed to enable MOD clock\n"); - - goto err_ahb_clk; - } - - ret = clk_prepare_enable(dev->ram_clk); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to enable RAM clock\n"); -+ dev_err(dev->dev, "Failed to enable RAM clock\n"); - - goto err_mod_clk; - } - - ret = reset_control_reset(dev->rstc); - if (ret) { -- v4l2_err(&dev->v4l2_dev, "Failed to apply reset\n"); -+ dev_err(dev->dev, "Failed to apply reset\n"); - - goto err_ram_clk; - } --- -2.20.1 - -From 6f4b9d9a6c08f692f627700c2d0e250e406ac81f Mon Sep 17 00:00:00 2001 -From: Paul Kocialkowski -Date: Wed, 9 Jan 2019 12:19:19 -0200 -Subject: [PATCH] media: cedrus: Cleanup duplicate declarations from cedrus_dec - header - -Some leftover declarations are still in the cedrus_dec header although -they were moved to cedrus_video already. Clean them up. - -Signed-off-by: Paul Kocialkowski -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/staging/media/sunxi/cedrus/cedrus_dec.h | 6 ------ - 1 file changed, 6 deletions(-) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.h b/drivers/staging/media/sunxi/cedrus/cedrus_dec.h -index 4f423d3a1cad..d1ae7903677b 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.h -@@ -16,12 +16,6 @@ - #ifndef _CEDRUS_DEC_H_ - #define _CEDRUS_DEC_H_ - --extern const struct v4l2_ioctl_ops cedrus_ioctl_ops; -- --void cedrus_device_work(struct work_struct *work); - void cedrus_device_run(void *priv); - --int cedrus_queue_init(void *priv, struct vb2_queue *src_vq, -- struct vb2_queue *dst_vq); -- - #endif --- -2.20.1 - -From 55ea54441fb3b6532d5d32417911ff5a10750903 Mon Sep 17 00:00:00 2001 -From: Christoph Hellwig -Date: Fri, 4 Jan 2019 10:42:49 +0100 -Subject: [PATCH] videobuf2: replace a layering violation with dma_map_resource - -vb2_dc_get_userptr pokes into arm direct mapping details to get the -resemblance of a dma address for a a physical address that does is -not backed by a page struct. Not only is this not portable to other -architectures with dma direct mapping offsets, but also not to uses -of IOMMUs of any kind. Switch to the proper dma_map_resource / -dma_unmap_resource interface instead. - -Signed-off-by: Christoph Hellwig -Acked-by: Mauro Carvalho Chehab -Tested-by: Marek Szyprowski ---- - .../common/videobuf2/videobuf2-dma-contig.c | 41 ++++--------------- - 1 file changed, 9 insertions(+), 32 deletions(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-dma-contig.c b/drivers/media/common/videobuf2/videobuf2-dma-contig.c -index aff0ab7bf83d..82389aead6ed 100644 ---- a/drivers/media/common/videobuf2/videobuf2-dma-contig.c -+++ b/drivers/media/common/videobuf2/videobuf2-dma-contig.c -@@ -439,42 +439,14 @@ static void vb2_dc_put_userptr(void *buf_priv) - set_page_dirty_lock(pages[i]); - sg_free_table(sgt); - kfree(sgt); -+ } else { -+ dma_unmap_resource(buf->dev, buf->dma_addr, buf->size, -+ buf->dma_dir, 0); - } - vb2_destroy_framevec(buf->vec); - kfree(buf); - } - --/* -- * For some kind of reserved memory there might be no struct page available, -- * so all that can be done to support such 'pages' is to try to convert -- * pfn to dma address or at the last resort just assume that -- * dma address == physical address (like it has been assumed in earlier version -- * of videobuf2-dma-contig -- */ -- --#ifdef __arch_pfn_to_dma --static inline dma_addr_t vb2_dc_pfn_to_dma(struct device *dev, unsigned long pfn) --{ -- return (dma_addr_t)__arch_pfn_to_dma(dev, pfn); --} --#elif defined(__pfn_to_bus) --static inline dma_addr_t vb2_dc_pfn_to_dma(struct device *dev, unsigned long pfn) --{ -- return (dma_addr_t)__pfn_to_bus(pfn); --} --#elif defined(__pfn_to_phys) --static inline dma_addr_t vb2_dc_pfn_to_dma(struct device *dev, unsigned long pfn) --{ -- return (dma_addr_t)__pfn_to_phys(pfn); --} --#else --static inline dma_addr_t vb2_dc_pfn_to_dma(struct device *dev, unsigned long pfn) --{ -- /* really, we cannot do anything better at this point */ -- return (dma_addr_t)(pfn) << PAGE_SHIFT; --} --#endif -- - static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr, - unsigned long size, enum dma_data_direction dma_dir) - { -@@ -528,7 +500,12 @@ static void *vb2_dc_get_userptr(struct device *dev, unsigned long vaddr, - for (i = 1; i < n_pages; i++) - if (nums[i-1] + 1 != nums[i]) - goto fail_pfnvec; -- buf->dma_addr = vb2_dc_pfn_to_dma(buf->dev, nums[0]); -+ buf->dma_addr = dma_map_resource(buf->dev, -+ __pfn_to_phys(nums[0]), size, buf->dma_dir, 0); -+ if (dma_mapping_error(buf->dev, buf->dma_addr)) { -+ ret = -ENOMEM; -+ goto fail_pfnvec; -+ } - goto out; - } - --- -2.20.1 - -From 28d77c21cbeb2c6039d48ef88401b87a56a7a07f Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Wed, 16 Jan 2019 10:01:13 -0200 -Subject: [PATCH] media: vb2: add buf_out_validate callback - -When queueing a buffer to a request the 'field' value is not validated. -That field is only validated when the _buf_prepare() is called, -which happens when the request is queued. - -However, this validation should happen at QBUF time, since you want -to know about this as soon as possible. Also, the spec requires that -the 'field' value is validated at QBUF time. - -This patch adds a new buf_out_validate callback to validate the -output buffer at buf_prepare time or when QBUF queues an unprepared -buffer to a request. This callback is mandatory for output queues -that support requests. - -This issue was found by v4l2-compliance since it failed to replace -V4L2_FIELD_ANY by a proper field value when testing the vivid video -output in combination with requests. - -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - .../media/common/videobuf2/videobuf2-core.c | 22 ++++++++++++++++--- - include/media/videobuf2-core.h | 5 +++++ - 2 files changed, 24 insertions(+), 3 deletions(-) - -diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c -index ce9294a635cc..e07b6bdb6982 100644 ---- a/drivers/media/common/videobuf2/videobuf2-core.c -+++ b/drivers/media/common/videobuf2/videobuf2-core.c -@@ -499,9 +499,9 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) - pr_info(" buf_init: %u buf_cleanup: %u buf_prepare: %u buf_finish: %u\n", - vb->cnt_buf_init, vb->cnt_buf_cleanup, - vb->cnt_buf_prepare, vb->cnt_buf_finish); -- pr_info(" buf_queue: %u buf_done: %u buf_request_complete: %u\n", -- vb->cnt_buf_queue, vb->cnt_buf_done, -- vb->cnt_buf_request_complete); -+ pr_info(" buf_out_validate: %u buf_queue: %u buf_done: %u buf_request_complete: %u\n", -+ vb->cnt_buf_out_validate, vb->cnt_buf_queue, -+ vb->cnt_buf_done, vb->cnt_buf_request_complete); - pr_info(" alloc: %u put: %u prepare: %u finish: %u mmap: %u\n", - vb->cnt_mem_alloc, vb->cnt_mem_put, - vb->cnt_mem_prepare, vb->cnt_mem_finish, -@@ -1277,6 +1277,14 @@ static int __buf_prepare(struct vb2_buffer *vb) - return 0; - WARN_ON(vb->synced); - -+ if (q->is_output) { -+ ret = call_vb_qop(vb, buf_out_validate, vb); -+ if (ret) { -+ dprintk(1, "buffer validation failed\n"); -+ return ret; -+ } -+ } -+ - vb->state = VB2_BUF_STATE_PREPARING; - - switch (q->memory) { -@@ -1523,6 +1531,14 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb, - return -EINVAL; - } - -+ if (q->is_output && !vb->prepared) { -+ ret = call_vb_qop(vb, buf_out_validate, vb); -+ if (ret) { -+ dprintk(1, "buffer validation failed\n"); -+ return ret; -+ } -+ } -+ - media_request_object_init(&vb->req_obj); - - /* Make sure the request is in a safe state for updating. */ -diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h -index 4a737b2c610b..4849b865b908 100644 ---- a/include/media/videobuf2-core.h -+++ b/include/media/videobuf2-core.h -@@ -296,6 +296,7 @@ struct vb2_buffer { - u32 cnt_mem_num_users; - u32 cnt_mem_mmap; - -+ u32 cnt_buf_out_validate; - u32 cnt_buf_init; - u32 cnt_buf_prepare; - u32 cnt_buf_finish; -@@ -342,6 +343,9 @@ struct vb2_buffer { - * @wait_finish: reacquire all locks released in the previous callback; - * required to continue operation after sleeping while - * waiting for a new buffer to arrive. -+ * @buf_out_validate: called when the output buffer is prepared or queued -+ * to a request; drivers can use this to validate -+ * userspace-provided information; optional. - * @buf_init: called once after allocating a buffer (in MMAP case) - * or after acquiring a new USERPTR buffer; drivers may - * perform additional buffer-related initialization; -@@ -409,6 +413,7 @@ struct vb2_ops { - void (*wait_prepare)(struct vb2_queue *q); - void (*wait_finish)(struct vb2_queue *q); - -+ int (*buf_out_validate)(struct vb2_buffer *vb); - int (*buf_init)(struct vb2_buffer *vb); - int (*buf_prepare)(struct vb2_buffer *vb); - void (*buf_finish)(struct vb2_buffer *vb); --- -2.20.1 - -From 1284ed59a147c27cb882e49213571f7d52976eb5 Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Wed, 16 Jan 2019 10:01:17 -0200 -Subject: [PATCH] media: vb2: check that buf_out_validate is present - -The buf_out_validate is required for output queues in combination -with requests. Check this. - -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/common/videobuf2/videobuf2-v4l2.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c -index 2f3b3ca5bde6..3aeaea3af42a 100644 ---- a/drivers/media/common/videobuf2/videobuf2-v4l2.c -+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c -@@ -409,6 +409,15 @@ static int vb2_queue_or_prepare_buf(struct vb2_queue *q, struct media_device *md - */ - if (WARN_ON(!q->ops->buf_request_complete)) - return -EINVAL; -+ /* -+ * Make sure this op is implemented by the driver for the output queue. -+ * It's easy to forget this callback, but is it important to correctly -+ * validate the 'field' value at QBUF time. -+ */ -+ if (WARN_ON((q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT || -+ q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) && -+ !q->ops->buf_out_validate)) -+ return -EINVAL; - - if (vb->state != VB2_BUF_STATE_DEQUEUED) { - dprintk(1, "%s: buffer is not in dequeued state\n", opname); --- -2.20.1 - -From 6b3e4c4cc162390b833e57de656644786ca88919 Mon Sep 17 00:00:00 2001 -From: Hans Verkuil -Date: Wed, 16 Jan 2019 10:01:16 -0200 -Subject: [PATCH] media: cedrus: add buf_out_validate callback - -Validate the field for an output buffer. This ensures that the -field is validated when the buffer is queued to a request, and -not when the request itself is queued, which is too late. - -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/staging/media/sunxi/cedrus/cedrus_video.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -index 8721b4a7d496..b5cc79389d67 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -@@ -416,6 +416,14 @@ static void cedrus_buf_cleanup(struct vb2_buffer *vb) - ctx->dst_bufs[vb->index] = NULL; - } - -+static int cedrus_buf_out_validate(struct vb2_buffer *vb) -+{ -+ struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); -+ -+ vbuf->field = V4L2_FIELD_NONE; -+ return 0; -+} -+ - static int cedrus_buf_prepare(struct vb2_buffer *vb) - { - struct vb2_queue *vq = vb->vb2_queue; -@@ -493,6 +501,7 @@ static struct vb2_ops cedrus_qops = { - .buf_init = cedrus_buf_init, - .buf_cleanup = cedrus_buf_cleanup, - .buf_queue = cedrus_buf_queue, -+ .buf_out_validate = cedrus_buf_out_validate, - .buf_request_complete = cedrus_buf_request_complete, - .start_streaming = cedrus_start_streaming, - .stop_streaming = cedrus_stop_streaming, --- -2.20.1 - -From a4d3d61254d3645d8de738102c3c473b176180a5 Mon Sep 17 00:00:00 2001 -From: Ezequiel Garcia -Date: Tue, 5 Feb 2019 16:20:33 -0500 -Subject: [PATCH] media: v4l2-mem2mem: Rename v4l2_m2m_buf_copy_data to - v4l2_m2m_buf_copy_metadata - -The v4l2_m2m_buf_copy_data helper is used to copy the buffer -metadata, such as its timestamp and its flags. - -Therefore, the v4l2_m2m_buf_copy_metadata name is more clear -and avoids confusion with a payload data copy. - -Signed-off-by: Ezequiel Garcia -Signed-off-by: Hans Verkuil -[hverkuil-cisco@xs4all.nl: also fix cedrus_dec.c] -Signed-off-by: Mauro Carvalho Chehab ---- - drivers/media/v4l2-core/v4l2-mem2mem.c | 8 ++++---- - drivers/staging/media/sunxi/cedrus/cedrus_dec.c | 2 +- - include/media/v4l2-mem2mem.h | 14 +++++++------- - 5 files changed, 15 insertions(+), 15 deletions(-) - -diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c -index 631f4e2aa942..1494d0d5951a 100644 ---- a/drivers/media/v4l2-core/v4l2-mem2mem.c -+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c -@@ -975,9 +975,9 @@ void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, - } - EXPORT_SYMBOL_GPL(v4l2_m2m_buf_queue); - --void v4l2_m2m_buf_copy_data(const struct vb2_v4l2_buffer *out_vb, -- struct vb2_v4l2_buffer *cap_vb, -- bool copy_frame_flags) -+void v4l2_m2m_buf_copy_metadata(const struct vb2_v4l2_buffer *out_vb, -+ struct vb2_v4l2_buffer *cap_vb, -+ bool copy_frame_flags) - { - u32 mask = V4L2_BUF_FLAG_TIMECODE | V4L2_BUF_FLAG_TSTAMP_SRC_MASK; - -@@ -993,7 +993,7 @@ void v4l2_m2m_buf_copy_data(const struct vb2_v4l2_buffer *out_vb, - cap_vb->flags &= ~mask; - cap_vb->flags |= out_vb->flags & mask; - } --EXPORT_SYMBOL_GPL(v4l2_m2m_buf_copy_data); -+EXPORT_SYMBOL_GPL(v4l2_m2m_buf_copy_metadata); - - void v4l2_m2m_request_queue(struct media_request *req) - { -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -index 443fb037e1cf..4d6d602cdde6 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -@@ -50,7 +50,7 @@ void cedrus_device_run(void *priv) - break; - } - -- v4l2_m2m_buf_copy_data(run.src, run.dst, true); -+ v4l2_m2m_buf_copy_metadata(run.src, run.dst, true); - - dev->dec_ops[ctx->current_codec]->setup(ctx, &run); - -diff --git a/include/media/v4l2-mem2mem.h b/include/media/v4l2-mem2mem.h -index 43e447dcf69d..47c6d9aa0bf4 100644 ---- a/include/media/v4l2-mem2mem.h -+++ b/include/media/v4l2-mem2mem.h -@@ -623,11 +623,11 @@ v4l2_m2m_dst_buf_remove_by_idx(struct v4l2_m2m_ctx *m2m_ctx, unsigned int idx) - } - - /** -- * v4l2_m2m_buf_copy_data() - copy buffer data from the output buffer to the -- * capture buffer -+ * v4l2_m2m_buf_copy_metadata() - copy buffer metadata from -+ * the output buffer to the capture buffer - * -- * @out_vb: the output buffer that is the source of the data. -- * @cap_vb: the capture buffer that will receive the data. -+ * @out_vb: the output buffer that is the source of the metadata. -+ * @cap_vb: the capture buffer that will receive the metadata. - * @copy_frame_flags: copy the KEY/B/PFRAME flags as well. - * - * This helper function copies the timestamp, timecode (if the TIMECODE -@@ -638,9 +638,9 @@ v4l2_m2m_dst_buf_remove_by_idx(struct v4l2_m2m_ctx *m2m_ctx, unsigned int idx) - * flags are not copied. This is typically needed for encoders that - * set this bits explicitly. - */ --void v4l2_m2m_buf_copy_data(const struct vb2_v4l2_buffer *out_vb, -- struct vb2_v4l2_buffer *cap_vb, -- bool copy_frame_flags); -+void v4l2_m2m_buf_copy_metadata(const struct vb2_v4l2_buffer *out_vb, -+ struct vb2_v4l2_buffer *cap_vb, -+ bool copy_frame_flags); - - /* v4l2 request helper */ - --- -2.20.1 - -From 50656bad786d001b294764e9f047c5d5b3e4db75 Mon Sep 17 00:00:00 2001 -From: Philipp Zabel -Date: Thu, 10 Jan 2019 11:56:09 -0500 -Subject: [PATCH] media: v4l2-ctrl: Add control to enable h.264 constrained - intra prediction - -Allow to enable h.264 constrained intra prediction (macroblocks using -intra prediction modes are not allowed to use residual data and decoded -samples of neighboring macroblocks coded using inter prediction modes). -This control directly corresponds to the constrained_intra_pred_flag -field in the h.264 picture parameter set. - -Signed-off-by: Philipp Zabel -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - Documentation/media/uapi/v4l/extended-controls.rst | 4 ++++ - drivers/media/v4l2-core/v4l2-ctrls.c | 2 ++ - include/uapi/linux/v4l2-controls.h | 1 + - 3 files changed, 7 insertions(+) - -diff --git a/Documentation/media/uapi/v4l/extended-controls.rst b/Documentation/media/uapi/v4l/extended-controls.rst -index af4273aa5e85..235d0c293983 100644 ---- a/Documentation/media/uapi/v4l/extended-controls.rst -+++ b/Documentation/media/uapi/v4l/extended-controls.rst -@@ -1154,6 +1154,10 @@ enum v4l2_mpeg_video_h264_entropy_mode - - ``V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM (boolean)`` - Enable 8X8 transform for H264. Applicable to the H264 encoder. - -+``V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION (boolean)`` -+ Enable constrained intra prediction for H264. Applicable to the H264 -+ encoder. -+ - ``V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB (integer)`` - Cyclic intra macroblock refresh. This is the number of continuous - macroblocks refreshed every frame. Each frame a successive set of -diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 8c47d8f00429..50b56185c02e 100644 ---- a/drivers/media/v4l2-core/v4l2-ctrls.c -+++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -825,6 +825,8 @@ const char *v4l2_ctrl_get_name(u32 id) - case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:return "H264 Number of HC Layers"; - case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP: - return "H264 Set QP Value for HC Layers"; -+ case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION: -+ return "H264 Constrained Intra Pred"; - case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value"; -diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h -index 3dcfc6148f99..fd65c710b144 100644 ---- a/include/uapi/linux/v4l2-controls.h -+++ b/include/uapi/linux/v4l2-controls.h -@@ -533,6 +533,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type { - }; - #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (V4L2_CID_MPEG_BASE+381) - #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_BASE+382) -+#define V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION (V4L2_CID_MPEG_BASE+383) - #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (V4L2_CID_MPEG_BASE+400) - #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (V4L2_CID_MPEG_BASE+401) - #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (V4L2_CID_MPEG_BASE+402) --- -2.21.0 - -From d034696cbe5a6e00f76ca4b7869c6cdef66aebd5 Mon Sep 17 00:00:00 2001 -From: Philipp Zabel -Date: Thu, 10 Jan 2019 11:56:10 -0500 -Subject: [PATCH] media: v4l2-ctrl: Add control for h.264 chroma qp offset - -Allow to add fixed quantization parameter offset between luma and -chroma quantization parameters. This control directly corresponds -to the chroma_qp_index_offset field of the h.264 picture parameter -set. - -Signed-off-by: Philipp Zabel -Signed-off-by: Hans Verkuil -Signed-off-by: Mauro Carvalho Chehab ---- - Documentation/media/uapi/v4l/extended-controls.rst | 5 +++++ - drivers/media/v4l2-core/v4l2-ctrls.c | 1 + - include/uapi/linux/v4l2-controls.h | 1 + - 3 files changed, 7 insertions(+) - -diff --git a/Documentation/media/uapi/v4l/extended-controls.rst b/Documentation/media/uapi/v4l/extended-controls.rst -index 235d0c293983..00934efdc9e4 100644 ---- a/Documentation/media/uapi/v4l/extended-controls.rst -+++ b/Documentation/media/uapi/v4l/extended-controls.rst -@@ -1158,6 +1158,11 @@ enum v4l2_mpeg_video_h264_entropy_mode - - Enable constrained intra prediction for H264. Applicable to the H264 - encoder. - -+``V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET (integer)`` -+ Specify the offset that should be added to the luma quantization -+ parameter to determine the chroma quantization parameter. Applicable -+ to the H264 encoder. -+ - ``V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB (integer)`` - Cyclic intra macroblock refresh. This is the number of continuous - macroblocks refreshed every frame. Each frame a successive set of -diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 50b56185c02e..99308dac2daa 100644 ---- a/drivers/media/v4l2-core/v4l2-ctrls.c -+++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -827,6 +827,7 @@ const char *v4l2_ctrl_get_name(u32 id) - return "H264 Set QP Value for HC Layers"; - case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION: - return "H264 Constrained Intra Pred"; -+ case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET: return "H264 Chroma QP Index Offset"; - case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value"; -diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h -index fd65c710b144..06479f2fb3ae 100644 ---- a/include/uapi/linux/v4l2-controls.h -+++ b/include/uapi/linux/v4l2-controls.h -@@ -534,6 +534,7 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type { - #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER (V4L2_CID_MPEG_BASE+381) - #define V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP (V4L2_CID_MPEG_BASE+382) - #define V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION (V4L2_CID_MPEG_BASE+383) -+#define V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET (V4L2_CID_MPEG_BASE+384) - #define V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP (V4L2_CID_MPEG_BASE+400) - #define V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP (V4L2_CID_MPEG_BASE+401) - #define V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP (V4L2_CID_MPEG_BASE+402) --- -2.21.0 - -From 97e15cb4614733f7ebad2c9527b5ff82557dc247 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Tue, 2 Apr 2019 19:31:14 +0200 -Subject: [PATCH] clk: sunxi-ng: nkmp: Avoid GENMASK(-1, 0) - -Signed-off-by: Jernej Skrabec ---- - drivers/clk/sunxi-ng/ccu_nkmp.c | 18 +++++++++++++----- - 1 file changed, 13 insertions(+), 5 deletions(-) - -diff --git a/drivers/clk/sunxi-ng/ccu_nkmp.c b/drivers/clk/sunxi-ng/ccu_nkmp.c -index 9b49adb20d07..69dfc6de1c4e 100644 ---- a/drivers/clk/sunxi-ng/ccu_nkmp.c -+++ b/drivers/clk/sunxi-ng/ccu_nkmp.c -@@ -167,7 +167,7 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate, - unsigned long parent_rate) - { - struct ccu_nkmp *nkmp = hw_to_ccu_nkmp(hw); -- u32 n_mask, k_mask, m_mask, p_mask; -+ u32 n_mask = 0, k_mask = 0, m_mask = 0, p_mask = 0; - struct _ccu_nkmp _nkmp; - unsigned long flags; - u32 reg; -@@ -186,10 +186,18 @@ static int ccu_nkmp_set_rate(struct clk_hw *hw, unsigned long rate, - - ccu_nkmp_find_best(parent_rate, rate, &_nkmp); - -- n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, nkmp->n.shift); -- k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, nkmp->k.shift); -- m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, nkmp->m.shift); -- p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, nkmp->p.shift); -+ if (nkmp->n.width) -+ n_mask = GENMASK(nkmp->n.width + nkmp->n.shift - 1, -+ nkmp->n.shift); -+ if (nkmp->k.width) -+ k_mask = GENMASK(nkmp->k.width + nkmp->k.shift - 1, -+ nkmp->k.shift); -+ if (nkmp->m.width) -+ m_mask = GENMASK(nkmp->m.width + nkmp->m.shift - 1, -+ nkmp->m.shift); -+ if (nkmp->p.width) -+ p_mask = GENMASK(nkmp->p.width + nkmp->p.shift - 1, -+ nkmp->p.shift); - - spin_lock_irqsave(nkmp->common.lock, flags); - --- -2.21.0 - -From 6f3656f3552a3b32c625c93ddafcbe10bf0fea6d Mon Sep 17 00:00:00 2001 -From: Colin Ian King -Date: Sat, 22 Dec 2018 11:31:59 +0000 -Subject: [PATCH] regulator: axp20x: check rdev is null before dereferencing it - -Currently rdev is dereferenced when assigning desc before rdev is null -checked, hence there is a potential null pointer dereference on rdev. -Fix this by null checking rdev first. - -Detected by CoverityScan, CID#1476031 ("Dereference before null check") - -Fixes: 77e3e3b165db ("regulator: axp20x: add software based soft_start for AXP209 LDO3") -Signed-off-by: Colin Ian King -Signed-off-by: Mark Brown ---- - drivers/regulator/axp20x-regulator.c | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) - -diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c -index 48af859fd053..0dfa4ea6bbdf 100644 ---- a/drivers/regulator/axp20x-regulator.c -+++ b/drivers/regulator/axp20x-regulator.c -@@ -367,7 +367,7 @@ static const int axp209_dcdc2_ldo3_slew_rates[] = { - static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) - { - struct axp20x_dev *axp20x = rdev_get_drvdata(rdev); -- const struct regulator_desc *desc = rdev->desc; -+ const struct regulator_desc *desc; - u8 reg, mask, enable, cfg = 0xff; - const int *slew_rates; - int rate_count = 0; -@@ -375,6 +375,8 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) - if (!rdev) - return -EINVAL; - -+ desc = rdev->desc; -+ - switch (axp20x->variant) { - case AXP209_ID: - if (desc->id == AXP20X_DCDC2) { -@@ -436,11 +438,13 @@ static int axp20x_set_ramp_delay(struct regulator_dev *rdev, int ramp) - static int axp20x_regulator_enable_regmap(struct regulator_dev *rdev) - { - struct axp20x_dev *axp20x = rdev_get_drvdata(rdev); -- const struct regulator_desc *desc = rdev->desc; -+ const struct regulator_desc *desc; - - if (!rdev) - return -EINVAL; - -+ desc = rdev->desc; -+ - switch (axp20x->variant) { - case AXP209_ID: - if ((desc->id == AXP20X_LDO3) && --- -2.21.0 - -From d02337709390c854186c6a21f997dc39760591e1 Mon Sep 17 00:00:00 2001 -From: Axel Lin -Date: Mon, 28 Jan 2019 22:02:19 +0800 -Subject: [PATCH] regulator: axp20x: Fix incorrect vsel_mask settings - -Fix copy-paste mistake while converting to use defines for masks. - -Fixes: db4a555f7c4cf ("regulator: axp20x: use defines for masks") -Signed-off-by: Axel Lin -Signed-off-by: Mark Brown ---- - drivers/regulator/axp20x-regulator.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c -index 48af859fd053..dd0193d77960 100644 ---- a/drivers/regulator/axp20x-regulator.c -+++ b/drivers/regulator/axp20x-regulator.c -@@ -573,7 +573,7 @@ static const struct regulator_desc axp22x_regulators[] = { - AXP22X_DCDC3_V_OUT, AXP22X_DCDC3_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC3_MASK), - AXP_DESC(AXP22X, DCDC4, "dcdc4", "vin4", 600, 1540, 20, -- AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT, -+ AXP22X_DCDC4_V_OUT, AXP22X_DCDC4_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL1, AXP22X_PWR_OUT_DCDC4_MASK), - AXP_DESC(AXP22X, DCDC5, "dcdc5", "vin5", 1000, 2550, 50, - AXP22X_DCDC5_V_OUT, AXP22X_DCDC5_V_OUT_MASK, -@@ -952,7 +952,7 @@ static const struct regulator_desc axp813_regulators[] = { - AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK), - AXP_DESC(AXP813, ALDO2, "aldo2", "aldoin", 700, 3300, 100, -- AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT, -+ AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK), - AXP_DESC(AXP813, ALDO3, "aldo3", "aldoin", 700, 3300, 100, - AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK, -@@ -962,7 +962,7 @@ static const struct regulator_desc axp813_regulators[] = { - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK), - AXP_DESC_RANGES(AXP813, DLDO2, "dldo2", "dldoin", - axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES, -- AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT, -+ AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK), - AXP_DESC(AXP813, DLDO3, "dldo3", "dldoin", 700, 3300, 100, - AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK, -@@ -977,7 +977,7 @@ static const struct regulator_desc axp813_regulators[] = { - AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK), - AXP_DESC(AXP813, ELDO3, "eldo3", "eldoin", 700, 1900, 50, -- AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT, -+ AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK), - /* to do / check ... */ - AXP_DESC(AXP813, FLDO1, "fldo1", "fldoin", 700, 1450, 50, --- -2.21.0 - -From 4afa60d3a88aae3d052e0e8e1e62d6fc15a2be82 Mon Sep 17 00:00:00 2001 -From: Ondrej Jirman -Date: Mon, 18 Feb 2019 02:01:20 +0100 -Subject: [PATCH] regulator: axp20x: fix DCDCB and BLDO2 definitions for AXP806 - -This fixes another set of errors from the refactoring of literals -to mask preproccesor definitions. - -Found by debugging a broken voltage setup on Orange Pi One Plus. - -Fixes: db4a555f7c4cf ("regulator: axp20x: use defines for masks") -Signed-off-by: Ondrej Jirman -Acked-by: Chen-Yu Tsai -Signed-off-by: Mark Brown ---- - drivers/regulator/axp20x-regulator.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c -index 1b51d557ab55..62243957bd19 100644 ---- a/drivers/regulator/axp20x-regulator.c -+++ b/drivers/regulator/axp20x-regulator.c -@@ -791,7 +791,7 @@ static const struct regulator_desc axp806_regulators[] = { - AXP806_DCDCA_V_CTRL, AXP806_DCDCA_V_CTRL_MASK, - AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCA_MASK), - AXP_DESC(AXP806, DCDCB, "dcdcb", "vinb", 1000, 2550, 50, -- AXP806_DCDCB_V_CTRL, AXP806_DCDCB_V_CTRL, -+ AXP806_DCDCB_V_CTRL, AXP806_DCDCB_V_CTRL_MASK, - AXP806_PWR_OUT_CTRL1, AXP806_PWR_OUT_DCDCB_MASK), - AXP_DESC_RANGES(AXP806, DCDCC, "dcdcc", "vinc", - axp806_dcdca_ranges, AXP806_DCDCA_NUM_VOLTAGES, -@@ -817,7 +817,7 @@ static const struct regulator_desc axp806_regulators[] = { - AXP806_BLDO1_V_CTRL, AXP806_BLDO1_V_CTRL_MASK, - AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO1_MASK), - AXP_DESC(AXP806, BLDO2, "bldo2", "bldoin", 700, 1900, 100, -- AXP806_BLDO2_V_CTRL, AXP806_BLDO2_V_CTRL, -+ AXP806_BLDO2_V_CTRL, AXP806_BLDO2_V_CTRL_MASK, - AXP806_PWR_OUT_CTRL2, AXP806_PWR_OUT_BLDO2_MASK), - AXP_DESC(AXP806, BLDO3, "bldo3", "bldoin", 700, 1900, 100, - AXP806_BLDO3_V_CTRL, AXP806_BLDO3_V_CTRL_MASK, --- -2.21.0 - -From 55ec26d6a4241363fa94f15377ebd8f1116fbfd7 Mon Sep 17 00:00:00 2001 -From: Samuel Holland -Date: Sat, 12 Jan 2019 20:17:19 -0600 -Subject: [PATCH] arm64: dts: allwinner: a64: Enable A64 timer workaround - -As instability in the architectural timer has been observed on multiple -devices using this SoC, inluding the Pine64 and the Orange Pi Win, -enable the workaround in the SoC's device tree. - -Acked-by: Maxime Ripard -Signed-off-by: Samuel Holland -Signed-off-by: Chen-Yu Tsai ---- - arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -index bf9b719481c4..8171c0a7f265 100644 ---- a/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi -@@ -200,6 +200,7 @@ - - timer { - compatible = "arm,armv8-timer"; -+ allwinner,erratum-unknown1; - interrupts = , - -X-Patchwork-Id: 1035824 -Return-Path: -Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) - by smtp.lore.kernel.org (Postfix) with ESMTP id 1B380C282C3 - for ; Sat, 26 Jan 2019 06:18:58 +0000 (UTC) -Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) - by mail.kernel.org (Postfix) with ESMTP id DA5CC218A6 - for ; Sat, 26 Jan 2019 06:18:57 +0000 (UTC) -Authentication-Results: mail.kernel.org; - dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com - header.b="iKvIgjXT" -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S1727857AbfAZGST (ORCPT - ); - Sat, 26 Jan 2019 01:18:19 -0500 -Received: from mail-pf1-f195.google.com ([209.85.210.195]:32902 "EHLO - mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S1726030AbfAZGSS (ORCPT - ); - Sat, 26 Jan 2019 01:18:18 -0500 -Received: by mail-pf1-f195.google.com with SMTP id c123so5748894pfb.0 - for ; - Fri, 25 Jan 2019 22:18:18 -0800 (PST) -DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=gmail.com; s=20161025; - h=from:to:cc:subject:date:message-id:mime-version - :content-transfer-encoding; - bh=JSmITJw8ipgTHDHuuQbVyNNP7a2K+4jjuUDKEO/2BSQ=; - b=iKvIgjXTU+cd0F7lUCt9CqpCckQ8Lgi4IWCA2A3uqy99Mj0FoEQfml8lOh5o2hcjaz - LK6mLVA7ktj7qgKo05JFa+wxGgmViaKD3kwQhGNdJPWPbypRikJtiQ9X7OncP5OU5T4y - Onjj2C8vnf5Ji51YM0oE+aW+dPJSZD4JMQB5KfVip/csehJZfXjSqDTXDOe8HGcfiUXy - DY2dDe65mlm8Y8CINF2pL6pExl/YMvnzK4ksBMk5ApAMAldJdyDFPEzfAZpj5S2AR82j - jaOLwtye0VOVvWhXrjPr0ruLkNk2NwuN5PdK2EOfk7axkVBJwqLqbZUzcVG4jefrrXSt - oPfg== -X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; - d=1e100.net; s=20161025; - h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version - :content-transfer-encoding; - bh=JSmITJw8ipgTHDHuuQbVyNNP7a2K+4jjuUDKEO/2BSQ=; - b=HbbuR+peiN4ZGxh1K3ea6qlYG6RotGvRqCLBfuB19dm+NFw9Hrjiar98FC82Yikyq/ - 5d4FHhM6yM8E50hOM/r6xO23H1up+eEdH9wjOPOwXj/kgyg1N1j5nds03r/SDFpFAw+b - 7cttnUd6LSoe57Y27zUxG2i0NGEGQyoKKUL7qgsbXgM+94Bv7Em5qoePpN3se3lVX0NM - tl7fsrF2B0syFKEpN1nsyASJcmEDyARkoZ/sD9h4dm5e6f0sfun7C5RiK0yKJnK1HcNm - jUl7ZzbcofTQRINdLHjd8ha5rfqIZ5PzznEqfEqAlbAEYiLdpuE0NY3lp2eDFpwyzyli - PBfw== -X-Gm-Message-State: AJcUukdzFm8KfTEzwoyBqSIVpljLcfmJcoQHyvQDbmOrlDrhkoH9Do46 - 56MMagGJb69BtrFXk9QVXNU= -X-Google-Smtp-Source: - ALg8bN5Lp4psJFzc3iU5Wp4n4UXGTX50I1KuRfCGOg7kq/kwqpaoaJslhHffMN3StBzDuBgqBN4AgA== -X-Received: by 2002:a62:c683:: with SMTP id x3mr13649666pfk.10.1548483497516; - Fri, 25 Jan 2019 22:18:17 -0800 (PST) -Received: from anarsoul-thinkpad.lan (216-71-193-140.dyn.novuscom.net. - [216.71.193.140]) - by smtp.gmail.com with ESMTPSA id - 85sm36537643pfw.17.2019.01.25.22.18.16 - (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); - Fri, 25 Jan 2019 22:18:16 -0800 (PST) -From: Vasily Khoruzhick -To: Liam Girdwood , - Mark Brown , Chen-Yu Tsai , - Olliver Schinagl , - linux-kernel@vger.kernel.org -Cc: Vasily Khoruzhick -Subject: [PATCH] regulator: axp20x: fix ALDO2, - DLDO2 and ELDO3 definitions for AXP803 -Date: Fri, 25 Jan 2019 22:18:09 -0800 -Message-Id: <20190126061809.18035-1-anarsoul@gmail.com> -X-Mailer: git-send-email 2.20.1 -MIME-Version: 1.0 -Sender: linux-kernel-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-kernel@vger.kernel.org - -Looks like refactoring didn't go well and left ALDO2, DLDO2 and ELDO3 -definitions broken for AXP803 - now they are using register address -instead of mask. Fix it by using mask where necessary. - -Fixes: db4a555f7c4cf ("regulator: axp20x: use defines for masks") -Signed-off-by: Vasily Khoruzhick -Reviewed-by: Chen-Yu Tsai ---- - drivers/regulator/axp20x-regulator.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c -index 48af859fd053..a808b03cae10 100644 ---- a/drivers/regulator/axp20x-regulator.c -+++ b/drivers/regulator/axp20x-regulator.c -@@ -719,7 +719,7 @@ static const struct regulator_desc axp803_regulators[] = { - AXP22X_ALDO1_V_OUT, AXP22X_ALDO1_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO1_MASK), - AXP_DESC(AXP803, ALDO2, "aldo2", "aldoin", 700, 3300, 100, -- AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT, -+ AXP22X_ALDO2_V_OUT, AXP22X_ALDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL3, AXP806_PWR_OUT_ALDO2_MASK), - AXP_DESC(AXP803, ALDO3, "aldo3", "aldoin", 700, 3300, 100, - AXP22X_ALDO3_V_OUT, AXP22X_ALDO3_V_OUT_MASK, -@@ -729,7 +729,7 @@ static const struct regulator_desc axp803_regulators[] = { - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO1_MASK), - AXP_DESC_RANGES(AXP803, DLDO2, "dldo2", "dldoin", - axp803_dldo2_ranges, AXP803_DLDO2_NUM_VOLTAGES, -- AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT, -+ AXP22X_DLDO2_V_OUT, AXP22X_DLDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DLDO2_MASK), - AXP_DESC(AXP803, DLDO3, "dldo3", "dldoin", 700, 3300, 100, - AXP22X_DLDO3_V_OUT, AXP22X_DLDO3_V_OUT_MASK, -@@ -744,7 +744,7 @@ static const struct regulator_desc axp803_regulators[] = { - AXP22X_ELDO2_V_OUT, AXP22X_ELDO2_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO2_MASK), - AXP_DESC(AXP803, ELDO3, "eldo3", "eldoin", 700, 1900, 50, -- AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT, -+ AXP22X_ELDO3_V_OUT, AXP22X_ELDO3_V_OUT_MASK, - AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_ELDO3_MASK), - AXP_DESC(AXP803, FLDO1, "fldo1", "fldoin", 700, 1450, 50, - AXP803_FLDO1_V_OUT, AXP803_FLDO1_V_OUT_MASK, diff --git a/projects/Allwinner/patches/linux/0003-backport-from-5.3.patch b/projects/Allwinner/patches/linux/0003-backport-from-5.3.patch new file mode 100644 index 0000000000..b9e475980b --- /dev/null +++ b/projects/Allwinner/patches/linux/0003-backport-from-5.3.patch @@ -0,0 +1,2765 @@ +From 9bd1acf0cdd4dd78a130714ad42163eac20871a3 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 18 May 2019 18:24:04 +0200 +Subject: [PATCH] media: cedrus: Allow different mod clock rates + +Some VPU variants may run at higher clock speeds. They actually need +extra speed to be capable of decoding more complex codecs like HEVC or +bigger image sizes (4K). + +Expand variant structure with mod_rate information. + +Signed-off-by: Jernej Skrabec +--- + drivers/staging/media/sunxi/cedrus/cedrus.c | 11 ++++++++--- + drivers/staging/media/sunxi/cedrus/cedrus.h | 1 + + drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 2 +- + drivers/staging/media/sunxi/cedrus/cedrus_hw.h | 2 -- + 4 files changed, 10 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c +index d0429c0e6b6b..9349a082a29c 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus.c +@@ -369,36 +369,41 @@ static int cedrus_remove(struct platform_device *pdev) + } + + static const struct cedrus_variant sun4i_a10_cedrus_variant = { +- /* No particular capability. */ ++ .mod_rate = 320000000, + }; + + static const struct cedrus_variant sun5i_a13_cedrus_variant = { +- /* No particular capability. */ ++ .mod_rate = 320000000, + }; + + static const struct cedrus_variant sun7i_a20_cedrus_variant = { +- /* No particular capability. */ ++ .mod_rate = 320000000, + }; + + static const struct cedrus_variant sun8i_a33_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .mod_rate = 320000000, + }; + + static const struct cedrus_variant sun8i_h3_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .mod_rate = 402000000, + }; + + static const struct cedrus_variant sun50i_a64_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .mod_rate = 402000000, + }; + + static const struct cedrus_variant sun50i_h5_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .mod_rate = 402000000, + }; + + static const struct cedrus_variant sun50i_h6_cedrus_variant = { + .capabilities = CEDRUS_CAPABILITY_UNTILED, + .quirks = CEDRUS_QUIRK_NO_DMA_OFFSET, ++ .mod_rate = 600000000, + }; + + static const struct of_device_id cedrus_dt_match[] = { +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h +index c57c04b41d2e..25ee1f80f2c7 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus.h ++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h +@@ -94,6 +94,7 @@ struct cedrus_dec_ops { + struct cedrus_variant { + unsigned int capabilities; + unsigned int quirks; ++ unsigned int mod_rate; + }; + + struct cedrus_dev { +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +index fbfff7c1c771..60406b2d4595 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +@@ -236,7 +236,7 @@ int cedrus_hw_probe(struct cedrus_dev *dev) + goto err_sram; + } + +- ret = clk_set_rate(dev->mod_clk, CEDRUS_CLOCK_RATE_DEFAULT); ++ ret = clk_set_rate(dev->mod_clk, variant->mod_rate); + if (ret) { + dev_err(dev->dev, "Failed to set clock rate\n"); + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h +index b43c77d54b95..27d0882397aa 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h +@@ -16,8 +16,6 @@ + #ifndef _CEDRUS_HW_H_ + #define _CEDRUS_HW_H_ + +-#define CEDRUS_CLOCK_RATE_DEFAULT 320000000 +- + int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec); + void cedrus_engine_disable(struct cedrus_dev *dev); + +-- +2.21.0 + +From 79084d4e9a6783688ce497b6d17e8ecf09950bf5 Mon Sep 17 00:00:00 2001 +From: Philipp Zabel +Date: Wed, 24 Apr 2019 12:43:47 +0200 +Subject: [PATCH] media: v4l2-ctrl: add MPEG-2 profile and level controls + +Add MPEG-2 CID definitions for profiles and levels defined in ITU-T Rec. +H.262. + +Signed-off-by: Philipp Zabel +Signed-off-by: Hans Verkuil +--- + .../media/uapi/v4l/ext-ctrls-codec.rst | 56 +++++++++++++++++++ + drivers/media/v4l2-core/v4l2-ctrls.c | 23 ++++++++ + include/uapi/linux/v4l2-controls.h | 18 ++++++ + 3 files changed, 97 insertions(+) + +diff --git a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +index 4a8446203085..843c93e8e7bc 100644 +--- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst ++++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +@@ -759,6 +759,32 @@ enum v4l2_mpeg_video_h264_level - + + + ++.. _v4l2-mpeg-video-mpeg2-level: ++ ++``V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL`` ++ (enum) ++ ++enum v4l2_mpeg_video_mpeg2_level - ++ The level information for the MPEG2 elementary stream. Applicable to ++ MPEG2 codecs. Possible values are: ++ ++ ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ ++ * - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW`` ++ - Low Level (LL) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN`` ++ - Main Level (ML) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440`` ++ - High-1440 Level (H-14) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH`` ++ - High Level (HL) ++ ++ ++ + .. _v4l2-mpeg-video-mpeg4-level: + + ``V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL`` +@@ -845,6 +871,36 @@ enum v4l2_mpeg_video_h264_profile - + + + ++.. _v4l2-mpeg-video-mpeg2-profile: ++ ++``V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE`` ++ (enum) ++ ++enum v4l2_mpeg_video_mpeg2_profile - ++ The profile information for MPEG2. Applicable to MPEG2 codecs. ++ Possible values are: ++ ++ ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE`` ++ - Simple profile (SP) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN`` ++ - Main profile (MP) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SNR_SCALABLE`` ++ - SNR Scalable profile (SNR) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_SPATIALLY_SCALABLE`` ++ - Spatially Scalable profile (Spt) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_HIGH`` ++ - High profile (HP) ++ * - ``V4L2_MPEG_VIDEO_MPEG2_PROFILE_MULTIVIEW`` ++ - Multi-view profile (MVP) ++ ++ ++ + .. _v4l2-mpeg-video-mpeg4-profile: + + ``V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE`` +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 420e3fc237cd..3380accc24ed 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -406,6 +406,21 @@ const char * const *v4l2_ctrl_get_menu(u32 id) + "Explicit", + NULL, + }; ++ static const char * const mpeg_mpeg2_level[] = { ++ "Low", ++ "Main", ++ "High 1440", ++ "High", ++ NULL, ++ }; ++ static const char * const mpeg2_profile[] = { ++ "Simple", ++ "Main", ++ "SNR Scalable", ++ "Spatially Scalable", ++ "High", ++ NULL, ++ }; + static const char * const mpeg_mpeg4_level[] = { + "0", + "0b", +@@ -622,6 +637,10 @@ const char * const *v4l2_ctrl_get_menu(u32 id) + return h264_fp_arrangement_type; + case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE: + return h264_fmo_map_type; ++ case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL: ++ return mpeg_mpeg2_level; ++ case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE: ++ return mpeg2_profile; + case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: + return mpeg_mpeg4_level; + case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: +@@ -832,6 +851,8 @@ const char *v4l2_ctrl_get_name(u32 id) + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP: return "H264 I-Frame Maximum QP Value"; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP: return "H264 P-Frame Minimum QP Value"; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP: return "H264 P-Frame Maximum QP Value"; ++ case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL: return "MPEG2 Level"; ++ case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE: return "MPEG2 Profile"; + case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value"; +@@ -1197,6 +1218,8 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, + case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: + case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE: + case V4L2_CID_MPEG_VIDEO_H264_FMO_MAP_TYPE: ++ case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL: ++ case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE: + case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL: + case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE: + case V4L2_CID_JPEG_CHROMA_SUBSAMPLING: +diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h +index 37807f23231e..d9f2c76b71bb 100644 +--- a/include/uapi/linux/v4l2-controls.h ++++ b/include/uapi/linux/v4l2-controls.h +@@ -404,6 +404,24 @@ enum v4l2_mpeg_video_multi_slice_mode { + #define V4L2_CID_MPEG_VIDEO_MV_V_SEARCH_RANGE (V4L2_CID_MPEG_BASE+228) + #define V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME (V4L2_CID_MPEG_BASE+229) + ++/* CIDs for the MPEG-2 Part 2 (H.262) codec */ ++#define V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL (V4L2_CID_MPEG_BASE+270) ++enum v4l2_mpeg_video_mpeg2_level { ++ V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW = 0, ++ V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN = 1, ++ V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440 = 2, ++ V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH = 3, ++}; ++#define V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE (V4L2_CID_MPEG_BASE+271) ++enum v4l2_mpeg_video_mpeg2_profile { ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE = 0, ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN = 1, ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_SNR_SCALABLE = 2, ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_SPATIALLY_SCALABLE = 3, ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_HIGH = 4, ++ V4L2_MPEG_VIDEO_MPEG2_PROFILE_MULTIVIEW = 5, ++}; ++ + /* CIDs for the FWHT codec as used by the vicodec driver. */ + #define V4L2_CID_FWHT_I_FRAME_QP (V4L2_CID_MPEG_BASE + 290) + #define V4L2_CID_FWHT_P_FRAME_QP (V4L2_CID_MPEG_BASE + 291) +-- +2.21.0 + +From e5929e797865802d8124a20de14f202ec143cafd Mon Sep 17 00:00:00 2001 +From: Pawel Osciak +Date: Fri, 24 May 2019 11:20:28 +0200 +Subject: [PATCH 05/12] media: uapi: Add H264 low-level decoder API compound + controls. + +Stateless video codecs will require both the H264 metadata and slices in +order to be able to decode frames. + +This introduces the definitions for the structures used to pass the +metadata from the userspace to the kernel. + +Reviewed-by: Paul Kocialkowski +Reviewed-by: Tomasz Figa +Signed-off-by: Pawel Osciak +Signed-off-by: Guenter Roeck +Co-developed-by: Maxime Ripard +Signed-off-by: Maxime Ripard +Signed-off-by: Hans Verkuil +--- + Documentation/media/uapi/v4l/biblio.rst | 9 + + .../media/uapi/v4l/ext-ctrls-codec.rst | 569 ++++++++++++++++++ + .../media/uapi/v4l/vidioc-queryctrl.rst | 30 + + .../media/videodev2.h.rst.exceptions | 5 + + drivers/media/v4l2-core/v4l2-ctrls.c | 42 ++ + include/media/v4l2-ctrls.h | 13 +- + 6 files changed, 667 insertions(+), 1 deletion(-) + +diff --git a/Documentation/media/uapi/v4l/biblio.rst b/Documentation/media/uapi/v4l/biblio.rst +index ec33768c055e..8f4eb8823d82 100644 +--- a/Documentation/media/uapi/v4l/biblio.rst ++++ b/Documentation/media/uapi/v4l/biblio.rst +@@ -122,6 +122,15 @@ ITU BT.1119 + + :author: International Telecommunication Union (http://www.itu.ch) + ++.. _h264: ++ ++ITU-T Rec. H.264 Specification (04/2017 Edition) ++================================================ ++ ++:title: ITU-T Recommendation H.264 "Advanced Video Coding for Generic Audiovisual Services" ++ ++:author: International Telecommunication Union (http://www.itu.ch) ++ + .. _jfif: + + JFIF +diff --git a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +index 843c93e8e7bc..b0c178f0ff9b 100644 +--- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst ++++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +@@ -1451,6 +1451,575 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - + - Layer number + + ++.. _v4l2-mpeg-h264: ++ ++``V4L2_CID_MPEG_VIDEO_H264_SPS (struct)`` ++ Specifies the sequence parameter set (as extracted from the ++ bitstream) for the associated H264 slice data. This includes the ++ necessary parameters for configuring a stateless hardware decoding ++ pipeline for H264. The bitstream parameters are defined according ++ to :ref:`h264`, section 7.4.2.1.1 "Sequence Parameter Set Data ++ Semantics". For further documentation, refer to the above ++ specification, unless there is an explicit comment stating ++ otherwise. ++ ++ .. note:: ++ ++ This compound control is not yet part of the public kernel API and ++ it is expected to change. ++ ++.. c:type:: v4l2_ctrl_h264_sps ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_h264_sps ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``profile_idc`` ++ - ++ * - __u8 ++ - ``constraint_set_flags`` ++ - See :ref:`Sequence Parameter Set Constraints Set Flags ` ++ * - __u8 ++ - ``level_idc`` ++ - ++ * - __u8 ++ - ``seq_parameter_set_id`` ++ - ++ * - __u8 ++ - ``chroma_format_idc`` ++ - ++ * - __u8 ++ - ``bit_depth_luma_minus8`` ++ - ++ * - __u8 ++ - ``bit_depth_chroma_minus8`` ++ - ++ * - __u8 ++ - ``log2_max_frame_num_minus4`` ++ - ++ * - __u8 ++ - ``pic_order_cnt_type`` ++ - ++ * - __u8 ++ - ``log2_max_pic_order_cnt_lsb_minus4`` ++ - ++ * - __u8 ++ - ``max_num_ref_frames`` ++ - ++ * - __u8 ++ - ``num_ref_frames_in_pic_order_cnt_cycle`` ++ - ++ * - __s32 ++ - ``offset_for_ref_frame[255]`` ++ - ++ * - __s32 ++ - ``offset_for_non_ref_pic`` ++ - ++ * - __s32 ++ - ``offset_for_top_to_bottom_field`` ++ - ++ * - __u16 ++ - ``pic_width_in_mbs_minus1`` ++ - ++ * - __u16 ++ - ``pic_height_in_map_units_minus1`` ++ - ++ * - __u32 ++ - ``flags`` ++ - See :ref:`Sequence Parameter Set Flags ` ++ ++.. _h264_sps_constraints_set_flags: ++ ++``Sequence Parameter Set Constraints Set Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET0_FLAG`` ++ - 0x00000001 ++ - ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET1_FLAG`` ++ - 0x00000002 ++ - ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET2_FLAG`` ++ - 0x00000004 ++ - ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET3_FLAG`` ++ - 0x00000008 ++ - ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET4_FLAG`` ++ - 0x00000010 ++ - ++ * - ``V4L2_H264_SPS_CONSTRAINT_SET5_FLAG`` ++ - 0x00000020 ++ - ++ ++.. _h264_sps_flags: ++ ++``Sequence Parameter Set Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE`` ++ - 0x00000001 ++ - ++ * - ``V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS`` ++ - 0x00000002 ++ - ++ * - ``V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO`` ++ - 0x00000004 ++ - ++ * - ``V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED`` ++ - 0x00000008 ++ - ++ * - ``V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY`` ++ - 0x00000010 ++ - ++ * - ``V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD`` ++ - 0x00000020 ++ - ++ * - ``V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE`` ++ - 0x00000040 ++ - ++ ++``V4L2_CID_MPEG_VIDEO_H264_PPS (struct)`` ++ Specifies the picture parameter set (as extracted from the ++ bitstream) for the associated H264 slice data. This includes the ++ necessary parameters for configuring a stateless hardware decoding ++ pipeline for H264. The bitstream parameters are defined according ++ to :ref:`h264`, section 7.4.2.2 "Picture Parameter Set RBSP ++ Semantics". For further documentation, refer to the above ++ specification, unless there is an explicit comment stating ++ otherwise. ++ ++ .. note:: ++ ++ This compound control is not yet part of the public kernel API and ++ it is expected to change. ++ ++.. c:type:: v4l2_ctrl_h264_pps ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_h264_pps ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``pic_parameter_set_id`` ++ - ++ * - __u8 ++ - ``seq_parameter_set_id`` ++ - ++ * - __u8 ++ - ``num_slice_groups_minus1`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l0_default_active_minus1`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l1_default_active_minus1`` ++ - ++ * - __u8 ++ - ``weighted_bipred_idc`` ++ - ++ * - __s8 ++ - ``pic_init_qp_minus26`` ++ - ++ * - __s8 ++ - ``pic_init_qs_minus26`` ++ - ++ * - __s8 ++ - ``chroma_qp_index_offset`` ++ - ++ * - __s8 ++ - ``second_chroma_qp_index_offset`` ++ - ++ * - __u16 ++ - ``flags`` ++ - See :ref:`Picture Parameter Set Flags ` ++ ++.. _h264_pps_flags: ++ ++``Picture Parameter Set Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE`` ++ - 0x00000001 ++ - ++ * - ``V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT`` ++ - 0x00000002 ++ - ++ * - ``V4L2_H264_PPS_FLAG_WEIGHTED_PRED`` ++ - 0x00000004 ++ - ++ * - ``V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT`` ++ - 0x00000008 ++ - ++ * - ``V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED`` ++ - 0x00000010 ++ - ++ * - ``V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT`` ++ - 0x00000020 ++ - ++ * - ``V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE`` ++ - 0x00000040 ++ - ++ * - ``V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT`` ++ - 0x00000080 ++ - ++ ++``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (struct)`` ++ Specifies the scaling matrix (as extracted from the bitstream) for ++ the associated H264 slice data. The bitstream parameters are ++ defined according to :ref:`h264`, section 7.4.2.1.1.1 "Scaling ++ List Semantics".For further documentation, refer to the above ++ specification, unless there is an explicit comment stating ++ otherwise. ++ ++ .. note:: ++ ++ This compound control is not yet part of the public kernel API and ++ it is expected to change. ++ ++.. c:type:: v4l2_ctrl_h264_scaling_matrix ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_h264_scaling_matrix ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``scaling_list_4x4[6][16]`` ++ - ++ * - __u8 ++ - ``scaling_list_8x8[6][64]`` ++ - ++ ++``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (struct)`` ++ Specifies the slice parameters (as extracted from the bitstream) ++ for the associated H264 slice data. This includes the necessary ++ parameters for configuring a stateless hardware decoding pipeline ++ for H264. The bitstream parameters are defined according to ++ :ref:`h264`, section 7.4.3 "Slice Header Semantics". For further ++ documentation, refer to the above specification, unless there is ++ an explicit comment stating otherwise. ++ ++ .. note:: ++ ++ This compound control is not yet part of the public kernel API ++ and it is expected to change. ++ ++ This structure is expected to be passed as an array, with one ++ entry for each slice included in the bitstream buffer. ++ ++.. c:type:: v4l2_ctrl_h264_slice_params ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_h264_slice_params ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u32 ++ - ``size`` ++ - ++ * - __u32 ++ - ``header_bit_size`` ++ - ++ * - __u16 ++ - ``first_mb_in_slice`` ++ - ++ * - __u8 ++ - ``slice_type`` ++ - ++ * - __u8 ++ - ``pic_parameter_set_id`` ++ - ++ * - __u8 ++ - ``colour_plane_id`` ++ - ++ * - __u8 ++ - ``redundant_pic_cnt`` ++ - ++ * - __u16 ++ - ``frame_num`` ++ - ++ * - __u16 ++ - ``idr_pic_id`` ++ - ++ * - __u16 ++ - ``pic_order_cnt_lsb`` ++ - ++ * - __s32 ++ - ``delta_pic_order_cnt_bottom`` ++ - ++ * - __s32 ++ - ``delta_pic_order_cnt0`` ++ - ++ * - __s32 ++ - ``delta_pic_order_cnt1`` ++ - ++ * - struct :c:type:`v4l2_h264_pred_weight_table` ++ - ``pred_weight_table`` ++ - ++ * - __u32 ++ - ``dec_ref_pic_marking_bit_size`` ++ - ++ * - __u32 ++ - ``pic_order_cnt_bit_size`` ++ - ++ * - __u8 ++ - ``cabac_init_idc`` ++ - ++ * - __s8 ++ - ``slice_qp_delta`` ++ - ++ * - __s8 ++ - ``slice_qs_delta`` ++ - ++ * - __u8 ++ - ``disable_deblocking_filter_idc`` ++ - ++ * - __s8 ++ - ``slice_alpha_c0_offset_div2`` ++ - ++ * - __s8 ++ - ``slice_beta_offset_div2`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l0_active_minus1`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l1_active_minus1`` ++ - ++ * - __u32 ++ - ``slice_group_change_cycle`` ++ - ++ * - __u8 ++ - ``ref_pic_list0[32]`` ++ - Reference picture list after applying the per-slice modifications ++ * - __u8 ++ - ``ref_pic_list1[32]`` ++ - Reference picture list after applying the per-slice modifications ++ * - __u32 ++ - ``flags`` ++ - See :ref:`Slice Parameter Flags ` ++ ++.. _h264_slice_flags: ++ ++``Slice Parameter Set Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_SLICE_FLAG_FIELD_PIC`` ++ - 0x00000001 ++ - ++ * - ``V4L2_H264_SLICE_FLAG_BOTTOM_FIELD`` ++ - 0x00000002 ++ - ++ * - ``V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED`` ++ - 0x00000004 ++ - ++ * - ``V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH`` ++ - 0x00000008 ++ - ++ ++``Prediction Weight Table`` ++ ++ The bitstream parameters are defined according to :ref:`h264`, ++ section 7.4.3.2 "Prediction Weight Table Semantics". For further ++ documentation, refer to the above specification, unless there is ++ an explicit comment stating otherwise. ++ ++.. c:type:: v4l2_h264_pred_weight_table ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_h264_pred_weight_table ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u16 ++ - ``luma_log2_weight_denom`` ++ - ++ * - __u16 ++ - ``chroma_log2_weight_denom`` ++ - ++ * - struct :c:type:`v4l2_h264_weight_factors` ++ - ``weight_factors[2]`` ++ - The weight factors at index 0 are the weight factors for the reference ++ list 0, the one at index 1 for the reference list 1. ++ ++.. c:type:: v4l2_h264_weight_factors ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_h264_weight_factors ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __s16 ++ - ``luma_weight[32]`` ++ - ++ * - __s16 ++ - ``luma_offset[32]`` ++ - ++ * - __s16 ++ - ``chroma_weight[32][2]`` ++ - ++ * - __s16 ++ - ``chroma_offset[32][2]`` ++ - ++ ++``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (struct)`` ++ Specifies the decode parameters (as extracted from the bitstream) ++ for the associated H264 slice data. This includes the necessary ++ parameters for configuring a stateless hardware decoding pipeline ++ for H264. The bitstream parameters are defined according to ++ :ref:`h264`. For further documentation, refer to the above ++ specification, unless there is an explicit comment stating ++ otherwise. ++ ++ .. note:: ++ ++ This compound control is not yet part of the public kernel API and ++ it is expected to change. ++ ++.. c:type:: v4l2_ctrl_h264_decode_params ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_h264_decode_params ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u32 ++ - ``num_slices`` ++ - Number of slices needed to decode the current frame ++ * - __u32 ++ - ``nal_ref_idc`` ++ - NAL reference ID value coming from the NAL Unit header ++ * - __u8 ++ - ``ref_pic_list_p0[32]`` ++ - Backward reference list used by P-frames in the original bitstream order ++ * - __u8 ++ - ``ref_pic_list_b0[32]`` ++ - Backward reference list used by B-frames in the original bitstream order ++ * - __u8 ++ - ``ref_pic_list_b1[32]`` ++ - Forward reference list used by B-frames in the original bitstream order ++ * - __s32 ++ - ``top_field_order_cnt`` ++ - Picture Order Count for the coded top field ++ * - __s32 ++ - ``bottom_field_order_cnt`` ++ - Picture Order Count for the coded bottom field ++ * - __u32 ++ - ``flags`` ++ - See :ref:`Decode Parameters Flags ` ++ * - struct :c:type:`v4l2_h264_dpb_entry` ++ - ``dpb[16]`` ++ - ++ ++.. _h264_decode_params_flags: ++ ++``Decode Parameters Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC`` ++ - 0x00000001 ++ - That picture is an IDR picture ++ ++.. c:type:: v4l2_h264_dpb_entry ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_h264_dpb_entry ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u64 ++ - ``reference_ts`` ++ - Timestamp of the V4L2 capture buffer to use as reference, used ++ with B-coded and P-coded frames. The timestamp refers to the ++ ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the ++ :c:func:`v4l2_timeval_to_ns()` function to convert the struct ++ :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64. ++ * - __u16 ++ - ``frame_num`` ++ - ++ * - __u16 ++ - ``pic_num`` ++ - ++ * - __s32 ++ - ``top_field_order_cnt`` ++ - ++ * - __s32 ++ - ``bottom_field_order_cnt`` ++ - ++ * - __u32 ++ - ``flags`` ++ - See :ref:`DPB Entry Flags ` ++ ++.. _h264_dpb_flags: ++ ++``DPB Entries Flags`` ++ ++.. cssclass:: longtable ++ ++.. flat-table:: ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - ``V4L2_H264_DPB_ENTRY_FLAG_VALID`` ++ - 0x00000001 ++ - The DPB entry is valid and should be considered ++ * - ``V4L2_H264_DPB_ENTRY_FLAG_ACTIVE`` ++ - 0x00000002 ++ - The DPB entry is currently being used as a reference frame ++ * - ``V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM`` ++ - 0x00000004 ++ - The DPB entry is a long term reference frame + + .. _v4l2-mpeg-mpeg2: + +diff --git a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst +index f824162d0ea9..dc500632095d 100644 +--- a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst ++++ b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst +@@ -443,6 +443,36 @@ See also the examples in :ref:`control`. + - n/a + - A struct :c:type:`v4l2_ctrl_mpeg2_quantization`, containing MPEG-2 + quantization matrices for stateless video decoders. ++ * - ``V4L2_CTRL_TYPE_H264_SPS`` ++ - n/a ++ - n/a ++ - n/a ++ - A struct :c:type:`v4l2_ctrl_h264_sps`, containing H264 ++ sequence parameters for stateless video decoders. ++ * - ``V4L2_CTRL_TYPE_H264_PPS`` ++ - n/a ++ - n/a ++ - n/a ++ - A struct :c:type:`v4l2_ctrl_h264_pps`, containing H264 ++ picture parameters for stateless video decoders. ++ * - ``V4L2_CTRL_TYPE_H264_SCALING_MATRIX`` ++ - n/a ++ - n/a ++ - n/a ++ - A struct :c:type:`v4l2_ctrl_h264_scaling_matrix`, containing H264 ++ scaling matrices for stateless video decoders. ++ * - ``V4L2_CTRL_TYPE_H264_SLICE_PARAMS`` ++ - n/a ++ - n/a ++ - n/a ++ - A struct :c:type:`v4l2_ctrl_h264_slice_params`, containing H264 ++ slice parameters for stateless video decoders. ++ * - ``V4L2_CTRL_TYPE_H264_DECODE_PARAMS`` ++ - n/a ++ - n/a ++ - n/a ++ - A struct :c:type:`v4l2_ctrl_h264_decode_params`, containing H264 ++ decode parameters for stateless video decoders. + + .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| + +diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions +index 64d348e67df9..55cbe324b9fc 100644 +--- a/Documentation/media/videodev2.h.rst.exceptions ++++ b/Documentation/media/videodev2.h.rst.exceptions +@@ -136,6 +136,11 @@ replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type` + replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type` + replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type` + replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTIZATION :c:type:`v4l2_ctrl_type` ++replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type` ++replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type` ++replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type` ++replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`v4l2_ctrl_type` ++replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`v4l2_ctrl_type` + + # V4L2 capability defines + replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 3380accc24ed..b72dc54ba638 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -851,6 +851,11 @@ const char *v4l2_ctrl_get_name(u32 id) + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP: return "H264 I-Frame Maximum QP Value"; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP: return "H264 P-Frame Minimum QP Value"; + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP: return "H264 P-Frame Maximum QP Value"; ++ case V4L2_CID_MPEG_VIDEO_H264_SPS: return "H264 Sequence Parameter Set"; ++ case V4L2_CID_MPEG_VIDEO_H264_PPS: return "H264 Picture Parameter Set"; ++ case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX: return "H264 Scaling Matrix"; ++ case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS: return "H264 Slice Parameters"; ++ case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS: return "H264 Decode Parameters"; + case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL: return "MPEG2 Level"; + case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE: return "MPEG2 Profile"; + case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; +@@ -1337,6 +1342,21 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, + case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: + *type = V4L2_CTRL_TYPE_FWHT_PARAMS; + break; ++ case V4L2_CID_MPEG_VIDEO_H264_SPS: ++ *type = V4L2_CTRL_TYPE_H264_SPS; ++ break; ++ case V4L2_CID_MPEG_VIDEO_H264_PPS: ++ *type = V4L2_CTRL_TYPE_H264_PPS; ++ break; ++ case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX: ++ *type = V4L2_CTRL_TYPE_H264_SCALING_MATRIX; ++ break; ++ case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS: ++ *type = V4L2_CTRL_TYPE_H264_SLICE_PARAMS; ++ break; ++ case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS: ++ *type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS; ++ break; + default: + *type = V4L2_CTRL_TYPE_INTEGER; + break; +@@ -1706,6 +1726,13 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, + case V4L2_CTRL_TYPE_FWHT_PARAMS: + return 0; + ++ case V4L2_CTRL_TYPE_H264_SPS: ++ case V4L2_CTRL_TYPE_H264_PPS: ++ case V4L2_CTRL_TYPE_H264_SCALING_MATRIX: ++ case V4L2_CTRL_TYPE_H264_SLICE_PARAMS: ++ case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: ++ return 0; ++ + default: + return -EINVAL; + } +@@ -2289,6 +2316,21 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, + case V4L2_CTRL_TYPE_FWHT_PARAMS: + elem_size = sizeof(struct v4l2_ctrl_fwht_params); + break; ++ case V4L2_CTRL_TYPE_H264_SPS: ++ elem_size = sizeof(struct v4l2_ctrl_h264_sps); ++ break; ++ case V4L2_CTRL_TYPE_H264_PPS: ++ elem_size = sizeof(struct v4l2_ctrl_h264_pps); ++ break; ++ case V4L2_CTRL_TYPE_H264_SCALING_MATRIX: ++ elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix); ++ break; ++ case V4L2_CTRL_TYPE_H264_SLICE_PARAMS: ++ elem_size = sizeof(struct v4l2_ctrl_h264_slice_params); ++ break; ++ case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: ++ elem_size = sizeof(struct v4l2_ctrl_h264_decode_params); ++ break; + default: + if (type < V4L2_CTRL_COMPOUND_TYPES) + elem_size = sizeof(s32); +diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h +index ee026387f513..a8aede26491e 100644 +--- a/include/media/v4l2-ctrls.h ++++ b/include/media/v4l2-ctrls.h +@@ -23,11 +23,12 @@ + #include + + /* +- * Include the mpeg2 and fwht stateless codec compound control definitions. ++ * Include the stateless codec compound control definitions. + * This will move to the public headers once this API is fully stable. + */ + #include + #include ++#include + + /* forward references */ + struct file; +@@ -51,6 +52,11 @@ struct poll_table_struct; + * @p_mpeg2_slice_params: Pointer to a MPEG2 slice parameters structure. + * @p_mpeg2_quantization: Pointer to a MPEG2 quantization data structure. + * @p_fwht_params: Pointer to a FWHT stateless parameters structure. ++ * @p_h264_sps: Pointer to a struct v4l2_ctrl_h264_sps. ++ * @p_h264_pps: Pointer to a struct v4l2_ctrl_h264_pps. ++ * @p_h264_scaling_matrix: Pointer to a struct v4l2_ctrl_h264_scaling_matrix. ++ * @p_h264_slice_params: Pointer to a struct v4l2_ctrl_h264_slice_params. ++ * @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params. + * @p: Pointer to a compound value. + */ + union v4l2_ctrl_ptr { +@@ -63,6 +69,11 @@ union v4l2_ctrl_ptr { + struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; + struct v4l2_ctrl_mpeg2_quantization *p_mpeg2_quantization; + struct v4l2_ctrl_fwht_params *p_fwht_params; ++ struct v4l2_ctrl_h264_sps *p_h264_sps; ++ struct v4l2_ctrl_h264_pps *p_h264_pps; ++ struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix; ++ struct v4l2_ctrl_h264_slice_params *p_h264_slice_params; ++ struct v4l2_ctrl_h264_decode_params *p_h264_decode_params; + void *p; + }; + +-- +2.21.0 + +From 973e931fe8eefc32616f8eadadd0a018cbd096b5 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Fri, 24 May 2019 11:20:29 +0200 +Subject: [PATCH 06/12] media: pixfmt: Add H264 Slice format + +The H264_SLICE_RAW format is meant to hold the parsed slice data without +the start code. This will be needed by stateless decoders. + +Signed-off-by: Maxime Ripard +Signed-off-by: Hans Verkuil +--- + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + + include/media/h264-ctrls.h | 197 +++++++++++++++++++++++++++ + 2 files changed, 198 insertions(+) + create mode 100644 include/media/h264-ctrls.h + +diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c +index ac87c3e37280..f6e1254064d2 100644 +--- a/drivers/media/v4l2-core/v4l2-ioctl.c ++++ b/drivers/media/v4l2-core/v4l2-ioctl.c +@@ -1325,6 +1325,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) + case V4L2_PIX_FMT_H264: descr = "H.264"; break; + case V4L2_PIX_FMT_H264_NO_SC: descr = "H.264 (No Start Codes)"; break; + case V4L2_PIX_FMT_H264_MVC: descr = "H.264 MVC"; break; ++ case V4L2_PIX_FMT_H264_SLICE_RAW: descr = "H.264 Parsed Slice Data"; break; + case V4L2_PIX_FMT_H263: descr = "H.263"; break; + case V4L2_PIX_FMT_MPEG1: descr = "MPEG-1 ES"; break; + case V4L2_PIX_FMT_MPEG2: descr = "MPEG-2 ES"; break; +diff --git a/include/media/h264-ctrls.h b/include/media/h264-ctrls.h +new file mode 100644 +index 000000000000..e1404d78d6ff +--- /dev/null ++++ b/include/media/h264-ctrls.h +@@ -0,0 +1,197 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * These are the H.264 state controls for use with stateless H.264 ++ * codec drivers. ++ * ++ * It turns out that these structs are not stable yet and will undergo ++ * more changes. So keep them private until they are stable and ready to ++ * become part of the official public API. ++ */ ++ ++#ifndef _H264_CTRLS_H_ ++#define _H264_CTRLS_H_ ++ ++#include ++ ++/* Our pixel format isn't stable at the moment */ ++#define V4L2_PIX_FMT_H264_SLICE_RAW v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ ++ ++/* ++ * This is put insanely high to avoid conflicting with controls that ++ * would be added during the phase where those controls are not ++ * stable. It should be fixed eventually. ++ */ ++#define V4L2_CID_MPEG_VIDEO_H264_SPS (V4L2_CID_MPEG_BASE+1000) ++#define V4L2_CID_MPEG_VIDEO_H264_PPS (V4L2_CID_MPEG_BASE+1001) ++#define V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (V4L2_CID_MPEG_BASE+1002) ++#define V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (V4L2_CID_MPEG_BASE+1003) ++#define V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (V4L2_CID_MPEG_BASE+1004) ++ ++/* enum v4l2_ctrl_type type values */ ++#define V4L2_CTRL_TYPE_H264_SPS 0x0110 ++#define V4L2_CTRL_TYPE_H264_PPS 0x0111 ++#define V4L2_CTRL_TYPE_H264_SCALING_MATRIX 0x0112 ++#define V4L2_CTRL_TYPE_H264_SLICE_PARAMS 0x0113 ++#define V4L2_CTRL_TYPE_H264_DECODE_PARAMS 0x0114 ++ ++#define V4L2_H264_SPS_CONSTRAINT_SET0_FLAG 0x01 ++#define V4L2_H264_SPS_CONSTRAINT_SET1_FLAG 0x02 ++#define V4L2_H264_SPS_CONSTRAINT_SET2_FLAG 0x04 ++#define V4L2_H264_SPS_CONSTRAINT_SET3_FLAG 0x08 ++#define V4L2_H264_SPS_CONSTRAINT_SET4_FLAG 0x10 ++#define V4L2_H264_SPS_CONSTRAINT_SET5_FLAG 0x20 ++ ++#define V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE 0x01 ++#define V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS 0x02 ++#define V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO 0x04 ++#define V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED 0x08 ++#define V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY 0x10 ++#define V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD 0x20 ++#define V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE 0x40 ++ ++struct v4l2_ctrl_h264_sps { ++ __u8 profile_idc; ++ __u8 constraint_set_flags; ++ __u8 level_idc; ++ __u8 seq_parameter_set_id; ++ __u8 chroma_format_idc; ++ __u8 bit_depth_luma_minus8; ++ __u8 bit_depth_chroma_minus8; ++ __u8 log2_max_frame_num_minus4; ++ __u8 pic_order_cnt_type; ++ __u8 log2_max_pic_order_cnt_lsb_minus4; ++ __u8 max_num_ref_frames; ++ __u8 num_ref_frames_in_pic_order_cnt_cycle; ++ __s32 offset_for_ref_frame[255]; ++ __s32 offset_for_non_ref_pic; ++ __s32 offset_for_top_to_bottom_field; ++ __u16 pic_width_in_mbs_minus1; ++ __u16 pic_height_in_map_units_minus1; ++ __u32 flags; ++}; ++ ++#define V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE 0x0001 ++#define V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT 0x0002 ++#define V4L2_H264_PPS_FLAG_WEIGHTED_PRED 0x0004 ++#define V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT 0x0008 ++#define V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED 0x0010 ++#define V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT 0x0020 ++#define V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE 0x0040 ++#define V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT 0x0080 ++ ++struct v4l2_ctrl_h264_pps { ++ __u8 pic_parameter_set_id; ++ __u8 seq_parameter_set_id; ++ __u8 num_slice_groups_minus1; ++ __u8 num_ref_idx_l0_default_active_minus1; ++ __u8 num_ref_idx_l1_default_active_minus1; ++ __u8 weighted_bipred_idc; ++ __s8 pic_init_qp_minus26; ++ __s8 pic_init_qs_minus26; ++ __s8 chroma_qp_index_offset; ++ __s8 second_chroma_qp_index_offset; ++ __u16 flags; ++}; ++ ++struct v4l2_ctrl_h264_scaling_matrix { ++ __u8 scaling_list_4x4[6][16]; ++ __u8 scaling_list_8x8[6][64]; ++}; ++ ++struct v4l2_h264_weight_factors { ++ __s16 luma_weight[32]; ++ __s16 luma_offset[32]; ++ __s16 chroma_weight[32][2]; ++ __s16 chroma_offset[32][2]; ++}; ++ ++struct v4l2_h264_pred_weight_table { ++ __u16 luma_log2_weight_denom; ++ __u16 chroma_log2_weight_denom; ++ struct v4l2_h264_weight_factors weight_factors[2]; ++}; ++ ++#define V4L2_H264_SLICE_TYPE_P 0 ++#define V4L2_H264_SLICE_TYPE_B 1 ++#define V4L2_H264_SLICE_TYPE_I 2 ++#define V4L2_H264_SLICE_TYPE_SP 3 ++#define V4L2_H264_SLICE_TYPE_SI 4 ++ ++#define V4L2_H264_SLICE_FLAG_FIELD_PIC 0x01 ++#define V4L2_H264_SLICE_FLAG_BOTTOM_FIELD 0x02 ++#define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED 0x04 ++#define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH 0x08 ++ ++struct v4l2_ctrl_h264_slice_params { ++ /* Size in bytes, including header */ ++ __u32 size; ++ /* Offset in bits to slice_data() from the beginning of this slice. */ ++ __u32 header_bit_size; ++ ++ __u16 first_mb_in_slice; ++ __u8 slice_type; ++ __u8 pic_parameter_set_id; ++ __u8 colour_plane_id; ++ __u8 redundant_pic_cnt; ++ __u16 frame_num; ++ __u16 idr_pic_id; ++ __u16 pic_order_cnt_lsb; ++ __s32 delta_pic_order_cnt_bottom; ++ __s32 delta_pic_order_cnt0; ++ __s32 delta_pic_order_cnt1; ++ ++ struct v4l2_h264_pred_weight_table pred_weight_table; ++ /* Size in bits of dec_ref_pic_marking() syntax element. */ ++ __u32 dec_ref_pic_marking_bit_size; ++ /* Size in bits of pic order count syntax. */ ++ __u32 pic_order_cnt_bit_size; ++ ++ __u8 cabac_init_idc; ++ __s8 slice_qp_delta; ++ __s8 slice_qs_delta; ++ __u8 disable_deblocking_filter_idc; ++ __s8 slice_alpha_c0_offset_div2; ++ __s8 slice_beta_offset_div2; ++ __u8 num_ref_idx_l0_active_minus1; ++ __u8 num_ref_idx_l1_active_minus1; ++ __u32 slice_group_change_cycle; ++ ++ /* ++ * Entries on each list are indices into ++ * v4l2_ctrl_h264_decode_params.dpb[]. ++ */ ++ __u8 ref_pic_list0[32]; ++ __u8 ref_pic_list1[32]; ++ ++ __u32 flags; ++}; ++ ++#define V4L2_H264_DPB_ENTRY_FLAG_VALID 0x01 ++#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE 0x02 ++#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM 0x04 ++ ++struct v4l2_h264_dpb_entry { ++ __u64 reference_ts; ++ __u16 frame_num; ++ __u16 pic_num; ++ /* Note that field is indicated by v4l2_buffer.field */ ++ __s32 top_field_order_cnt; ++ __s32 bottom_field_order_cnt; ++ __u32 flags; /* V4L2_H264_DPB_ENTRY_FLAG_* */ ++}; ++ ++#define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC 0x01 ++ ++struct v4l2_ctrl_h264_decode_params { ++ struct v4l2_h264_dpb_entry dpb[16]; ++ __u16 num_slices; ++ __u16 nal_ref_idc; ++ __u8 ref_pic_list_p0[32]; ++ __u8 ref_pic_list_b0[32]; ++ __u8 ref_pic_list_b1[32]; ++ __s32 top_field_order_cnt; ++ __s32 bottom_field_order_cnt; ++ __u32 flags; /* V4L2_H264_DECODE_PARAM_FLAG_* */ ++}; ++ ++#endif +-- +2.21.0 + +From 129c7799b038de2a4fa90e6cff2bbb843187b06f Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Fri, 24 May 2019 11:20:30 +0200 +Subject: [PATCH 07/12] media: pixfmt: Add H264_SLICE_RAW format documentation + +The H264_SLICE_RAW format introduced before is meant for stateless +decoders that will need the H264 parsed slice data without the start code. + +Let's document it. + +Signed-off-by: Maxime Ripard +Signed-off-by: Hans Verkuil +--- + .../media/uapi/v4l/pixfmt-compressed.rst | 25 +++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/Documentation/media/uapi/v4l/pixfmt-compressed.rst b/Documentation/media/uapi/v4l/pixfmt-compressed.rst +index 6c961cfb74da..4b701fc7653e 100644 +--- a/Documentation/media/uapi/v4l/pixfmt-compressed.rst ++++ b/Documentation/media/uapi/v4l/pixfmt-compressed.rst +@@ -52,6 +52,31 @@ Compressed Formats + - ``V4L2_PIX_FMT_H264_MVC`` + - 'M264' + - H264 MVC video elementary stream. ++ * .. _V4L2-PIX-FMT-H264-SLICE-RAW: ++ ++ - ``V4L2_PIX_FMT_H264_SLICE_RAW`` ++ - 'S264' ++ - H264 parsed slice data, without the start code and as ++ extracted from the H264 bitstream. This format is adapted for ++ stateless video decoders that implement an H264 pipeline ++ (using the :ref:`mem2mem` and :ref:`media-request-api`). ++ Metadata associated with the frame to decode are required to ++ be passed through the ``V4L2_CID_MPEG_VIDEO_H264_SPS``, ++ ``V4L2_CID_MPEG_VIDEO_H264_PPS``, ++ ``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX``, ++ ``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS`` and ++ ``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS`` controls. See the ++ :ref:`associated Codec Control IDs `. Exactly ++ one output and one capture buffer must be provided for use ++ with this pixel format. The output buffer must contain the ++ appropriate number of macroblocks to decode a full ++ corresponding frame to the matching capture buffer. ++ ++ .. note:: ++ ++ This format is not yet part of the public kernel API and it ++ is expected to change. ++ + * .. _V4L2-PIX-FMT-H263: + + - ``V4L2_PIX_FMT_H263`` +-- +2.21.0 + +From 83b448edec51503daf61a823643a50db5e68cb15 Mon Sep 17 00:00:00 2001 +From: Maxime Ripard +Date: Fri, 24 May 2019 11:20:31 +0200 +Subject: [PATCH 08/12] media: cedrus: Add H264 decoding support + +Introduce some basic H264 decoding support in cedrus. So far, only the +baseline profile videos have been tested, and some more advanced features +used in higher profiles are not even implemented. + +Reviewed-by: Jernej Skrabec +Reviewed-by: Paul Kocialkowski +Signed-off-by: Maxime Ripard +Signed-off-by: Hans Verkuil +--- + drivers/staging/media/sunxi/cedrus/Makefile | 3 +- + drivers/staging/media/sunxi/cedrus/cedrus.c | 31 + + drivers/staging/media/sunxi/cedrus/cedrus.h | 38 +- + .../staging/media/sunxi/cedrus/cedrus_dec.c | 13 + + .../staging/media/sunxi/cedrus/cedrus_h264.c | 576 ++++++++++++++++++ + .../staging/media/sunxi/cedrus/cedrus_hw.c | 4 + + .../staging/media/sunxi/cedrus/cedrus_regs.h | 91 +++ + .../staging/media/sunxi/cedrus/cedrus_video.c | 9 + + 8 files changed, 763 insertions(+), 2 deletions(-) + create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_h264.c + +diff --git a/drivers/staging/media/sunxi/cedrus/Makefile b/drivers/staging/media/sunxi/cedrus/Makefile +index 808842f0119e..c85ac6db0302 100644 +--- a/drivers/staging/media/sunxi/cedrus/Makefile ++++ b/drivers/staging/media/sunxi/cedrus/Makefile +@@ -1,4 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 + obj-$(CONFIG_VIDEO_SUNXI_CEDRUS) += sunxi-cedrus.o + +-sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o cedrus_mpeg2.o ++sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o \ ++ cedrus_mpeg2.o cedrus_h264.o +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c +index 9349a082a29c..370937edfc14 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus.c +@@ -40,6 +40,36 @@ static const struct cedrus_control cedrus_controls[] = { + .codec = CEDRUS_CODEC_MPEG2, + .required = false, + }, ++ { ++ .id = V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS, ++ .elem_size = sizeof(struct v4l2_ctrl_h264_decode_params), ++ .codec = CEDRUS_CODEC_H264, ++ .required = true, ++ }, ++ { ++ .id = V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS, ++ .elem_size = sizeof(struct v4l2_ctrl_h264_slice_params), ++ .codec = CEDRUS_CODEC_H264, ++ .required = true, ++ }, ++ { ++ .id = V4L2_CID_MPEG_VIDEO_H264_SPS, ++ .elem_size = sizeof(struct v4l2_ctrl_h264_sps), ++ .codec = CEDRUS_CODEC_H264, ++ .required = true, ++ }, ++ { ++ .id = V4L2_CID_MPEG_VIDEO_H264_PPS, ++ .elem_size = sizeof(struct v4l2_ctrl_h264_pps), ++ .codec = CEDRUS_CODEC_H264, ++ .required = true, ++ }, ++ { ++ .id = V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX, ++ .elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix), ++ .codec = CEDRUS_CODEC_H264, ++ .required = true, ++ }, + }; + + #define CEDRUS_CONTROLS_COUNT ARRAY_SIZE(cedrus_controls) +@@ -278,6 +308,7 @@ static int cedrus_probe(struct platform_device *pdev) + } + + dev->dec_ops[CEDRUS_CODEC_MPEG2] = &cedrus_dec_ops_mpeg2; ++ dev->dec_ops[CEDRUS_CODEC_H264] = &cedrus_dec_ops_h264; + + mutex_init(&dev->dev_mutex); + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h +index 25ee1f80f2c7..3f476d0fd981 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus.h ++++ b/drivers/staging/media/sunxi/cedrus/cedrus.h +@@ -32,7 +32,7 @@ + + enum cedrus_codec { + CEDRUS_CODEC_MPEG2, +- ++ CEDRUS_CODEC_H264, + CEDRUS_CODEC_LAST, + }; + +@@ -42,6 +42,12 @@ enum cedrus_irq_status { + CEDRUS_IRQ_OK, + }; + ++enum cedrus_h264_pic_type { ++ CEDRUS_H264_PIC_TYPE_FRAME = 0, ++ CEDRUS_H264_PIC_TYPE_FIELD, ++ CEDRUS_H264_PIC_TYPE_MBAFF, ++}; ++ + struct cedrus_control { + u32 id; + u32 elem_size; +@@ -49,6 +55,14 @@ struct cedrus_control { + unsigned char required:1; + }; + ++struct cedrus_h264_run { ++ const struct v4l2_ctrl_h264_decode_params *decode_params; ++ const struct v4l2_ctrl_h264_pps *pps; ++ const struct v4l2_ctrl_h264_scaling_matrix *scaling_matrix; ++ const struct v4l2_ctrl_h264_slice_params *slice_params; ++ const struct v4l2_ctrl_h264_sps *sps; ++}; ++ + struct cedrus_mpeg2_run { + const struct v4l2_ctrl_mpeg2_slice_params *slice_params; + const struct v4l2_ctrl_mpeg2_quantization *quantization; +@@ -59,12 +73,20 @@ struct cedrus_run { + struct vb2_v4l2_buffer *dst; + + union { ++ struct cedrus_h264_run h264; + struct cedrus_mpeg2_run mpeg2; + }; + }; + + struct cedrus_buffer { + struct v4l2_m2m_buffer m2m_buf; ++ ++ union { ++ struct { ++ unsigned int position; ++ enum cedrus_h264_pic_type pic_type; ++ } h264; ++ } codec; + }; + + struct cedrus_ctx { +@@ -79,6 +101,19 @@ struct cedrus_ctx { + struct v4l2_ctrl **ctrls; + + struct vb2_buffer *dst_bufs[VIDEO_MAX_FRAME]; ++ ++ union { ++ struct { ++ void *mv_col_buf; ++ dma_addr_t mv_col_buf_dma; ++ ssize_t mv_col_buf_field_size; ++ ssize_t mv_col_buf_size; ++ void *pic_info_buf; ++ dma_addr_t pic_info_buf_dma; ++ void *neighbor_info_buf; ++ dma_addr_t neighbor_info_buf_dma; ++ } h264; ++ } codec; + }; + + struct cedrus_dec_ops { +@@ -122,6 +157,7 @@ struct cedrus_dev { + }; + + extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2; ++extern struct cedrus_dec_ops cedrus_dec_ops_h264; + + static inline void cedrus_write(struct cedrus_dev *dev, u32 reg, u32 val) + { +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c +index 4d6d602cdde6..bdad87eb9d79 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c +@@ -46,6 +46,19 @@ void cedrus_device_run(void *priv) + V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION); + break; + ++ case V4L2_PIX_FMT_H264_SLICE_RAW: ++ run.h264.decode_params = cedrus_find_control_data(ctx, ++ V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS); ++ run.h264.pps = cedrus_find_control_data(ctx, ++ V4L2_CID_MPEG_VIDEO_H264_PPS); ++ run.h264.scaling_matrix = cedrus_find_control_data(ctx, ++ V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX); ++ run.h264.slice_params = cedrus_find_control_data(ctx, ++ V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS); ++ run.h264.sps = cedrus_find_control_data(ctx, ++ V4L2_CID_MPEG_VIDEO_H264_SPS); ++ break; ++ + default: + break; + } +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +new file mode 100644 +index 000000000000..a30bb283f69f +--- /dev/null ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +@@ -0,0 +1,576 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * Cedrus VPU driver ++ * ++ * Copyright (c) 2013 Jens Kuske ++ * Copyright (c) 2018 Bootlin ++ */ ++ ++#include ++ ++#include ++ ++#include "cedrus.h" ++#include "cedrus_hw.h" ++#include "cedrus_regs.h" ++ ++enum cedrus_h264_sram_off { ++ CEDRUS_SRAM_H264_PRED_WEIGHT_TABLE = 0x000, ++ CEDRUS_SRAM_H264_FRAMEBUFFER_LIST = 0x100, ++ CEDRUS_SRAM_H264_REF_LIST_0 = 0x190, ++ CEDRUS_SRAM_H264_REF_LIST_1 = 0x199, ++ CEDRUS_SRAM_H264_SCALING_LIST_8x8_0 = 0x200, ++ CEDRUS_SRAM_H264_SCALING_LIST_8x8_1 = 0x210, ++ CEDRUS_SRAM_H264_SCALING_LIST_4x4 = 0x220, ++}; ++ ++struct cedrus_h264_sram_ref_pic { ++ __le32 top_field_order_cnt; ++ __le32 bottom_field_order_cnt; ++ __le32 frame_info; ++ __le32 luma_ptr; ++ __le32 chroma_ptr; ++ __le32 mv_col_top_ptr; ++ __le32 mv_col_bot_ptr; ++ __le32 reserved; ++} __packed; ++ ++#define CEDRUS_H264_FRAME_NUM 18 ++ ++#define CEDRUS_NEIGHBOR_INFO_BUF_SIZE (16 * SZ_1K) ++#define CEDRUS_PIC_INFO_BUF_SIZE (128 * SZ_1K) ++ ++static void cedrus_h264_write_sram(struct cedrus_dev *dev, ++ enum cedrus_h264_sram_off off, ++ const void *data, size_t len) ++{ ++ const u32 *buffer = data; ++ size_t count = DIV_ROUND_UP(len, 4); ++ ++ cedrus_write(dev, VE_AVC_SRAM_PORT_OFFSET, off << 2); ++ ++ while (count--) ++ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, *buffer++); ++} ++ ++static dma_addr_t cedrus_h264_mv_col_buf_addr(struct cedrus_ctx *ctx, ++ unsigned int position, ++ unsigned int field) ++{ ++ dma_addr_t addr = ctx->codec.h264.mv_col_buf_dma; ++ ++ /* Adjust for the position */ ++ addr += position * ctx->codec.h264.mv_col_buf_field_size * 2; ++ ++ /* Adjust for the field */ ++ addr += field * ctx->codec.h264.mv_col_buf_field_size; ++ ++ return addr; ++} ++ ++static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx, ++ struct cedrus_buffer *buf, ++ unsigned int top_field_order_cnt, ++ unsigned int bottom_field_order_cnt, ++ struct cedrus_h264_sram_ref_pic *pic) ++{ ++ struct vb2_buffer *vbuf = &buf->m2m_buf.vb.vb2_buf; ++ unsigned int position = buf->codec.h264.position; ++ ++ pic->top_field_order_cnt = cpu_to_le32(top_field_order_cnt); ++ pic->bottom_field_order_cnt = cpu_to_le32(bottom_field_order_cnt); ++ pic->frame_info = cpu_to_le32(buf->codec.h264.pic_type << 8); ++ ++ pic->luma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0)); ++ pic->chroma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1)); ++ pic->mv_col_top_ptr = ++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 0)); ++ pic->mv_col_bot_ptr = ++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 1)); ++} ++ ++static void cedrus_write_frame_list(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ struct cedrus_h264_sram_ref_pic pic_list[CEDRUS_H264_FRAME_NUM]; ++ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; ++ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; ++ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; ++ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; ++ struct cedrus_buffer *output_buf; ++ struct cedrus_dev *dev = ctx->dev; ++ unsigned long used_dpbs = 0; ++ unsigned int position; ++ unsigned int output = 0; ++ unsigned int i; ++ ++ memset(pic_list, 0, sizeof(pic_list)); ++ ++ for (i = 0; i < ARRAY_SIZE(decode->dpb); i++) { ++ const struct v4l2_h264_dpb_entry *dpb = &decode->dpb[i]; ++ struct cedrus_buffer *cedrus_buf; ++ int buf_idx; ++ ++ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID)) ++ continue; ++ ++ buf_idx = vb2_find_timestamp(cap_q, dpb->reference_ts, 0); ++ if (buf_idx < 0) ++ continue; ++ ++ cedrus_buf = vb2_to_cedrus_buffer(ctx->dst_bufs[buf_idx]); ++ position = cedrus_buf->codec.h264.position; ++ used_dpbs |= BIT(position); ++ ++ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) ++ continue; ++ ++ cedrus_fill_ref_pic(ctx, cedrus_buf, ++ dpb->top_field_order_cnt, ++ dpb->bottom_field_order_cnt, ++ &pic_list[position]); ++ ++ output = max(position, output); ++ } ++ ++ position = find_next_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM, ++ output); ++ if (position >= CEDRUS_H264_FRAME_NUM) ++ position = find_first_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM); ++ ++ output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf); ++ output_buf->codec.h264.position = position; ++ ++ if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) ++ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FIELD; ++ else if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) ++ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_MBAFF; ++ else ++ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FRAME; ++ ++ cedrus_fill_ref_pic(ctx, output_buf, ++ decode->top_field_order_cnt, ++ decode->bottom_field_order_cnt, ++ &pic_list[position]); ++ ++ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_FRAMEBUFFER_LIST, ++ pic_list, sizeof(pic_list)); ++ ++ cedrus_write(dev, VE_H264_OUTPUT_FRAME_IDX, position); ++} ++ ++#define CEDRUS_MAX_REF_IDX 32 ++ ++static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, ++ struct cedrus_run *run, ++ const u8 *ref_list, u8 num_ref, ++ enum cedrus_h264_sram_off sram) ++{ ++ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; ++ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; ++ struct cedrus_dev *dev = ctx->dev; ++ u8 sram_array[CEDRUS_MAX_REF_IDX]; ++ unsigned int i; ++ size_t size; ++ ++ memset(sram_array, 0, sizeof(sram_array)); ++ ++ for (i = 0; i < num_ref; i++) { ++ const struct v4l2_h264_dpb_entry *dpb; ++ const struct cedrus_buffer *cedrus_buf; ++ const struct vb2_v4l2_buffer *ref_buf; ++ unsigned int position; ++ int buf_idx; ++ u8 dpb_idx; ++ ++ dpb_idx = ref_list[i]; ++ dpb = &decode->dpb[dpb_idx]; ++ ++ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) ++ continue; ++ ++ buf_idx = vb2_find_timestamp(cap_q, dpb->reference_ts, 0); ++ if (buf_idx < 0) ++ continue; ++ ++ ref_buf = to_vb2_v4l2_buffer(ctx->dst_bufs[buf_idx]); ++ cedrus_buf = vb2_v4l2_to_cedrus_buffer(ref_buf); ++ position = cedrus_buf->codec.h264.position; ++ ++ sram_array[i] |= position << 1; ++ if (ref_buf->field == V4L2_FIELD_BOTTOM) ++ sram_array[i] |= BIT(0); ++ } ++ ++ size = min_t(size_t, ALIGN(num_ref, 4), sizeof(sram_array)); ++ cedrus_h264_write_sram(dev, sram, &sram_array, size); ++} ++ ++static void cedrus_write_ref_list0(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; ++ ++ _cedrus_write_ref_list(ctx, run, ++ slice->ref_pic_list0, ++ slice->num_ref_idx_l0_active_minus1 + 1, ++ CEDRUS_SRAM_H264_REF_LIST_0); ++} ++ ++static void cedrus_write_ref_list1(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; ++ ++ _cedrus_write_ref_list(ctx, run, ++ slice->ref_pic_list1, ++ slice->num_ref_idx_l1_active_minus1 + 1, ++ CEDRUS_SRAM_H264_REF_LIST_1); ++} ++ ++static void cedrus_write_scaling_lists(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ const struct v4l2_ctrl_h264_scaling_matrix *scaling = ++ run->h264.scaling_matrix; ++ struct cedrus_dev *dev = ctx->dev; ++ ++ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_0, ++ scaling->scaling_list_8x8[0], ++ sizeof(scaling->scaling_list_8x8[0])); ++ ++ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_1, ++ scaling->scaling_list_8x8[3], ++ sizeof(scaling->scaling_list_8x8[3])); ++ ++ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_4x4, ++ scaling->scaling_list_4x4, ++ sizeof(scaling->scaling_list_4x4)); ++} ++ ++static void cedrus_write_pred_weight_table(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ const struct v4l2_ctrl_h264_slice_params *slice = ++ run->h264.slice_params; ++ const struct v4l2_h264_pred_weight_table *pred_weight = ++ &slice->pred_weight_table; ++ struct cedrus_dev *dev = ctx->dev; ++ int i, j, k; ++ ++ cedrus_write(dev, VE_H264_SHS_WP, ++ ((pred_weight->chroma_log2_weight_denom & 0x7) << 4) | ++ ((pred_weight->luma_log2_weight_denom & 0x7) << 0)); ++ ++ cedrus_write(dev, VE_AVC_SRAM_PORT_OFFSET, ++ CEDRUS_SRAM_H264_PRED_WEIGHT_TABLE << 2); ++ ++ for (i = 0; i < ARRAY_SIZE(pred_weight->weight_factors); i++) { ++ const struct v4l2_h264_weight_factors *factors = ++ &pred_weight->weight_factors[i]; ++ ++ for (j = 0; j < ARRAY_SIZE(factors->luma_weight); j++) { ++ u32 val; ++ ++ val = (((u32)factors->luma_offset[j] & 0x1ff) << 16) | ++ (factors->luma_weight[j] & 0x1ff); ++ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, val); ++ } ++ ++ for (j = 0; j < ARRAY_SIZE(factors->chroma_weight); j++) { ++ for (k = 0; k < ARRAY_SIZE(factors->chroma_weight[0]); k++) { ++ u32 val; ++ ++ val = (((u32)factors->chroma_offset[j][k] & 0x1ff) << 16) | ++ (factors->chroma_weight[j][k] & 0x1ff); ++ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, val); ++ } ++ } ++ } ++} ++ ++static void cedrus_set_params(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; ++ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; ++ const struct v4l2_ctrl_h264_pps *pps = run->h264.pps; ++ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; ++ struct vb2_buffer *src_buf = &run->src->vb2_buf; ++ struct cedrus_dev *dev = ctx->dev; ++ dma_addr_t src_buf_addr; ++ u32 offset = slice->header_bit_size; ++ u32 len = (slice->size * 8) - offset; ++ u32 reg; ++ ++ cedrus_write(dev, VE_H264_VLD_LEN, len); ++ cedrus_write(dev, VE_H264_VLD_OFFSET, offset); ++ ++ src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); ++ cedrus_write(dev, VE_H264_VLD_END, ++ src_buf_addr + vb2_get_plane_payload(src_buf, 0)); ++ cedrus_write(dev, VE_H264_VLD_ADDR, ++ VE_H264_VLD_ADDR_VAL(src_buf_addr) | ++ VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID | ++ VE_H264_VLD_ADDR_LAST); ++ ++ /* ++ * FIXME: Since the bitstream parsing is done in software, and ++ * in userspace, this shouldn't be needed anymore. But it ++ * turns out that removing it breaks the decoding process, ++ * without any clear indication why. ++ */ ++ cedrus_write(dev, VE_H264_TRIGGER_TYPE, ++ VE_H264_TRIGGER_TYPE_INIT_SWDEC); ++ ++ if (((pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) && ++ (slice->slice_type == V4L2_H264_SLICE_TYPE_P || ++ slice->slice_type == V4L2_H264_SLICE_TYPE_SP)) || ++ (pps->weighted_bipred_idc == 1 && ++ slice->slice_type == V4L2_H264_SLICE_TYPE_B)) ++ cedrus_write_pred_weight_table(ctx, run); ++ ++ if ((slice->slice_type == V4L2_H264_SLICE_TYPE_P) || ++ (slice->slice_type == V4L2_H264_SLICE_TYPE_SP) || ++ (slice->slice_type == V4L2_H264_SLICE_TYPE_B)) ++ cedrus_write_ref_list0(ctx, run); ++ ++ if (slice->slice_type == V4L2_H264_SLICE_TYPE_B) ++ cedrus_write_ref_list1(ctx, run); ++ ++ // picture parameters ++ reg = 0; ++ /* ++ * FIXME: the kernel headers are allowing the default value to ++ * be passed, but the libva doesn't give us that. ++ */ ++ reg |= (slice->num_ref_idx_l0_active_minus1 & 0x1f) << 10; ++ reg |= (slice->num_ref_idx_l1_active_minus1 & 0x1f) << 5; ++ reg |= (pps->weighted_bipred_idc & 0x3) << 2; ++ if (pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE) ++ reg |= VE_H264_PPS_ENTROPY_CODING_MODE; ++ if (pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) ++ reg |= VE_H264_PPS_WEIGHTED_PRED; ++ if (pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED) ++ reg |= VE_H264_PPS_CONSTRAINED_INTRA_PRED; ++ if (pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE) ++ reg |= VE_H264_PPS_TRANSFORM_8X8_MODE; ++ cedrus_write(dev, VE_H264_PPS, reg); ++ ++ // sequence parameters ++ reg = 0; ++ reg |= (sps->chroma_format_idc & 0x7) << 19; ++ reg |= (sps->pic_width_in_mbs_minus1 & 0xff) << 8; ++ reg |= sps->pic_height_in_map_units_minus1 & 0xff; ++ if (sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) ++ reg |= VE_H264_SPS_MBS_ONLY; ++ if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) ++ reg |= VE_H264_SPS_MB_ADAPTIVE_FRAME_FIELD; ++ if (sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE) ++ reg |= VE_H264_SPS_DIRECT_8X8_INFERENCE; ++ cedrus_write(dev, VE_H264_SPS, reg); ++ ++ // slice parameters ++ reg = 0; ++ reg |= decode->nal_ref_idc ? BIT(12) : 0; ++ reg |= (slice->slice_type & 0xf) << 8; ++ reg |= slice->cabac_init_idc & 0x3; ++ reg |= VE_H264_SHS_FIRST_SLICE_IN_PIC; ++ if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) ++ reg |= VE_H264_SHS_FIELD_PIC; ++ if (slice->flags & V4L2_H264_SLICE_FLAG_BOTTOM_FIELD) ++ reg |= VE_H264_SHS_BOTTOM_FIELD; ++ if (slice->flags & V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED) ++ reg |= VE_H264_SHS_DIRECT_SPATIAL_MV_PRED; ++ cedrus_write(dev, VE_H264_SHS, reg); ++ ++ reg = 0; ++ reg |= VE_H264_SHS2_NUM_REF_IDX_ACTIVE_OVRD; ++ reg |= (slice->num_ref_idx_l0_active_minus1 & 0x1f) << 24; ++ reg |= (slice->num_ref_idx_l1_active_minus1 & 0x1f) << 16; ++ reg |= (slice->disable_deblocking_filter_idc & 0x3) << 8; ++ reg |= (slice->slice_alpha_c0_offset_div2 & 0xf) << 4; ++ reg |= slice->slice_beta_offset_div2 & 0xf; ++ cedrus_write(dev, VE_H264_SHS2, reg); ++ ++ reg = 0; ++ reg |= (pps->second_chroma_qp_index_offset & 0x3f) << 16; ++ reg |= (pps->chroma_qp_index_offset & 0x3f) << 8; ++ reg |= (pps->pic_init_qp_minus26 + 26 + slice->slice_qp_delta) & 0x3f; ++ cedrus_write(dev, VE_H264_SHS_QP, reg); ++ ++ // clear status flags ++ cedrus_write(dev, VE_H264_STATUS, cedrus_read(dev, VE_H264_STATUS)); ++ ++ // enable int ++ cedrus_write(dev, VE_H264_CTRL, ++ VE_H264_CTRL_SLICE_DECODE_INT | ++ VE_H264_CTRL_DECODE_ERR_INT | ++ VE_H264_CTRL_VLD_DATA_REQ_INT); ++} ++ ++static enum cedrus_irq_status ++cedrus_h264_irq_status(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ u32 reg = cedrus_read(dev, VE_H264_STATUS); ++ ++ if (reg & (VE_H264_STATUS_DECODE_ERR_INT | ++ VE_H264_STATUS_VLD_DATA_REQ_INT)) ++ return CEDRUS_IRQ_ERROR; ++ ++ if (reg & VE_H264_CTRL_SLICE_DECODE_INT) ++ return CEDRUS_IRQ_OK; ++ ++ return CEDRUS_IRQ_NONE; ++} ++ ++static void cedrus_h264_irq_clear(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ ++ cedrus_write(dev, VE_H264_STATUS, ++ VE_H264_STATUS_INT_MASK); ++} ++ ++static void cedrus_h264_irq_disable(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ u32 reg = cedrus_read(dev, VE_H264_CTRL); ++ ++ cedrus_write(dev, VE_H264_CTRL, ++ reg & ~VE_H264_CTRL_INT_MASK); ++} ++ ++static void cedrus_h264_setup(struct cedrus_ctx *ctx, ++ struct cedrus_run *run) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ ++ cedrus_engine_enable(dev, CEDRUS_CODEC_H264); ++ ++ cedrus_write(dev, VE_H264_SDROT_CTRL, 0); ++ cedrus_write(dev, VE_H264_EXTRA_BUFFER1, ++ ctx->codec.h264.pic_info_buf_dma); ++ cedrus_write(dev, VE_H264_EXTRA_BUFFER2, ++ ctx->codec.h264.neighbor_info_buf_dma); ++ ++ cedrus_write_scaling_lists(ctx, run); ++ cedrus_write_frame_list(ctx, run); ++ ++ cedrus_set_params(ctx, run); ++} ++ ++static int cedrus_h264_start(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ unsigned int field_size; ++ unsigned int mv_col_size; ++ int ret; ++ ++ /* ++ * FIXME: It seems that the H6 cedarX code is using a formula ++ * here based on the size of the frame, while all the older ++ * code is using a fixed size, so that might need to be ++ * changed at some point. ++ */ ++ ctx->codec.h264.pic_info_buf = ++ dma_alloc_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, ++ &ctx->codec.h264.pic_info_buf_dma, ++ GFP_KERNEL); ++ if (!ctx->codec.h264.pic_info_buf) ++ return -ENOMEM; ++ ++ /* ++ * That buffer is supposed to be 16kiB in size, and be aligned ++ * on 16kiB as well. However, dma_alloc_coherent provides the ++ * guarantee that we'll have a CPU and DMA address aligned on ++ * the smallest page order that is greater to the requested ++ * size, so we don't have to overallocate. ++ */ ++ ctx->codec.h264.neighbor_info_buf = ++ dma_alloc_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, ++ &ctx->codec.h264.neighbor_info_buf_dma, ++ GFP_KERNEL); ++ if (!ctx->codec.h264.neighbor_info_buf) { ++ ret = -ENOMEM; ++ goto err_pic_buf; ++ } ++ ++ field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) * ++ DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16; ++ ++ /* ++ * FIXME: This is actually conditional to ++ * V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE not being set, we ++ * might have to rework this if memory efficiency ever is ++ * something we need to work on. ++ */ ++ field_size = field_size * 2; ++ ++ /* ++ * FIXME: This is actually conditional to ++ * V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY not being set, we might ++ * have to rework this if memory efficiency ever is something ++ * we need to work on. ++ */ ++ field_size = field_size * 2; ++ ctx->codec.h264.mv_col_buf_field_size = field_size; ++ ++ mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM; ++ ctx->codec.h264.mv_col_buf_size = mv_col_size; ++ ctx->codec.h264.mv_col_buf = dma_alloc_coherent(dev->dev, ++ ctx->codec.h264.mv_col_buf_size, ++ &ctx->codec.h264.mv_col_buf_dma, ++ GFP_KERNEL); ++ if (!ctx->codec.h264.mv_col_buf) { ++ ret = -ENOMEM; ++ goto err_neighbor_buf; ++ } ++ ++ return 0; ++ ++err_neighbor_buf: ++ dma_free_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, ++ ctx->codec.h264.neighbor_info_buf, ++ ctx->codec.h264.neighbor_info_buf_dma); ++ ++err_pic_buf: ++ dma_free_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, ++ ctx->codec.h264.pic_info_buf, ++ ctx->codec.h264.pic_info_buf_dma); ++ return ret; ++} ++ ++static void cedrus_h264_stop(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ ++ dma_free_coherent(dev->dev, ctx->codec.h264.mv_col_buf_size, ++ ctx->codec.h264.mv_col_buf, ++ ctx->codec.h264.mv_col_buf_dma); ++ dma_free_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, ++ ctx->codec.h264.neighbor_info_buf, ++ ctx->codec.h264.neighbor_info_buf_dma); ++ dma_free_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, ++ ctx->codec.h264.pic_info_buf, ++ ctx->codec.h264.pic_info_buf_dma); ++} ++ ++static void cedrus_h264_trigger(struct cedrus_ctx *ctx) ++{ ++ struct cedrus_dev *dev = ctx->dev; ++ ++ cedrus_write(dev, VE_H264_TRIGGER_TYPE, ++ VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE); ++} ++ ++struct cedrus_dec_ops cedrus_dec_ops_h264 = { ++ .irq_clear = cedrus_h264_irq_clear, ++ .irq_disable = cedrus_h264_irq_disable, ++ .irq_status = cedrus_h264_irq_status, ++ .setup = cedrus_h264_setup, ++ .start = cedrus_h264_start, ++ .stop = cedrus_h264_stop, ++ .trigger = cedrus_h264_trigger, ++}; +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +index 60406b2d4595..c34aec7c6e40 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +@@ -46,6 +46,10 @@ int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec) + reg |= VE_MODE_DEC_MPEG; + break; + ++ case CEDRUS_CODEC_H264: ++ reg |= VE_MODE_DEC_H264; ++ break; ++ + default: + return -EINVAL; + } +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +index de2d6b6f64bf..3e9931416e45 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +@@ -232,4 +232,95 @@ + #define VE_DEC_MPEG_ROT_LUMA (VE_ENGINE_DEC_MPEG + 0xcc) + #define VE_DEC_MPEG_ROT_CHROMA (VE_ENGINE_DEC_MPEG + 0xd0) + ++#define VE_H264_SPS 0x200 ++#define VE_H264_SPS_MBS_ONLY BIT(18) ++#define VE_H264_SPS_MB_ADAPTIVE_FRAME_FIELD BIT(17) ++#define VE_H264_SPS_DIRECT_8X8_INFERENCE BIT(16) ++ ++#define VE_H264_PPS 0x204 ++#define VE_H264_PPS_ENTROPY_CODING_MODE BIT(15) ++#define VE_H264_PPS_WEIGHTED_PRED BIT(4) ++#define VE_H264_PPS_CONSTRAINED_INTRA_PRED BIT(1) ++#define VE_H264_PPS_TRANSFORM_8X8_MODE BIT(0) ++ ++#define VE_H264_SHS 0x208 ++#define VE_H264_SHS_FIRST_SLICE_IN_PIC BIT(5) ++#define VE_H264_SHS_FIELD_PIC BIT(4) ++#define VE_H264_SHS_BOTTOM_FIELD BIT(3) ++#define VE_H264_SHS_DIRECT_SPATIAL_MV_PRED BIT(2) ++ ++#define VE_H264_SHS2 0x20c ++#define VE_H264_SHS2_NUM_REF_IDX_ACTIVE_OVRD BIT(12) ++ ++#define VE_H264_SHS_WP 0x210 ++ ++#define VE_H264_SHS_QP 0x21c ++#define VE_H264_SHS_QP_SCALING_MATRIX_DEFAULT BIT(24) ++ ++#define VE_H264_CTRL 0x220 ++#define VE_H264_CTRL_VLD_DATA_REQ_INT BIT(2) ++#define VE_H264_CTRL_DECODE_ERR_INT BIT(1) ++#define VE_H264_CTRL_SLICE_DECODE_INT BIT(0) ++ ++#define VE_H264_CTRL_INT_MASK (VE_H264_CTRL_VLD_DATA_REQ_INT | \ ++ VE_H264_CTRL_DECODE_ERR_INT | \ ++ VE_H264_CTRL_SLICE_DECODE_INT) ++ ++#define VE_H264_TRIGGER_TYPE 0x224 ++#define VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE (8 << 0) ++#define VE_H264_TRIGGER_TYPE_INIT_SWDEC (7 << 0) ++ ++#define VE_H264_STATUS 0x228 ++#define VE_H264_STATUS_VLD_DATA_REQ_INT VE_H264_CTRL_VLD_DATA_REQ_INT ++#define VE_H264_STATUS_DECODE_ERR_INT VE_H264_CTRL_DECODE_ERR_INT ++#define VE_H264_STATUS_SLICE_DECODE_INT VE_H264_CTRL_SLICE_DECODE_INT ++ ++#define VE_H264_STATUS_INT_MASK VE_H264_CTRL_INT_MASK ++ ++#define VE_H264_CUR_MB_NUM 0x22c ++ ++#define VE_H264_VLD_ADDR 0x230 ++#define VE_H264_VLD_ADDR_FIRST BIT(30) ++#define VE_H264_VLD_ADDR_LAST BIT(29) ++#define VE_H264_VLD_ADDR_VALID BIT(28) ++#define VE_H264_VLD_ADDR_VAL(x) (((x) & 0x0ffffff0) | ((x) >> 28)) ++ ++#define VE_H264_VLD_OFFSET 0x234 ++#define VE_H264_VLD_LEN 0x238 ++#define VE_H264_VLD_END 0x23c ++#define VE_H264_SDROT_CTRL 0x240 ++#define VE_H264_OUTPUT_FRAME_IDX 0x24c ++#define VE_H264_EXTRA_BUFFER1 0x250 ++#define VE_H264_EXTRA_BUFFER2 0x254 ++#define VE_H264_BASIC_BITS 0x2dc ++#define VE_AVC_SRAM_PORT_OFFSET 0x2e0 ++#define VE_AVC_SRAM_PORT_DATA 0x2e4 ++ ++#define VE_ISP_INPUT_SIZE 0xa00 ++#define VE_ISP_INPUT_STRIDE 0xa04 ++#define VE_ISP_CTRL 0xa08 ++#define VE_ISP_INPUT_LUMA 0xa78 ++#define VE_ISP_INPUT_CHROMA 0xa7c ++ ++#define VE_AVC_PARAM 0xb04 ++#define VE_AVC_QP 0xb08 ++#define VE_AVC_MOTION_EST 0xb10 ++#define VE_AVC_CTRL 0xb14 ++#define VE_AVC_TRIGGER 0xb18 ++#define VE_AVC_STATUS 0xb1c ++#define VE_AVC_BASIC_BITS 0xb20 ++#define VE_AVC_UNK_BUF 0xb60 ++#define VE_AVC_VLE_ADDR 0xb80 ++#define VE_AVC_VLE_END 0xb84 ++#define VE_AVC_VLE_OFFSET 0xb88 ++#define VE_AVC_VLE_MAX 0xb8c ++#define VE_AVC_VLE_LENGTH 0xb90 ++#define VE_AVC_REF_LUMA 0xba0 ++#define VE_AVC_REF_CHROMA 0xba4 ++#define VE_AVC_REC_LUMA 0xbb0 ++#define VE_AVC_REC_CHROMA 0xbb4 ++#define VE_AVC_REF_SLUMA 0xbb8 ++#define VE_AVC_REC_SLUMA 0xbbc ++#define VE_AVC_MB_INFO 0xbc0 ++ + #endif +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c +index 9673874ece10..e2b530b1a956 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c +@@ -37,6 +37,10 @@ static struct cedrus_format cedrus_formats[] = { + .pixelformat = V4L2_PIX_FMT_MPEG2_SLICE, + .directions = CEDRUS_DECODE_SRC, + }, ++ { ++ .pixelformat = V4L2_PIX_FMT_H264_SLICE_RAW, ++ .directions = CEDRUS_DECODE_SRC, ++ }, + { + .pixelformat = V4L2_PIX_FMT_SUNXI_TILED_NV12, + .directions = CEDRUS_DECODE_DST, +@@ -100,6 +104,7 @@ static void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt) + + switch (pix_fmt->pixelformat) { + case V4L2_PIX_FMT_MPEG2_SLICE: ++ case V4L2_PIX_FMT_H264_SLICE_RAW: + /* Zero bytes per line for encoded source. */ + bytesperline = 0; + +@@ -464,6 +469,10 @@ static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count) + ctx->current_codec = CEDRUS_CODEC_MPEG2; + break; + ++ case V4L2_PIX_FMT_H264_SLICE_RAW: ++ ctx->current_codec = CEDRUS_CODEC_H264; ++ break; ++ + default: + return -EINVAL; + } +-- +2.21.0 + +From ca0961011db57e39880df0b5708df8aa3339dc6f Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 18 May 2019 17:40:14 +0200 +Subject: [PATCH] ARM: dts: sun8i-h3: Fix wifi in Beelink X2 DT + +mmc1 node where wifi module is connected doesn't have properly defined +power supplies so wifi module is never powered up. Fix that by +specifying additional power supplies. + +Additionally, this STB may have either Realtek or Broadcom based wifi +module. One based on Broadcom module also needs external clock to work +properly. Fix that by adding clock property to wifi_pwrseq node. + +Fixes: e582b47a9252 ("ARM: dts: sun8i-h3: Add dts for the Beelink X2 STB") +Signed-off-by: Jernej Skrabec +Signed-off-by: Maxime Ripard +--- + arch/arm/boot/dts/sun8i-h3-beelink-x2.dts | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts +index 6277f13f3eb3..ac9e26b1d906 100644 +--- a/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts ++++ b/arch/arm/boot/dts/sun8i-h3-beelink-x2.dts +@@ -90,6 +90,8 @@ + wifi_pwrseq: wifi_pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&r_pio 0 7 GPIO_ACTIVE_LOW>; /* PL7 */ ++ clocks = <&rtc 1>; ++ clock-names = "ext_clock"; + }; + + sound_spdif { +@@ -155,6 +157,8 @@ + + &mmc1 { + vmmc-supply = <®_vcc3v3>; ++ vqmmc-supply = <®_vcc3v3>; ++ mmc-pwrseq = <&wifi_pwrseq>; + bus-width = <4>; + non-removable; + status = "okay"; +-- +2.21.0 + +From 85c6fadd185e495a3ef9cd8a60bb70b82b72d941 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Tue, 14 May 2019 22:54:45 +0200 +Subject: [PATCH] arm64: dts: allwinner: a64: orangepi-win: Add wifi and + bluetooth nodes + +The AP6212 is based on the Broadcom BCM43430 or BCM43438. The WiFi side +identifies as BCM43430, while the Bluetooth side identifies as BCM43438. + +WiFi is connected to mmc1 and the Bluetooth side is connected to UART1 +in a 4 wire configuration. Same as the WiFi side, due to being the same +chip and package, DLDO2 provides overall power via VBAT, and DLDO4 +provides I/O power via VDDIO. The RTC clock output provides the LPO low +power clock at 32.768 kHz. + +This patch enables WiFi and Bluetooth on OrangePi Win boards and adds +missing LPO clock on the WiFi side. PCM connection also exists for +Bluetooth audio, but it's not used here. + +Bluetooth UART speed is set to 1.5 MBaud in order to be able transmit +audio. While module supports even higher speeds, currently sunxi clock +driver doesn't support higher speed. + +Signed-off-by: Jernej Skrabec +Signed-off-by: Maxime Ripard +--- + .../dts/allwinner/sun50i-a64-orangepi-win.dts | 23 +++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +index 510f661229dc..5ef3c62c765e 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dts +@@ -109,6 +109,8 @@ + wifi_pwrseq: wifi_pwrseq { + compatible = "mmc-pwrseq-simple"; + reset-gpios = <&r_pio 0 8 GPIO_ACTIVE_LOW>; /* PL8 */ ++ clocks = <&rtc 1>; ++ clock-names = "ext_clock"; + }; + }; + +@@ -170,6 +172,14 @@ + bus-width = <4>; + non-removable; + status = "okay"; ++ ++ brcmf: wifi@1 { ++ reg = <1>; ++ compatible = "brcm,bcm4329-fmac"; ++ interrupt-parent = <&r_pio>; ++ interrupts = <0 7 IRQ_TYPE_LEVEL_LOW>; /* PL7 */ ++ interrupt-names = "host-wake"; ++ }; + }; + + &ohci0 { +@@ -342,7 +352,20 @@ + &uart1 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1_pins>, <&uart1_rts_cts_pins>; ++ uart-has-rtscts; + status = "okay"; ++ ++ bluetooth { ++ compatible = "brcm,bcm43438-bt"; ++ max-speed = <1500000>; ++ clocks = <&rtc 1>; ++ clock-names = "lpo"; ++ vbat-supply = <®_dldo2>; ++ vddio-supply = <®_dldo4>; ++ device-wakeup-gpios = <&r_pio 0 6 GPIO_ACTIVE_HIGH>; /* PL6 */ ++ host-wakeup-gpios = <&r_pio 0 5 GPIO_ACTIVE_HIGH>; /* PL5 */ ++ shutdown-gpios = <&r_pio 0 4 GPIO_ACTIVE_HIGH>; /* PL4 */ ++ }; + }; + + /* On Pi-2 connector, RTS/CTS optional */ +-- +2.21.0 + +From ae3ceed0a399fa0cc83410ce7bbf3a1675b733a9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Cl=C3=A9ment=20P=C3=A9ron?= +Date: Thu, 23 May 2019 17:10:49 +0200 +Subject: [PATCH] arm64: dts: allwinner: h6: add r_watchog node +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Allwinner H6 has a r_watchdog similar to A64. + +Declare it in the device-tree. + +Signed-off-by: Clément Péron +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +index 13e70aebddbe..b9a7dc8d2a40 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6.dtsi +@@ -631,6 +631,13 @@ + #reset-cells = <1>; + }; + ++ r_watchdog: watchdog@7020400 { ++ compatible = "allwinner,sun50i-h6-wdt", ++ "allwinner,sun6i-a31-wdt"; ++ reg = <0x07020400 0x20>; ++ interrupts = ; ++ }; ++ + r_intc: interrupt-controller@7021000 { + compatible = "allwinner,sun50i-h6-r-intc", + "allwinner,sun6i-a31-r-intc"; +-- +2.21.0 + +From f7275345728a0ff18a0607dd3706f2ca25dc53e0 Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Sat, 13 Apr 2019 18:54:12 +0200 +Subject: [PATCH] pinctrl: sunxi: Prepare for alternative bias voltage setting + methods + +H6 has a different I/O voltage bias setting method than A80. Prepare +existing code for using alternative bias voltage setting methods. + +Signed-off-by: Ondrej Jirman +Acked-by: Maxime Ripard +Signed-off-by: Linus Walleij +--- + drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c | 2 +- + drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c | 2 +- + drivers/pinctrl/sunxi/pinctrl-sunxi.c | 47 ++++++++++++--------- + drivers/pinctrl/sunxi/pinctrl-sunxi.h | 11 ++++- + 4 files changed, 39 insertions(+), 23 deletions(-) + +diff --git a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c +index e05dd9a5551d..a191a65217ac 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80-r.c +@@ -153,7 +153,7 @@ static const struct sunxi_pinctrl_desc sun9i_a80_r_pinctrl_data = { + .pin_base = PL_BASE, + .irq_banks = 2, + .disable_strict_mode = true, +- .has_io_bias_cfg = true, ++ .io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG, + }; + + static int sun9i_a80_r_pinctrl_probe(struct platform_device *pdev) +diff --git a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c +index da37d594a13d..0633a03d5e13 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sun9i-a80.c +@@ -722,7 +722,7 @@ static const struct sunxi_pinctrl_desc sun9i_a80_pinctrl_data = { + .npins = ARRAY_SIZE(sun9i_a80_pins), + .irq_banks = 5, + .disable_strict_mode = true, +- .has_io_bias_cfg = true, ++ .io_bias_cfg_variant = BIAS_VOLTAGE_GRP_CONFIG, + }; + + static int sun9i_a80_pinctrl_probe(struct platform_device *pdev) +diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +index be04223591d4..98c4de5f4019 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +@@ -617,7 +617,7 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl, + u32 val, reg; + int uV; + +- if (!pctl->desc->has_io_bias_cfg) ++ if (!pctl->desc->io_bias_cfg_variant) + return 0; + + uV = regulator_get_voltage(supply); +@@ -628,25 +628,32 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl, + if (uV == 0) + return 0; + +- /* Configured value must be equal or greater to actual voltage */ +- if (uV <= 1800000) +- val = 0x0; /* 1.8V */ +- else if (uV <= 2500000) +- val = 0x6; /* 2.5V */ +- else if (uV <= 2800000) +- val = 0x9; /* 2.8V */ +- else if (uV <= 3000000) +- val = 0xA; /* 3.0V */ +- else +- val = 0xD; /* 3.3V */ +- +- pin -= pctl->desc->pin_base; +- +- reg = readl(pctl->membase + sunxi_grp_config_reg(pin)); +- reg &= ~IO_BIAS_MASK; +- writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin)); +- +- return 0; ++ switch (pctl->desc->io_bias_cfg_variant) { ++ case BIAS_VOLTAGE_GRP_CONFIG: ++ /* ++ * Configured value must be equal or greater to actual ++ * voltage. ++ */ ++ if (uV <= 1800000) ++ val = 0x0; /* 1.8V */ ++ else if (uV <= 2500000) ++ val = 0x6; /* 2.5V */ ++ else if (uV <= 2800000) ++ val = 0x9; /* 2.8V */ ++ else if (uV <= 3000000) ++ val = 0xA; /* 3.0V */ ++ else ++ val = 0xD; /* 3.3V */ ++ ++ pin -= pctl->desc->pin_base; ++ ++ reg = readl(pctl->membase + sunxi_grp_config_reg(pin)); ++ reg &= ~IO_BIAS_MASK; ++ writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin)); ++ return 0; ++ default: ++ return -EINVAL; ++ } + } + + static int sunxi_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev) +diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.h b/drivers/pinctrl/sunxi/pinctrl-sunxi.h +index ee15ab067b5f..a62b81357136 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.h ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.h +@@ -95,6 +95,15 @@ + #define PINCTRL_SUN7I_A20 BIT(7) + #define PINCTRL_SUN8I_R40 BIT(8) + ++enum sunxi_desc_bias_voltage { ++ BIAS_VOLTAGE_NONE, ++ /* ++ * Bias voltage configuration is done through ++ * Pn_GRP_CONFIG registers, as seen on A80 SoC. ++ */ ++ BIAS_VOLTAGE_GRP_CONFIG, ++}; ++ + struct sunxi_desc_function { + unsigned long variant; + const char *name; +@@ -117,7 +126,7 @@ struct sunxi_pinctrl_desc { + const unsigned int *irq_bank_map; + bool irq_read_needs_mux; + bool disable_strict_mode; +- bool has_io_bias_cfg; ++ enum sunxi_desc_bias_voltage io_bias_cfg_variant; + }; + + struct sunxi_pinctrl_function { +-- +2.21.0 + +From cc62383fcebe7f03c274462790fd912f4346304b Mon Sep 17 00:00:00 2001 +From: Ondrej Jirman +Date: Sat, 13 Apr 2019 18:54:13 +0200 +Subject: [PATCH] pinctrl: sunxi: Support I/O bias voltage setting on H6 + +H6 SoC has a "pio group withstand voltage mode" register (datasheet +description), that needs to be used to select either 1.8V or 3.3V I/O mode, +based on what voltage is powering the respective pin banks and is thus used +for I/O signals. + +Add support for configuring this register according to the voltage of the +pin bank regulator (if enabled). + +This is similar to the support for I/O bias voltage setting patch for A80 +and the same concerns apply. See: + + commit 402bfb3c1352 ("Support I/O bias voltage setting on A80") + +Signed-off-by: Ondrej Jirman +Acked-by: Maxime Ripard +Signed-off-by: Linus Walleij +--- + drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c | 1 + + drivers/pinctrl/sunxi/pinctrl-sunxi.c | 11 +++++++++++ + drivers/pinctrl/sunxi/pinctrl-sunxi.h | 7 +++++++ + 3 files changed, 19 insertions(+) + +diff --git a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c +index ef4268cc6227..3cc1121589c9 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sun50i-h6.c +@@ -591,6 +591,7 @@ static const struct sunxi_pinctrl_desc h6_pinctrl_data = { + .irq_banks = 4, + .irq_bank_map = h6_irq_bank_map, + .irq_read_needs_mux = true, ++ .io_bias_cfg_variant = BIAS_VOLTAGE_PIO_POW_MODE_SEL, + }; + + static int h6_pinctrl_probe(struct platform_device *pdev) +diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +index 98c4de5f4019..0cbca30b75dc 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c +@@ -614,6 +614,8 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl, + unsigned pin, + struct regulator *supply) + { ++ unsigned short bank = pin / PINS_PER_BANK; ++ unsigned long flags; + u32 val, reg; + int uV; + +@@ -651,6 +653,15 @@ static int sunxi_pinctrl_set_io_bias_cfg(struct sunxi_pinctrl *pctl, + reg &= ~IO_BIAS_MASK; + writel(reg | val, pctl->membase + sunxi_grp_config_reg(pin)); + return 0; ++ case BIAS_VOLTAGE_PIO_POW_MODE_SEL: ++ val = uV <= 1800000 ? 1 : 0; ++ ++ raw_spin_lock_irqsave(&pctl->lock, flags); ++ reg = readl(pctl->membase + PIO_POW_MOD_SEL_REG); ++ reg &= ~(1 << bank); ++ writel(reg | val << bank, pctl->membase + PIO_POW_MOD_SEL_REG); ++ raw_spin_unlock_irqrestore(&pctl->lock, flags); ++ return 0; + default: + return -EINVAL; + } +diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.h b/drivers/pinctrl/sunxi/pinctrl-sunxi.h +index a62b81357136..44e30deeee38 100644 +--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.h ++++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.h +@@ -95,6 +95,8 @@ + #define PINCTRL_SUN7I_A20 BIT(7) + #define PINCTRL_SUN8I_R40 BIT(8) + ++#define PIO_POW_MOD_SEL_REG 0x340 ++ + enum sunxi_desc_bias_voltage { + BIAS_VOLTAGE_NONE, + /* +@@ -102,6 +104,11 @@ enum sunxi_desc_bias_voltage { + * Pn_GRP_CONFIG registers, as seen on A80 SoC. + */ + BIAS_VOLTAGE_GRP_CONFIG, ++ /* ++ * Bias voltage is set through PIO_POW_MOD_SEL_REG ++ * register, as seen on H6 SoC, for example. ++ */ ++ BIAS_VOLTAGE_PIO_POW_MODE_SEL, + }; + + struct sunxi_desc_function { +-- +2.21.0 + +From 22538576beb671038bd21be4094432fa8070ad81 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Fri, 3 May 2019 17:47:20 +0800 +Subject: [PATCH] arm64: dts: allwinner: h6: add PIO VCC bank supplies for Pine + H64 + +The Allwinner H6 SoC features tweakable VCC for PC, PD, PG, PL and PM +banks. + +This patch adds supplies for these banks except PL bank. PL bank is +where PMIC is attached, and currently if a PMIC regulator is added +for it a dependency loop will happen. + +Signed-off-by: Icenowy Zheng +Signed-off-by: Maxime Ripard +--- + arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts +index 4802902e128f..9e464d40cbff 100644 +--- a/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts ++++ b/arch/arm64/boot/dts/allwinner/sun50i-h6-pine-h64.dts +@@ -127,6 +127,12 @@ + status = "okay"; + }; + ++&pio { ++ vcc-pc-supply = <®_bldo2>; ++ vcc-pd-supply = <®_cldo1>; ++ vcc-pg-supply = <®_aldo1>; ++}; ++ + &r_i2c { + status = "okay"; + +@@ -247,6 +253,10 @@ + }; + }; + ++&r_pio { ++ vcc-pm-supply = <®_aldo1>; ++}; ++ + &uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_ph_pins>; +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0006-HEVC-H.265-stateless-support-for-V4L2-and-Cedrus.patch b/projects/Allwinner/patches/linux/0004-cedrus-hevc.patch similarity index 74% rename from projects/Allwinner/patches/linux/0006-HEVC-H.265-stateless-support-for-V4L2-and-Cedrus.patch rename to projects/Allwinner/patches/linux/0004-cedrus-hevc.patch index dd5aac6690..a5184d98a5 100644 --- a/projects/Allwinner/patches/linux/0006-HEVC-H.265-stateless-support-for-V4L2-and-Cedrus.patch +++ b/projects/Allwinner/patches/linux/0004-cedrus-hevc.patch @@ -1,80 +1,16 @@ -From patchwork Thu Feb 14 09:53:08 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Paul Kocialkowski -X-Patchwork-Id: 10812217 -Return-Path: -Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org - [172.30.200.125]) - by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 0E14113B4 - for ; - Thu, 14 Feb 2019 09:55:00 +0000 (UTC) -Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) - by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ED4C528703 - for ; - Thu, 14 Feb 2019 09:54:59 +0000 (UTC) -Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) - id E062E28758; Thu, 14 Feb 2019 09:54:59 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on - pdx-wl-mail.web.codeaurora.org -X-Spam-Level: -X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, - RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 -Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) - by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 388EF28703 - for ; - Thu, 14 Feb 2019 09:54:57 +0000 (UTC) -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S2392986AbfBNJyo (ORCPT - ); - Thu, 14 Feb 2019 04:54:44 -0500 -Received: from relay8-d.mail.gandi.net ([217.70.183.201]:58429 "EHLO - relay8-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S2392838AbfBNJyn (ORCPT - ); - Thu, 14 Feb 2019 04:54:43 -0500 -X-Originating-IP: 90.88.30.68 -Received: from localhost.localdomain - (aaubervilliers-681-1-89-68.w90-88.abo.wanadoo.fr [90.88.30.68]) - (Authenticated sender: paul.kocialkowski@bootlin.com) - by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 7E9C61BF20B; - Thu, 14 Feb 2019 09:54:37 +0000 (UTC) +From 2a7c76208e46bd164d7e968d063d870fcb1e9314 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski -To: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, - devel@driverdev.osuosl.org, linux-arm-kernel@lists.infradead.org, - linux-sunxi@googlegroups.com -Cc: Mauro Carvalho Chehab , - Maxime Ripard , - Paul Kocialkowski , - Greg Kroah-Hartman , - Chen-Yu Tsai , - Thomas Petazzoni , - Hans Verkuil , - Sakari Ailus , - Randy Li , - Ezequiel Garcia , - Tomasz Figa , - Alexandre Courbot -Subject: [PATCH v3 1/2] media: v4l: Add definitions for the HEVC slice format - and controls -Date: Thu, 14 Feb 2019 10:53:08 +0100 -Message-Id: <20190214095309.19594-2-paul.kocialkowski@bootlin.com> -X-Mailer: git-send-email 2.20.1 -In-Reply-To: <20190214095309.19594-1-paul.kocialkowski@bootlin.com> -References: <20190214095309.19594-1-paul.kocialkowski@bootlin.com> -MIME-Version: 1.0 -Sender: linux-media-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-media@vger.kernel.org -X-Virus-Scanned: ClamAV using ClamSMTP +Date: Fri, 24 May 2019 11:36:32 +0200 +Subject: [PATCH 09/12] media: v4l: Add definitions for the HEVC slice controls This introduces the required definitions for HEVC decoding support with stateless VPUs. The controls associated to the HEVC slice format provide the required meta-data for decoding slices extracted from the bitstream. -This interface comes with the following limitations: +They are not exported to the public V4L2 API since reworking this API +will be needed for covering various use-cases and new hardware. + +The interface comes with the following limitations: * No custom quantization matrices (scaling lists); * Support for a single temporal layer only; * No slice entry point offsets support; @@ -83,25 +19,24 @@ This interface comes with the following limitations: * No support for SPS extensions: range, multilayer, 3d, scc, 4 bits; * No support for PPS extensions: range, multilayer, 3d, scc, 4 bits. -Signed-off-by: Paul Kocialkowski +Signed-off-by: Hans Verkuil --- Documentation/media/uapi/v4l/biblio.rst | 9 + - .../media/uapi/v4l/pixfmt-compressed.rst | 15 + + .../media/uapi/v4l/ext-ctrls-codec.rst | 429 +++++++++++++++++- .../media/uapi/v4l/vidioc-queryctrl.rst | 18 + .../media/videodev2.h.rst.exceptions | 3 + drivers/media/v4l2-core/v4l2-ctrls.c | 26 ++ drivers/media/v4l2-core/v4l2-ioctl.c | 1 + - include/media/hevc-ctrls.h | 181 ++++++++ + include/media/hevc-ctrls.h | 182 ++++++++ include/media/v4l2-ctrls.h | 7 + - include/uapi/linux/videodev2.h | 1 + - 10 files changed, 679 insertions(+) + 8 files changed, 672 insertions(+), 3 deletions(-) create mode 100644 include/media/hevc-ctrls.h diff --git a/Documentation/media/uapi/v4l/biblio.rst b/Documentation/media/uapi/v4l/biblio.rst -index 3fc3f7ff338a..b4b3fcec55dd 100644 +index 8f4eb8823d82..e38ef5ee4209 100644 --- a/Documentation/media/uapi/v4l/biblio.rst +++ b/Documentation/media/uapi/v4l/biblio.rst -@@ -131,6 +131,15 @@ ITU H.264 +@@ -131,6 +131,15 @@ ITU-T Rec. H.264 Specification (04/2017 Edition) :author: International Telecommunication Union (http://www.itu.ch) @@ -117,39 +52,457 @@ index 3fc3f7ff338a..b4b3fcec55dd 100644 .. _jfif: JFIF -diff --git a/Documentation/media/uapi/v4l/pixfmt-compressed.rst b/Documentation/media/uapi/v4l/pixfmt-compressed.rst -index b6f857ac1a8e..ee82526cdc00 100644 ---- a/Documentation/media/uapi/v4l/pixfmt-compressed.rst -+++ b/Documentation/media/uapi/v4l/pixfmt-compressed.rst -@@ -138,6 +138,21 @@ Compressed Formats - - ``V4L2_PIX_FMT_HEVC`` - - 'HEVC' - - HEVC/H.265 video elementary stream. -+ * .. _V4L2-PIX-FMT-HEVC-SLICE: +diff --git a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +index b0c178f0ff9b..19e5bfba888b 100644 +--- a/Documentation/media/uapi/v4l/ext-ctrls-codec.rst ++++ b/Documentation/media/uapi/v4l/ext-ctrls-codec.rst +@@ -1981,9 +1981,9 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - + - ``reference_ts`` + - Timestamp of the V4L2 capture buffer to use as reference, used + with B-coded and P-coded frames. The timestamp refers to the +- ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the +- :c:func:`v4l2_timeval_to_ns()` function to convert the struct +- :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64. ++ ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the ++ :c:func:`v4l2_timeval_to_ns()` function to convert the struct ++ :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64. + * - __u16 + - ``frame_num`` + - +@@ -3291,3 +3291,426 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - + Indicates whether to generate SPS and PPS at every IDR. Setting it to 0 + disables generating SPS and PPS at every IDR. Setting it to one enables + generating SPS and PPS at every IDR. + -+ - ``V4L2_PIX_FMT_HEVC_SLICE`` -+ - 'S265' -+ - HEVC parsed slice data, as extracted from the HEVC bitstream. -+ This format is adapted for stateless video decoders that implement a -+ HEVC pipeline (using the :ref:`codec` and :ref:`media-request-api`). -+ Metadata associated with the frame to decode is required to be passed -+ through the following controls : -+ * ``V4L2_CID_MPEG_VIDEO_HEVC_SPS`` -+ * ``V4L2_CID_MPEG_VIDEO_HEVC_PPS`` -+ * ``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS`` -+ See the :ref:`associated Codec Control IDs `. -+ Buffers associated with this pixel format must contain the appropriate -+ number of macroblocks to decode a full corresponding frame. - * .. _V4L2-PIX-FMT-FWHT: - - - ``V4L2_PIX_FMT_FWHT`` ++.. _v4l2-mpeg-hevc: ++ ++``V4L2_CID_MPEG_VIDEO_HEVC_SPS (struct)`` ++ Specifies the Sequence Parameter Set fields (as extracted from the ++ bitstream) for the associated HEVC slice data. ++ These bitstream parameters are defined according to :ref:`hevc`. ++ They are described in section 7.4.3.2 "Sequence parameter set RBSP ++ semantics" of the specification. ++ ++.. c:type:: v4l2_ctrl_hevc_sps ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_hevc_sps ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``chroma_format_idc`` ++ - ++ * - __u8 ++ - ``separate_colour_plane_flag`` ++ - ++ * - __u16 ++ - ``pic_width_in_luma_samples`` ++ - ++ * - __u16 ++ - ``pic_height_in_luma_samples`` ++ - ++ * - __u8 ++ - ``bit_depth_luma_minus8`` ++ - ++ * - __u8 ++ - ``bit_depth_chroma_minus8`` ++ - ++ * - __u8 ++ - ``log2_max_pic_order_cnt_lsb_minus4`` ++ - ++ * - __u8 ++ - ``sps_max_dec_pic_buffering_minus1`` ++ - ++ * - __u8 ++ - ``sps_max_num_reorder_pics`` ++ - ++ * - __u8 ++ - ``sps_max_latency_increase_plus1`` ++ - ++ * - __u8 ++ - ``log2_min_luma_coding_block_size_minus3`` ++ - ++ * - __u8 ++ - ``log2_diff_max_min_luma_coding_block_size`` ++ - ++ * - __u8 ++ - ``log2_min_luma_transform_block_size_minus2`` ++ - ++ * - __u8 ++ - ``log2_diff_max_min_luma_transform_block_size`` ++ - ++ * - __u8 ++ - ``max_transform_hierarchy_depth_inter`` ++ - ++ * - __u8 ++ - ``max_transform_hierarchy_depth_intra`` ++ - ++ * - __u8 ++ - ``scaling_list_enabled_flag`` ++ - ++ * - __u8 ++ - ``amp_enabled_flag`` ++ - ++ * - __u8 ++ - ``sample_adaptive_offset_enabled_flag`` ++ - ++ * - __u8 ++ - ``pcm_enabled_flag`` ++ - ++ * - __u8 ++ - ``pcm_sample_bit_depth_luma_minus1`` ++ - ++ * - __u8 ++ - ``pcm_sample_bit_depth_chroma_minus1`` ++ - ++ * - __u8 ++ - ``log2_min_pcm_luma_coding_block_size_minus3`` ++ - ++ * - __u8 ++ - ``log2_diff_max_min_pcm_luma_coding_block_size`` ++ - ++ * - __u8 ++ - ``pcm_loop_filter_disabled_flag`` ++ - ++ * - __u8 ++ - ``num_short_term_ref_pic_sets`` ++ - ++ * - __u8 ++ - ``long_term_ref_pics_present_flag`` ++ - ++ * - __u8 ++ - ``num_long_term_ref_pics_sps`` ++ - ++ * - __u8 ++ - ``sps_temporal_mvp_enabled_flag`` ++ - ++ * - __u8 ++ - ``strong_intra_smoothing_enabled_flag`` ++ - ++ ++``V4L2_CID_MPEG_VIDEO_HEVC_PPS (struct)`` ++ Specifies the Picture Parameter Set fields (as extracted from the ++ bitstream) for the associated HEVC slice data. ++ These bitstream parameters are defined according to :ref:`hevc`. ++ They are described in section 7.4.3.3 "Picture parameter set RBSP ++ semantics" of the specification. ++ ++.. c:type:: v4l2_ctrl_hevc_pps ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_hevc_pps ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``dependent_slice_segment_flag`` ++ - ++ * - __u8 ++ - ``output_flag_present_flag`` ++ - ++ * - __u8 ++ - ``num_extra_slice_header_bits`` ++ - ++ * - __u8 ++ - ``sign_data_hiding_enabled_flag`` ++ - ++ * - __u8 ++ - ``cabac_init_present_flag`` ++ - ++ * - __s8 ++ - ``init_qp_minus26`` ++ - ++ * - __u8 ++ - ``constrained_intra_pred_flag`` ++ - ++ * - __u8 ++ - ``transform_skip_enabled_flag`` ++ - ++ * - __u8 ++ - ``cu_qp_delta_enabled_flag`` ++ - ++ * - __u8 ++ - ``diff_cu_qp_delta_depth`` ++ - ++ * - __s8 ++ - ``pps_cb_qp_offset`` ++ - ++ * - __s8 ++ - ``pps_cr_qp_offset`` ++ - ++ * - __u8 ++ - ``pps_slice_chroma_qp_offsets_present_flag`` ++ - ++ * - __u8 ++ - ``weighted_pred_flag`` ++ - ++ * - __u8 ++ - ``weighted_bipred_flag`` ++ - ++ * - __u8 ++ - ``transquant_bypass_enabled_flag`` ++ - ++ * - __u8 ++ - ``tiles_enabled_flag`` ++ - ++ * - __u8 ++ - ``entropy_coding_sync_enabled_flag`` ++ - ++ * - __u8 ++ - ``num_tile_columns_minus1`` ++ - ++ * - __u8 ++ - ``num_tile_rows_minus1`` ++ - ++ * - __u8 ++ - ``column_width_minus1[20]`` ++ - ++ * - __u8 ++ - ``row_height_minus1[22]`` ++ - ++ * - __u8 ++ - ``loop_filter_across_tiles_enabled_flag`` ++ - ++ * - __u8 ++ - ``pps_loop_filter_across_slices_enabled_flag`` ++ - ++ * - __u8 ++ - ``deblocking_filter_override_enabled_flag`` ++ - ++ * - __u8 ++ - ``pps_disable_deblocking_filter_flag`` ++ - ++ * - __s8 ++ - ``pps_beta_offset_div2`` ++ - ++ * - __s8 ++ - ``pps_tc_offset_div2`` ++ - ++ * - __u8 ++ - ``lists_modification_present_flag`` ++ - ++ * - __u8 ++ - ``log2_parallel_merge_level_minus2`` ++ - ++ * - __u8 ++ - ``slice_segment_header_extension_present_flag`` ++ - ++ ++``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (struct)`` ++ Specifies various slice-specific parameters, especially from the NAL unit ++ header, general slice segment header and weighted prediction parameter ++ parts of the bitstream. ++ These bitstream parameters are defined according to :ref:`hevc`. ++ They are described in section 7.4.7 "General slice segment header ++ semantics" of the specification. ++ ++.. c:type:: v4l2_ctrl_hevc_slice_params ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_ctrl_hevc_slice_params ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u32 ++ - ``bit_size`` ++ - Size (in bits) of the current slice data. ++ * - __u32 ++ - ``data_bit_offset`` ++ - Offset (in bits) to the video data in the current slice data. ++ * - __u8 ++ - ``nal_unit_type`` ++ - ++ * - __u8 ++ - ``nuh_temporal_id_plus1`` ++ - ++ * - __u8 ++ - ``slice_type`` ++ - ++ (V4L2_HEVC_SLICE_TYPE_I, V4L2_HEVC_SLICE_TYPE_P or ++ V4L2_HEVC_SLICE_TYPE_B). ++ * - __u8 ++ - ``colour_plane_id`` ++ - ++ * - __u16 ++ - ``slice_pic_order_cnt`` ++ - ++ * - __u8 ++ - ``slice_sao_luma_flag`` ++ - ++ * - __u8 ++ - ``slice_sao_chroma_flag`` ++ - ++ * - __u8 ++ - ``slice_temporal_mvp_enabled_flag`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l0_active_minus1`` ++ - ++ * - __u8 ++ - ``num_ref_idx_l1_active_minus1`` ++ - ++ * - __u8 ++ - ``mvd_l1_zero_flag`` ++ - ++ * - __u8 ++ - ``cabac_init_flag`` ++ - ++ * - __u8 ++ - ``collocated_from_l0_flag`` ++ - ++ * - __u8 ++ - ``collocated_ref_idx`` ++ - ++ * - __u8 ++ - ``five_minus_max_num_merge_cand`` ++ - ++ * - __u8 ++ - ``use_integer_mv_flag`` ++ - ++ * - __s8 ++ - ``slice_qp_delta`` ++ - ++ * - __s8 ++ - ``slice_cb_qp_offset`` ++ - ++ * - __s8 ++ - ``slice_cr_qp_offset`` ++ - ++ * - __s8 ++ - ``slice_act_y_qp_offset`` ++ - ++ * - __s8 ++ - ``slice_act_cb_qp_offset`` ++ - ++ * - __s8 ++ - ``slice_act_cr_qp_offset`` ++ - ++ * - __u8 ++ - ``slice_deblocking_filter_disabled_flag`` ++ - ++ * - __s8 ++ - ``slice_beta_offset_div2`` ++ - ++ * - __s8 ++ - ``slice_tc_offset_div2`` ++ - ++ * - __u8 ++ - ``slice_loop_filter_across_slices_enabled_flag`` ++ - ++ * - __u8 ++ - ``pic_struct`` ++ - ++ * - struct :c:type:`v4l2_hevc_dpb_entry` ++ - ``dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - The decoded picture buffer, for meta-data about reference frames. ++ * - __u8 ++ - ``num_active_dpb_entries`` ++ - The number of entries in ``dpb``. ++ * - __u8 ++ - ``ref_idx_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - The list of L0 reference elements as indices in the DPB. ++ * - __u8 ++ - ``ref_idx_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - The list of L1 reference elements as indices in the DPB. ++ * - __u8 ++ - ``num_rps_poc_st_curr_before`` ++ - The number of reference pictures in the short-term set that come before ++ the current frame. ++ * - __u8 ++ - ``num_rps_poc_st_curr_after`` ++ - The number of reference pictures in the short-term set that come after ++ the current frame. ++ * - __u8 ++ - ``num_rps_poc_lt_curr`` ++ - The number of reference pictures in the long-term set. ++ * - struct :c:type:`v4l2_hevc_pred_weight_table` ++ - ``pred_weight_table`` ++ - The prediction weight coefficients for inter-picture prediction. ++ ++.. c:type:: v4l2_hevc_dpb_entry ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_hevc_dpb_entry ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u64 ++ - ``timestamp`` ++ - Timestamp of the V4L2 capture buffer to use as reference, used ++ with B-coded and P-coded frames. The timestamp refers to the ++ ``timestamp`` field in struct :c:type:`v4l2_buffer`. Use the ++ :c:func:`v4l2_timeval_to_ns()` function to convert the struct ++ :c:type:`timeval` in struct :c:type:`v4l2_buffer` to a __u64. ++ * - __u8 ++ - ``rps`` ++ - The reference set for the reference frame ++ (V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE, ++ V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_AFTER or ++ V4L2_HEVC_DPB_ENTRY_RPS_LT_CURR) ++ * - __u8 ++ - ``field_pic`` ++ - Whether the reference is a field picture or a frame. ++ * - __u16 ++ - ``pic_order_cnt[2]`` ++ - The picture order count of the reference. Only the first element of the ++ array is used for frame pictures, while the first element identifies the ++ top field and the second the bottom field in field-coded pictures. ++ ++.. c:type:: v4l2_hevc_pred_weight_table ++ ++.. cssclass:: longtable ++ ++.. flat-table:: struct v4l2_hevc_pred_weight_table ++ :header-rows: 0 ++ :stub-columns: 0 ++ :widths: 1 1 2 ++ ++ * - __u8 ++ - ``luma_log2_weight_denom`` ++ - ++ * - __s8 ++ - ``delta_chroma_log2_weight_denom`` ++ - ++ * - __s8 ++ - ``delta_luma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - ++ * - __s8 ++ - ``luma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - ++ * - __s8 ++ - ``delta_chroma_weight_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]`` ++ - ++ * - __s8 ++ - ``chroma_offset_l0[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]`` ++ - ++ * - __s8 ++ - ``delta_luma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - ++ * - __s8 ++ - ``luma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` ++ - ++ * - __s8 ++ - ``delta_chroma_weight_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]`` ++ - ++ * - __s8 ++ - ``chroma_offset_l1[V4L2_HEVC_DPB_ENTRIES_NUM_MAX][2]`` ++ - diff --git a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst -index bf29dc5b9758..f37cb377e258 100644 +index dc500632095d..e090ef33231c 100644 --- a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst +++ b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst @@ -473,6 +473,24 @@ See also the examples in :ref:`control`. - n/a - - A struct :c:type:`v4l2_ctrl_h264_decode_param`, containing H264 + - A struct :c:type:`v4l2_ctrl_h264_decode_params`, containing H264 decode parameters for stateless video decoders. + * - ``V4L2_CTRL_TYPE_HEVC_SPS`` + - n/a @@ -187,10 +540,10 @@ index 55cbe324b9fc..afba7d71971a 100644 # V4L2 capability defines replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 366200d31bc0..106c80ec9312 100644 +index b72dc54ba638..d93717697402 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -916,6 +916,9 @@ const char *v4l2_ctrl_get_name(u32 id) +@@ -944,6 +944,9 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD: return "HEVC Size of Length Field"; case V4L2_CID_MPEG_VIDEO_REF_NUMBER_FOR_PFRAMES: return "Reference Frames for a P-Frame"; case V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR: return "Prepend SPS and PPS to IDR"; @@ -200,7 +553,7 @@ index 366200d31bc0..106c80ec9312 100644 /* CAMERA controls */ /* Keep the order of the 'case's the same as in v4l2-controls.h! */ -@@ -1323,6 +1326,15 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, +@@ -1357,6 +1360,15 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS: *type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS; break; @@ -216,7 +569,7 @@ index 366200d31bc0..106c80ec9312 100644 default: *type = V4L2_CTRL_TYPE_INTEGER; break; -@@ -1696,6 +1708,11 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, +@@ -1733,6 +1745,11 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: return 0; @@ -228,9 +581,9 @@ index 366200d31bc0..106c80ec9312 100644 default: return -EINVAL; } -@@ -2291,6 +2308,15 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, +@@ -2331,6 +2348,15 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: - elem_size = sizeof(struct v4l2_ctrl_h264_decode_param); + elem_size = sizeof(struct v4l2_ctrl_h264_decode_params); break; + case V4L2_CTRL_TYPE_HEVC_SPS: + elem_size = sizeof(struct v4l2_ctrl_hevc_sps); @@ -245,23 +598,23 @@ index 366200d31bc0..106c80ec9312 100644 if (type < V4L2_CTRL_COMPOUND_TYPES) elem_size = sizeof(s32); diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c -index 8aa7de17ecfa..e792fc97e263 100644 +index f6e1254064d2..0960f719da5d 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c -@@ -1331,6 +1331,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) +@@ -1337,6 +1337,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) case V4L2_PIX_FMT_VP8: descr = "VP8"; break; case V4L2_PIX_FMT_VP9: descr = "VP9"; break; case V4L2_PIX_FMT_HEVC: descr = "HEVC"; break; /* aka H.265 */ + case V4L2_PIX_FMT_HEVC_SLICE: descr = "HEVC Parsed Slice Data"; break; case V4L2_PIX_FMT_FWHT: descr = "FWHT"; break; /* used in vicodec */ + case V4L2_PIX_FMT_FWHT_STATELESS: descr = "FWHT Stateless"; break; /* used in vicodec */ case V4L2_PIX_FMT_CPIA1: descr = "GSPCA CPiA YUV"; break; - case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break; diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h new file mode 100644 -index 000000000000..005c71c67163 +index 000000000000..9ea013c88afc --- /dev/null +++ b/include/media/hevc-ctrls.h -@@ -0,0 +1,181 @@ +@@ -0,0 +1,182 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * These are the HEVC state controls for use with stateless HEVC @@ -275,19 +628,20 @@ index 000000000000..005c71c67163 +#ifndef _HEVC_CTRLS_H_ +#define _HEVC_CTRLS_H_ + -+#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 645) -+#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 646) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 647) ++#define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) ++#define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) ++#define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) + +/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_HEVC_SPS 0x0115 -+#define V4L2_CTRL_TYPE_HEVC_PPS 0x0116 -+#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0117 ++#define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 ++#define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 ++#define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 + +#define V4L2_HEVC_SLICE_TYPE_B 0 +#define V4L2_HEVC_SLICE_TYPE_P 1 +#define V4L2_HEVC_SLICE_TYPE_I 2 + ++/* The controls are not stable at the moment and will likely be reworked. */ +struct v4l2_ctrl_hevc_sps { + /* ISO/IEC 23008-2, ITU-T Rec. H.265: Sequence parameter set */ + __u8 chroma_format_idc; @@ -444,120 +798,137 @@ index 000000000000..005c71c67163 + +#endif diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h -index 22b6d09c4764..f24a835e5920 100644 +index a8aede26491e..630083e1936d 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h -@@ -28,6 +28,7 @@ - */ +@@ -29,6 +29,7 @@ #include + #include #include +#include /* forward references */ struct file; -@@ -55,6 +56,9 @@ struct poll_table_struct; +@@ -57,6 +58,9 @@ struct poll_table_struct; * @p_h264_scaling_matrix: Pointer to a struct v4l2_ctrl_h264_scaling_matrix. - * @p_h264_slice_param: Pointer to a struct v4l2_ctrl_h264_slice_params. - * @p_h264_decode_param: Pointer to a struct v4l2_ctrl_h264_decode_params. + * @p_h264_slice_params: Pointer to a struct v4l2_ctrl_h264_slice_params. + * @p_h264_decode_params: Pointer to a struct v4l2_ctrl_h264_decode_params. + * @p_hevc_sps: Pointer to an HEVC sequence parameter set structure. + * @p_hevc_pps: Pointer to an HEVC picture parameter set structure. + * @p_hevc_slice_params Pointer to an HEVC slice parameters structure. * @p: Pointer to a compound value. */ union v4l2_ctrl_ptr { -@@ -71,6 +75,9 @@ union v4l2_ctrl_ptr { +@@ -74,6 +78,9 @@ union v4l2_ctrl_ptr { struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix; - struct v4l2_ctrl_h264_slice_params *p_h264_slice_param; - struct v4l2_ctrl_h264_decode_params *p_h264_decode_param; + struct v4l2_ctrl_h264_slice_params *p_h264_slice_params; + struct v4l2_ctrl_h264_decode_params *p_h264_decode_params; + struct v4l2_ctrl_hevc_sps *p_hevc_sps; + struct v4l2_ctrl_hevc_pps *p_hevc_pps; + struct v4l2_ctrl_hevc_slice_params *p_hevc_slice_params; void *p; }; -diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h -index 673172c84fb9..5ae4f00f4078 100644 ---- a/include/uapi/linux/videodev2.h -+++ b/include/uapi/linux/videodev2.h -@@ -669,6 +669,7 @@ struct v4l2_pix_format { - #define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') /* VP8 */ - #define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') /* VP9 */ - #define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') /* HEVC aka H.265 */ -+#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ - #define V4L2_PIX_FMT_FWHT v4l2_fourcc('F', 'W', 'H', 'T') /* Fast Walsh Hadamard Transform (vicodec) */ - - /* Vendor-specific formats */ +-- +2.21.0 -From patchwork Thu Feb 14 09:53:09 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -X-Patchwork-Submitter: Paul Kocialkowski -X-Patchwork-Id: 10812215 -Return-Path: -Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org - [172.30.200.125]) - by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id BE979746 - for ; - Thu, 14 Feb 2019 09:54:56 +0000 (UTC) -Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) - by mail.wl.linuxfoundation.org (Postfix) with ESMTP id AB33928703 - for ; - Thu, 14 Feb 2019 09:54:56 +0000 (UTC) -Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) - id 9ED1728752; Thu, 14 Feb 2019 09:54:56 +0000 (UTC) -X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on - pdx-wl-mail.web.codeaurora.org -X-Spam-Level: -X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, - RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 -Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) - by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6651528703 - for ; - Thu, 14 Feb 2019 09:54:54 +0000 (UTC) -Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand - id S2438109AbfBNJys (ORCPT - ); - Thu, 14 Feb 2019 04:54:48 -0500 -Received: from relay8-d.mail.gandi.net ([217.70.183.201]:40921 "EHLO - relay8-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org - with ESMTP id S2392881AbfBNJyq (ORCPT - ); - Thu, 14 Feb 2019 04:54:46 -0500 -X-Originating-IP: 90.88.30.68 -Received: from localhost.localdomain - (aaubervilliers-681-1-89-68.w90-88.abo.wanadoo.fr [90.88.30.68]) - (Authenticated sender: paul.kocialkowski@bootlin.com) - by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 2F2A01BF219; - Thu, 14 Feb 2019 09:54:39 +0000 (UTC) +From dd424b21e39cd7e65a40298ddbaba468878ad1f5 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski -To: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, - devel@driverdev.osuosl.org, linux-arm-kernel@lists.infradead.org, - linux-sunxi@googlegroups.com -Cc: Mauro Carvalho Chehab , - Maxime Ripard , - Paul Kocialkowski , - Greg Kroah-Hartman , - Chen-Yu Tsai , - Thomas Petazzoni , - Hans Verkuil , - Sakari Ailus , - Randy Li , - Ezequiel Garcia , - Tomasz Figa , - Alexandre Courbot -Subject: [PATCH v3 2/2] media: cedrus: Add HEVC/H.265 decoding support -Date: Thu, 14 Feb 2019 10:53:09 +0100 -Message-Id: <20190214095309.19594-3-paul.kocialkowski@bootlin.com> -X-Mailer: git-send-email 2.20.1 -In-Reply-To: <20190214095309.19594-1-paul.kocialkowski@bootlin.com> -References: <20190214095309.19594-1-paul.kocialkowski@bootlin.com> -MIME-Version: 1.0 -Sender: linux-media-owner@vger.kernel.org -Precedence: bulk -List-ID: -X-Mailing-List: linux-media@vger.kernel.org -X-Virus-Scanned: ClamAV using ClamSMTP +Date: Fri, 24 May 2019 11:36:33 +0200 +Subject: [PATCH 10/12] media: pixfmt: Add HEVC slice pixel format + +Introduce the V4L2_PIX_FMT_HEVC_SLICE pixel format, which currently +describes an output buffer with enough appended slice data for +producing one decoded frame with a stateless video decoder. + +This will need to be reworked (along with the controls and the core) to +allow passing slice data individually, as it is the natural decoding +unit in HEVC. + +We also need to figure out the description of the possible source data: +* Compressed slice data only, with slice controls attached; +* Slice data in Annex-B format (with raw slice header), without slice + controls attached; +* Slice data in Annex-B format (with raw slice header), with slice + controls attached. + +Signed-off-by: Paul Kocialkowski +Signed-off-by: Hans Verkuil +--- + include/media/hevc-ctrls.h | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h +index 9ea013c88afc..2de83d9f6d47 100644 +--- a/include/media/hevc-ctrls.h ++++ b/include/media/hevc-ctrls.h +@@ -11,6 +11,9 @@ + #ifndef _HEVC_CTRLS_H_ + #define _HEVC_CTRLS_H_ + ++/* The pixel format isn't stable at the moment and will likely be renamed. */ ++#define V4L2_PIX_FMT_HEVC_SLICE v4l2_fourcc('S', '2', '6', '5') /* HEVC parsed slices */ ++ + #define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) + #define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) + #define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) +-- +2.21.0 + +From 256c89e4dd0621198cad6fbf0689682116cad795 Mon Sep 17 00:00:00 2001 +From: Paul Kocialkowski +Date: Fri, 24 May 2019 11:36:34 +0200 +Subject: [PATCH 11/12] media: pixfmt: Document the HEVC slice pixel format + +Document the current state of the HEVC slice pixel format. +The format will need to evolve in the future, which is why it is +not part of the public API. + +Signed-off-by: Paul Kocialkowski +Signed-off-by: Hans Verkuil +--- + .../media/uapi/v4l/pixfmt-compressed.rst | 21 +++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/Documentation/media/uapi/v4l/pixfmt-compressed.rst b/Documentation/media/uapi/v4l/pixfmt-compressed.rst +index 4b701fc7653e..9d4195723c3e 100644 +--- a/Documentation/media/uapi/v4l/pixfmt-compressed.rst ++++ b/Documentation/media/uapi/v4l/pixfmt-compressed.rst +@@ -143,6 +143,27 @@ Compressed Formats + - ``V4L2_PIX_FMT_HEVC`` + - 'HEVC' + - HEVC/H.265 video elementary stream. ++ * .. _V4L2-PIX-FMT-HEVC-SLICE: ++ ++ - ``V4L2_PIX_FMT_HEVC_SLICE`` ++ - 'S265' ++ - HEVC parsed slice data, as extracted from the HEVC bitstream. ++ This format is adapted for stateless video decoders that implement a ++ HEVC pipeline (using the :ref:`codec` and :ref:`media-request-api`). ++ Metadata associated with the frame to decode is required to be passed ++ through the following controls : ++ * ``V4L2_CID_MPEG_VIDEO_HEVC_SPS`` ++ * ``V4L2_CID_MPEG_VIDEO_HEVC_PPS`` ++ * ``V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS`` ++ See the :ref:`associated Codec Control IDs `. ++ Buffers associated with this pixel format must contain the appropriate ++ number of macroblocks to decode a full corresponding frame. ++ ++ .. note:: ++ ++ This format is not yet part of the public kernel API and it ++ is expected to change. ++ + * .. _V4L2-PIX-FMT-FWHT: + + - ``V4L2_PIX_FMT_FWHT`` +-- +2.21.0 + +From ef19574101a1e649c440c43615420b7047f8f4ef Mon Sep 17 00:00:00 2001 +From: Paul Kocialkowski +Date: Fri, 24 May 2019 11:36:35 +0200 +Subject: [PATCH 12/12] media: cedrus: Add HEVC/H.265 decoding support This introduces support for HEVC/H.265 to the Cedrus VPU driver, with both uni-directional and bi-directional prediction modes supported. @@ -566,37 +937,37 @@ Field-coded (interlaced) pictures, custom quantization matrices and 10-bit output are not supported at this point. Signed-off-by: Paul Kocialkowski +Signed-off-by: Hans Verkuil --- drivers/staging/media/sunxi/cedrus/Makefile | 2 +- - drivers/staging/media/sunxi/cedrus/cedrus.c | 27 +- + drivers/staging/media/sunxi/cedrus/cedrus.c | 31 +- drivers/staging/media/sunxi/cedrus/cedrus.h | 18 + .../staging/media/sunxi/cedrus/cedrus_dec.c | 9 + - .../staging/media/sunxi/cedrus/cedrus_h265.c | 531 ++++++++++++++++++ + .../staging/media/sunxi/cedrus/cedrus_h265.c | 532 ++++++++++++++++++ .../staging/media/sunxi/cedrus/cedrus_hw.c | 4 + .../staging/media/sunxi/cedrus/cedrus_regs.h | 290 ++++++++++ .../staging/media/sunxi/cedrus/cedrus_video.c | 10 + - 8 files changed, 887 insertions(+), 4 deletions(-) + 8 files changed, 891 insertions(+), 5 deletions(-) create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_h265.c diff --git a/drivers/staging/media/sunxi/cedrus/Makefile b/drivers/staging/media/sunxi/cedrus/Makefile -index aaf141fc58b6..186cb6d01b67 100644 +index c85ac6db0302..1bce49d3e7e2 100644 --- a/drivers/staging/media/sunxi/cedrus/Makefile +++ b/drivers/staging/media/sunxi/cedrus/Makefile -@@ -1,4 +1,4 @@ +@@ -2,4 +2,4 @@ obj-$(CONFIG_VIDEO_SUNXI_CEDRUS) += sunxi-cedrus.o sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o \ - cedrus_mpeg2.o cedrus_h264.o + cedrus_mpeg2.o cedrus_h264.o cedrus_h265.o diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c -index b275607b8111..a713630ce7ba 100644 +index 370937edfc14..70642834f351 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c -@@ -68,6 +68,23 @@ static const struct cedrus_control cedrus_controls[] = { - .id = V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX, - .elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix), +@@ -70,6 +70,24 @@ static const struct cedrus_control cedrus_controls[] = { .codec = CEDRUS_CODEC_H264, -+ }, + .required = true, + }, + { + .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS, + .elem_size = sizeof(struct v4l2_ctrl_hevc_sps), @@ -613,10 +984,12 @@ index b275607b8111..a713630ce7ba 100644 + .id = V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS, + .elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params), + .codec = CEDRUS_CODEC_H265, - .required = true, - }, ++ .required = true, ++ }, }; -@@ -309,6 +326,7 @@ static int cedrus_probe(struct platform_device *pdev) + + #define CEDRUS_CONTROLS_COUNT ARRAY_SIZE(cedrus_controls) +@@ -309,6 +327,7 @@ static int cedrus_probe(struct platform_device *pdev) dev->dec_ops[CEDRUS_CODEC_MPEG2] = &cedrus_dec_ops_mpeg2; dev->dec_ops[CEDRUS_CODEC_H264] = &cedrus_dec_ops_h264; @@ -624,38 +997,49 @@ index b275607b8111..a713630ce7ba 100644 mutex_init(&dev->dev_mutex); -@@ -416,15 +434,18 @@ static const struct cedrus_variant sun8i_a33_cedrus_variant = { +@@ -417,22 +436,26 @@ static const struct cedrus_variant sun8i_a33_cedrus_variant = { }; static const struct cedrus_variant sun8i_h3_cedrus_variant = { - .capabilities = CEDRUS_CAPABILITY_UNTILED, + .capabilities = CEDRUS_CAPABILITY_UNTILED | + CEDRUS_CAPABILITY_H265_DEC, + .mod_rate = 402000000, }; static const struct cedrus_variant sun50i_a64_cedrus_variant = { - .capabilities = CEDRUS_CAPABILITY_UNTILED, + .capabilities = CEDRUS_CAPABILITY_UNTILED | + CEDRUS_CAPABILITY_H265_DEC, + .mod_rate = 402000000, }; static const struct cedrus_variant sun50i_h5_cedrus_variant = { - .capabilities = CEDRUS_CAPABILITY_UNTILED, + .capabilities = CEDRUS_CAPABILITY_UNTILED | + CEDRUS_CAPABILITY_H265_DEC, + .mod_rate = 402000000, }; - static const struct of_device_id cedrus_dt_match[] = { + static const struct cedrus_variant sun50i_h6_cedrus_variant = { +- .capabilities = CEDRUS_CAPABILITY_UNTILED, ++ .capabilities = CEDRUS_CAPABILITY_UNTILED | ++ CEDRUS_CAPABILITY_H265_DEC, + .quirks = CEDRUS_QUIRK_NO_DMA_OFFSET, + .mod_rate = 600000000, + }; diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index 8c64f9a27e9d..b5d083812bea 100644 +index 3f476d0fd981..f19be772d78b 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -27,10 +27,12 @@ +@@ -27,12 +27,14 @@ #define CEDRUS_NAME "cedrus" #define CEDRUS_CAPABILITY_UNTILED BIT(0) +#define CEDRUS_CAPABILITY_H265_DEC BIT(1) + #define CEDRUS_QUIRK_NO_DMA_OFFSET BIT(0) + enum cedrus_codec { CEDRUS_CODEC_MPEG2, CEDRUS_CODEC_H264, @@ -663,7 +1047,7 @@ index 8c64f9a27e9d..b5d083812bea 100644 CEDRUS_CODEC_LAST, }; -@@ -66,6 +68,12 @@ struct cedrus_mpeg2_run { +@@ -68,6 +70,12 @@ struct cedrus_mpeg2_run { const struct v4l2_ctrl_mpeg2_quantization *quantization; }; @@ -676,7 +1060,7 @@ index 8c64f9a27e9d..b5d083812bea 100644 struct cedrus_run { struct vb2_v4l2_buffer *src; struct vb2_v4l2_buffer *dst; -@@ -73,6 +81,7 @@ struct cedrus_run { +@@ -75,6 +83,7 @@ struct cedrus_run { union { struct cedrus_h264_run h264; struct cedrus_mpeg2_run mpeg2; @@ -684,7 +1068,7 @@ index 8c64f9a27e9d..b5d083812bea 100644 }; }; -@@ -111,6 +120,14 @@ struct cedrus_ctx { +@@ -113,6 +122,14 @@ struct cedrus_ctx { void *neighbor_info_buf; dma_addr_t neighbor_info_buf_dma; } h264; @@ -699,7 +1083,7 @@ index 8c64f9a27e9d..b5d083812bea 100644 } codec; }; -@@ -154,6 +171,7 @@ struct cedrus_dev { +@@ -158,6 +175,7 @@ struct cedrus_dev { extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2; extern struct cedrus_dec_ops cedrus_dec_ops_h264; @@ -708,10 +1092,10 @@ index 8c64f9a27e9d..b5d083812bea 100644 static inline void cedrus_write(struct cedrus_dev *dev, u32 reg, u32 val) { diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -index abf17dc18ecf..c50397f8692f 100644 +index bdad87eb9d79..c6d0ef66cdd0 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -@@ -61,6 +61,15 @@ void cedrus_device_run(void *priv) +@@ -59,6 +59,15 @@ void cedrus_device_run(void *priv) V4L2_CID_MPEG_VIDEO_H264_SPS); break; @@ -729,10 +1113,10 @@ index abf17dc18ecf..c50397f8692f 100644 } diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c new file mode 100644 -index 000000000000..f1c3665e95ab +index 000000000000..fd4d86b02156 --- /dev/null +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c -@@ -0,0 +1,531 @@ +@@ -0,0 +1,532 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Cedrus VPU driver @@ -849,16 +1233,17 @@ index 000000000000..f1c3665e95ab + u32 offset = VE_DEC_H265_SRAM_OFFSET_FRAME_INFO + + VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT * index; + struct cedrus_h265_sram_frame_info frame_info = { -+ .top_pic_order_cnt = pic_order_cnt[0], -+ .bottom_pic_order_cnt = field_pic ? pic_order_cnt[1] : -+ pic_order_cnt[0], ++ .top_pic_order_cnt = cpu_to_le32(pic_order_cnt[0]), ++ .bottom_pic_order_cnt = cpu_to_le32(field_pic ? ++ pic_order_cnt[1] : ++ pic_order_cnt[0]), + .top_mv_col_buf_addr = -+ VE_DEC_H265_SRAM_DATA_ADDR_BASE(mv_col_buf_addr[0]), -+ .bottom_mv_col_buf_addr = field_pic ? ++ cpu_to_le32(VE_DEC_H265_SRAM_DATA_ADDR_BASE(mv_col_buf_addr[0])), ++ .bottom_mv_col_buf_addr = cpu_to_le32(field_pic ? + VE_DEC_H265_SRAM_DATA_ADDR_BASE(mv_col_buf_addr[1]) : -+ VE_DEC_H265_SRAM_DATA_ADDR_BASE(mv_col_buf_addr[0]), -+ .luma_addr = VE_DEC_H265_SRAM_DATA_ADDR_BASE(dst_luma_addr), -+ .chroma_addr = VE_DEC_H265_SRAM_DATA_ADDR_BASE(dst_chroma_addr), ++ VE_DEC_H265_SRAM_DATA_ADDR_BASE(mv_col_buf_addr[0])), ++ .luma_addr = cpu_to_le32(VE_DEC_H265_SRAM_DATA_ADDR_BASE(dst_luma_addr)), ++ .chroma_addr = cpu_to_le32(VE_DEC_H265_SRAM_DATA_ADDR_BASE(dst_chroma_addr)), + }; + + cedrus_h265_sram_write_offset(dev, offset); @@ -925,7 +1310,7 @@ index 000000000000..f1c3665e95ab + u32 sram_luma_offset, + u32 sram_chroma_offset) +{ -+ struct cedrus_h265_sram_pred_weight pred_weight[2] = { 0 }; ++ struct cedrus_h265_sram_pred_weight pred_weight[2] = { { 0 } }; + unsigned int i, j; + + cedrus_h265_sram_write_offset(dev, sram_luma_offset); @@ -1265,7 +1650,7 @@ index 000000000000..f1c3665e95ab + .trigger = cedrus_h265_trigger, +}; diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -index ab402b0cac4e..6be604c52d5c 100644 +index c34aec7c6e40..7d2f6eedfc28 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c @@ -50,6 +50,10 @@ int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec) @@ -1592,7 +1977,7 @@ index 3e9931416e45..87651d6b6227 100644 #define VE_H264_SPS_MBS_ONLY BIT(18) #define VE_H264_SPS_MB_ADAPTIVE_FRAME_FIELD BIT(17) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -index d1c0562d1a62..b871976b5ead 100644 +index e2b530b1a956..6cc65d85cf98 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c @@ -41,6 +41,11 @@ static struct cedrus_format cedrus_formats[] = { @@ -1626,3 +2011,5 @@ index d1c0562d1a62..b871976b5ead 100644 default: return -EINVAL; } +-- +2.21.0 diff --git a/projects/Allwinner/patches/linux/0005-media-cedrus-Add-H264-decoding-support.patch b/projects/Allwinner/patches/linux/0005-media-cedrus-Add-H264-decoding-support.patch deleted file mode 100644 index 923ccba80d..0000000000 --- a/projects/Allwinner/patches/linux/0005-media-cedrus-Add-H264-decoding-support.patch +++ /dev/null @@ -1,1420 +0,0 @@ -Date: Thu, 4 Apr 2019 14:59:02 +0200 - -From: Pawel Osciak - -Stateless video codecs will require both the H264 metadata and slices in -order to be able to decode frames. - -This introduces the definitions for a new pixel format for H264 slices that -have been parsed, as well as the structures used to pass the metadata from -the userspace to the kernel. - -Reviewed-by: Tomasz Figa -Signed-off-by: Pawel Osciak -Signed-off-by: Guenter Roeck -Co-developed-by: Maxime Ripard -Signed-off-by: Maxime Ripard ---- - Documentation/media/uapi/v4l/biblio.rst | 9 +- - Documentation/media/uapi/v4l/ext-ctrls-codec.rst | 569 ++++++++++++++- - Documentation/media/uapi/v4l/pixfmt-compressed.rst | 19 +- - Documentation/media/uapi/v4l/vidioc-queryctrl.rst | 30 +- - Documentation/media/videodev2.h.rst.exceptions | 5 +- - drivers/media/v4l2-core/v4l2-ctrls.c | 42 +- - drivers/media/v4l2-core/v4l2-ioctl.c | 1 +- - include/media/h264-ctrls.h | 192 +++++- - include/media/v4l2-ctrls.h | 13 +- - include/uapi/linux/videodev2.h | 1 +- - 10 files changed, 880 insertions(+), 1 deletion(-) - create mode 100644 include/media/h264-ctrls.h - -diff --git a/Documentation/media/uapi/v4l/biblio.rst b/Documentation/media/uapi/v4l/biblio.rst -index ec33768c055e..8f4eb8823d82 100644 ---- a/Documentation/media/uapi/v4l/biblio.rst -+++ b/Documentation/media/uapi/v4l/biblio.rst -@@ -122,6 +122,15 @@ ITU BT.1119 - - :author: International Telecommunication Union (http://www.itu.ch) - -+.. _h264: -+ -+ITU-T Rec. H.264 Specification (04/2017 Edition) -+================================================ -+ -+:title: ITU-T Recommendation H.264 "Advanced Video Coding for Generic Audiovisual Services" -+ -+:author: International Telecommunication Union (http://www.itu.ch) -+ - .. _jfif: - - JFIF -diff --git a/Documentation/media/uapi/v4l/pixfmt-compressed.rst b/Documentation/media/uapi/v4l/pixfmt-compressed.rst -index 6c961cfb74da..ea0a8a68759b 100644 ---- a/Documentation/media/uapi/v4l/pixfmt-compressed.rst -+++ b/Documentation/media/uapi/v4l/pixfmt-compressed.rst -@@ -52,6 +52,25 @@ Compressed Formats - - ``V4L2_PIX_FMT_H264_MVC`` - - 'M264' - - H264 MVC video elementary stream. -+ * .. _V4L2-PIX-FMT-H264-SLICE: -+ -+ - ``V4L2_PIX_FMT_H264_SLICE_RAW`` -+ - 'S264' -+ - H264 parsed slice data, as extracted from the H264 bitstream. -+ This format is adapted for stateless video decoders that -+ implement an H264 pipeline (using the :ref:`codec` and -+ :ref:`media-request-api`). Metadata associated with the frame -+ to decode are required to be passed through the -+ ``V4L2_CID_MPEG_VIDEO_H264_SPS``, -+ ``V4L2_CID_MPEG_VIDEO_H264_PPS``, -+ ``V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX``, -+ ``V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS`` and -+ ``V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS`` controls. See the -+ :ref:`associated Codec Control IDs `. -+ Exactly one output and one capture buffer must be provided for -+ use with this pixel format. The output buffer must contain the -+ appropriate number of macroblocks to decode a full -+ corresponding frame to the matching capture buffer. - * .. _V4L2-PIX-FMT-H263: - - - ``V4L2_PIX_FMT_H263`` -diff --git a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst -index f824162d0ea9..dc500632095d 100644 ---- a/Documentation/media/uapi/v4l/vidioc-queryctrl.rst -+++ b/Documentation/media/uapi/v4l/vidioc-queryctrl.rst -@@ -443,6 +443,36 @@ See also the examples in :ref:`control`. - - n/a - - A struct :c:type:`v4l2_ctrl_mpeg2_quantization`, containing MPEG-2 - quantization matrices for stateless video decoders. -+ * - ``V4L2_CTRL_TYPE_H264_SPS`` -+ - n/a -+ - n/a -+ - n/a -+ - A struct :c:type:`v4l2_ctrl_h264_sps`, containing H264 -+ sequence parameters for stateless video decoders. -+ * - ``V4L2_CTRL_TYPE_H264_PPS`` -+ - n/a -+ - n/a -+ - n/a -+ - A struct :c:type:`v4l2_ctrl_h264_pps`, containing H264 -+ picture parameters for stateless video decoders. -+ * - ``V4L2_CTRL_TYPE_H264_SCALING_MATRIX`` -+ - n/a -+ - n/a -+ - n/a -+ - A struct :c:type:`v4l2_ctrl_h264_scaling_matrix`, containing H264 -+ scaling matrices for stateless video decoders. -+ * - ``V4L2_CTRL_TYPE_H264_SLICE_PARAMS`` -+ - n/a -+ - n/a -+ - n/a -+ - A struct :c:type:`v4l2_ctrl_h264_slice_params`, containing H264 -+ slice parameters for stateless video decoders. -+ * - ``V4L2_CTRL_TYPE_H264_DECODE_PARAMS`` -+ - n/a -+ - n/a -+ - n/a -+ - A struct :c:type:`v4l2_ctrl_h264_decode_params`, containing H264 -+ decode parameters for stateless video decoders. - - .. tabularcolumns:: |p{6.6cm}|p{2.2cm}|p{8.7cm}| - -diff --git a/Documentation/media/videodev2.h.rst.exceptions b/Documentation/media/videodev2.h.rst.exceptions -index 64d348e67df9..55cbe324b9fc 100644 ---- a/Documentation/media/videodev2.h.rst.exceptions -+++ b/Documentation/media/videodev2.h.rst.exceptions -@@ -136,6 +136,11 @@ replace symbol V4L2_CTRL_TYPE_U32 :c:type:`v4l2_ctrl_type` - replace symbol V4L2_CTRL_TYPE_U8 :c:type:`v4l2_ctrl_type` - replace symbol V4L2_CTRL_TYPE_MPEG2_SLICE_PARAMS :c:type:`v4l2_ctrl_type` - replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTIZATION :c:type:`v4l2_ctrl_type` -+replace symbol V4L2_CTRL_TYPE_H264_SPS :c:type:`v4l2_ctrl_type` -+replace symbol V4L2_CTRL_TYPE_H264_PPS :c:type:`v4l2_ctrl_type` -+replace symbol V4L2_CTRL_TYPE_H264_SCALING_MATRIX :c:type:`v4l2_ctrl_type` -+replace symbol V4L2_CTRL_TYPE_H264_SLICE_PARAMS :c:type:`v4l2_ctrl_type` -+replace symbol V4L2_CTRL_TYPE_H264_DECODE_PARAMS :c:type:`v4l2_ctrl_type` - - # V4L2 capability defines - replace define V4L2_CAP_VIDEO_CAPTURE device-capabilities -diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index b1ae2e555c68..46aec8c3acde 100644 ---- a/drivers/media/v4l2-core/v4l2-ctrls.c -+++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -828,6 +828,11 @@ const char *v4l2_ctrl_get_name(u32 id) - case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION: - return "H264 Constrained Intra Pred"; - case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET: return "H264 Chroma QP Index Offset"; -+ case V4L2_CID_MPEG_VIDEO_H264_SPS: return "H264 Sequence Parameter Set"; -+ case V4L2_CID_MPEG_VIDEO_H264_PPS: return "H264 Picture Parameter Set"; -+ case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX: return "H264 Scaling Matrix"; -+ case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS: return "H264 Slice Parameters"; -+ case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS: return "H264 Decode Parameters"; - case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP: return "MPEG4 I-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP: return "MPEG4 P-Frame QP Value"; - case V4L2_CID_MPEG_VIDEO_MPEG4_B_FRAME_QP: return "MPEG4 B-Frame QP Value"; -@@ -1309,6 +1314,21 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, - case V4L2_CID_MPEG_VIDEO_FWHT_PARAMS: - *type = V4L2_CTRL_TYPE_FWHT_PARAMS; - break; -+ case V4L2_CID_MPEG_VIDEO_H264_SPS: -+ *type = V4L2_CTRL_TYPE_H264_SPS; -+ break; -+ case V4L2_CID_MPEG_VIDEO_H264_PPS: -+ *type = V4L2_CTRL_TYPE_H264_PPS; -+ break; -+ case V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX: -+ *type = V4L2_CTRL_TYPE_H264_SCALING_MATRIX; -+ break; -+ case V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS: -+ *type = V4L2_CTRL_TYPE_H264_SLICE_PARAMS; -+ break; -+ case V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS: -+ *type = V4L2_CTRL_TYPE_H264_DECODE_PARAMS; -+ break; - default: - *type = V4L2_CTRL_TYPE_INTEGER; - break; -@@ -1678,6 +1698,13 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, - case V4L2_CTRL_TYPE_FWHT_PARAMS: - return 0; - -+ case V4L2_CTRL_TYPE_H264_SPS: -+ case V4L2_CTRL_TYPE_H264_PPS: -+ case V4L2_CTRL_TYPE_H264_SCALING_MATRIX: -+ case V4L2_CTRL_TYPE_H264_SLICE_PARAMS: -+ case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: -+ return 0; -+ - default: - return -EINVAL; - } -@@ -2261,6 +2288,21 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, - case V4L2_CTRL_TYPE_FWHT_PARAMS: - elem_size = sizeof(struct v4l2_ctrl_fwht_params); - break; -+ case V4L2_CTRL_TYPE_H264_SPS: -+ elem_size = sizeof(struct v4l2_ctrl_h264_sps); -+ break; -+ case V4L2_CTRL_TYPE_H264_PPS: -+ elem_size = sizeof(struct v4l2_ctrl_h264_pps); -+ break; -+ case V4L2_CTRL_TYPE_H264_SCALING_MATRIX: -+ elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix); -+ break; -+ case V4L2_CTRL_TYPE_H264_SLICE_PARAMS: -+ elem_size = sizeof(struct v4l2_ctrl_h264_slice_params); -+ break; -+ case V4L2_CTRL_TYPE_H264_DECODE_PARAMS: -+ elem_size = sizeof(struct v4l2_ctrl_h264_decode_params); -+ break; - default: - if (type < V4L2_CTRL_COMPOUND_TYPES) - elem_size = sizeof(s32); -diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c -index ac87c3e37280..f6e1254064d2 100644 ---- a/drivers/media/v4l2-core/v4l2-ioctl.c -+++ b/drivers/media/v4l2-core/v4l2-ioctl.c -@@ -1325,6 +1325,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) - case V4L2_PIX_FMT_H264: descr = "H.264"; break; - case V4L2_PIX_FMT_H264_NO_SC: descr = "H.264 (No Start Codes)"; break; - case V4L2_PIX_FMT_H264_MVC: descr = "H.264 MVC"; break; -+ case V4L2_PIX_FMT_H264_SLICE_RAW: descr = "H.264 Parsed Slice Data"; break; - case V4L2_PIX_FMT_H263: descr = "H.263"; break; - case V4L2_PIX_FMT_MPEG1: descr = "MPEG-1 ES"; break; - case V4L2_PIX_FMT_MPEG2: descr = "MPEG-2 ES"; break; -diff --git a/include/media/h264-ctrls.h b/include/media/h264-ctrls.h -new file mode 100644 -index 000000000000..e2f83b3cdbef ---- /dev/null -+++ b/include/media/h264-ctrls.h -@@ -0,0 +1,192 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+/* -+ * These are the H.264 state controls for use with stateless H.264 -+ * codec drivers. -+ * -+ * It turns out that these structs are not stable yet and will undergo -+ * more changes. So keep them private until they are stable and ready to -+ * become part of the official public API. -+ */ -+ -+#ifndef _H264_CTRLS_H_ -+#define _H264_CTRLS_H_ -+ -+/* -+ * This is put insanely high to avoid conflicting with controls that -+ * would be added during the phase where those controls are not -+ * stable. It should be fixed eventually. -+ */ -+#define V4L2_CID_MPEG_VIDEO_H264_SPS (V4L2_CID_MPEG_BASE+1000) -+#define V4L2_CID_MPEG_VIDEO_H264_PPS (V4L2_CID_MPEG_BASE+1001) -+#define V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX (V4L2_CID_MPEG_BASE+1002) -+#define V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS (V4L2_CID_MPEG_BASE+1003) -+#define V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS (V4L2_CID_MPEG_BASE+1004) -+ -+/* enum v4l2_ctrl_type type values */ -+#define V4L2_CTRL_TYPE_H264_SPS 0x0110 -+#define V4L2_CTRL_TYPE_H264_PPS 0x0111 -+#define V4L2_CTRL_TYPE_H264_SCALING_MATRIX 0x0112 -+#define V4L2_CTRL_TYPE_H264_SLICE_PARAMS 0x0113 -+#define V4L2_CTRL_TYPE_H264_DECODE_PARAMS 0x0114 -+ -+#define V4L2_H264_SPS_CONSTRAINT_SET0_FLAG 0x01 -+#define V4L2_H264_SPS_CONSTRAINT_SET1_FLAG 0x02 -+#define V4L2_H264_SPS_CONSTRAINT_SET2_FLAG 0x04 -+#define V4L2_H264_SPS_CONSTRAINT_SET3_FLAG 0x08 -+#define V4L2_H264_SPS_CONSTRAINT_SET4_FLAG 0x10 -+#define V4L2_H264_SPS_CONSTRAINT_SET5_FLAG 0x20 -+ -+#define V4L2_H264_SPS_FLAG_SEPARATE_COLOUR_PLANE 0x01 -+#define V4L2_H264_SPS_FLAG_QPPRIME_Y_ZERO_TRANSFORM_BYPASS 0x02 -+#define V4L2_H264_SPS_FLAG_DELTA_PIC_ORDER_ALWAYS_ZERO 0x04 -+#define V4L2_H264_SPS_FLAG_GAPS_IN_FRAME_NUM_VALUE_ALLOWED 0x08 -+#define V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY 0x10 -+#define V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD 0x20 -+#define V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE 0x40 -+ -+struct v4l2_ctrl_h264_sps { -+ __u8 profile_idc; -+ __u8 constraint_set_flags; -+ __u8 level_idc; -+ __u8 seq_parameter_set_id; -+ __u8 chroma_format_idc; -+ __u8 bit_depth_luma_minus8; -+ __u8 bit_depth_chroma_minus8; -+ __u8 log2_max_frame_num_minus4; -+ __u8 pic_order_cnt_type; -+ __u8 log2_max_pic_order_cnt_lsb_minus4; -+ __u8 max_num_ref_frames; -+ __u8 num_ref_frames_in_pic_order_cnt_cycle; -+ __s32 offset_for_ref_frame[255]; -+ __s32 offset_for_non_ref_pic; -+ __s32 offset_for_top_to_bottom_field; -+ __u16 pic_width_in_mbs_minus1; -+ __u16 pic_height_in_map_units_minus1; -+ __u32 flags; -+}; -+ -+#define V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE 0x0001 -+#define V4L2_H264_PPS_FLAG_BOTTOM_FIELD_PIC_ORDER_IN_FRAME_PRESENT 0x0002 -+#define V4L2_H264_PPS_FLAG_WEIGHTED_PRED 0x0004 -+#define V4L2_H264_PPS_FLAG_DEBLOCKING_FILTER_CONTROL_PRESENT 0x0008 -+#define V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED 0x0010 -+#define V4L2_H264_PPS_FLAG_REDUNDANT_PIC_CNT_PRESENT 0x0020 -+#define V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE 0x0040 -+#define V4L2_H264_PPS_FLAG_PIC_SCALING_MATRIX_PRESENT 0x0080 -+ -+struct v4l2_ctrl_h264_pps { -+ __u8 pic_parameter_set_id; -+ __u8 seq_parameter_set_id; -+ __u8 num_slice_groups_minus1; -+ __u8 num_ref_idx_l0_default_active_minus1; -+ __u8 num_ref_idx_l1_default_active_minus1; -+ __u8 weighted_bipred_idc; -+ __s8 pic_init_qp_minus26; -+ __s8 pic_init_qs_minus26; -+ __s8 chroma_qp_index_offset; -+ __s8 second_chroma_qp_index_offset; -+ __u16 flags; -+}; -+ -+struct v4l2_ctrl_h264_scaling_matrix { -+ __u8 scaling_list_4x4[6][16]; -+ __u8 scaling_list_8x8[6][64]; -+}; -+ -+struct v4l2_h264_weight_factors { -+ __s16 luma_weight[32]; -+ __s16 luma_offset[32]; -+ __s16 chroma_weight[32][2]; -+ __s16 chroma_offset[32][2]; -+}; -+ -+struct v4l2_h264_pred_weight_table { -+ __u16 luma_log2_weight_denom; -+ __u16 chroma_log2_weight_denom; -+ struct v4l2_h264_weight_factors weight_factors[2]; -+}; -+ -+#define V4L2_H264_SLICE_TYPE_P 0 -+#define V4L2_H264_SLICE_TYPE_B 1 -+#define V4L2_H264_SLICE_TYPE_I 2 -+#define V4L2_H264_SLICE_TYPE_SP 3 -+#define V4L2_H264_SLICE_TYPE_SI 4 -+ -+#define V4L2_H264_SLICE_FLAG_FIELD_PIC 0x01 -+#define V4L2_H264_SLICE_FLAG_BOTTOM_FIELD 0x02 -+#define V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED 0x04 -+#define V4L2_H264_SLICE_FLAG_SP_FOR_SWITCH 0x08 -+ -+struct v4l2_ctrl_h264_slice_params { -+ /* Size in bytes, including header */ -+ __u32 size; -+ /* Offset in bits to slice_data() from the beginning of this slice. */ -+ __u32 header_bit_size; -+ -+ __u16 first_mb_in_slice; -+ __u8 slice_type; -+ __u8 pic_parameter_set_id; -+ __u8 colour_plane_id; -+ __u8 redundant_pic_cnt; -+ __u16 frame_num; -+ __u16 idr_pic_id; -+ __u16 pic_order_cnt_lsb; -+ __s32 delta_pic_order_cnt_bottom; -+ __s32 delta_pic_order_cnt0; -+ __s32 delta_pic_order_cnt1; -+ -+ struct v4l2_h264_pred_weight_table pred_weight_table; -+ /* Size in bits of dec_ref_pic_marking() syntax element. */ -+ __u32 dec_ref_pic_marking_bit_size; -+ /* Size in bits of pic order count syntax. */ -+ __u32 pic_order_cnt_bit_size; -+ -+ __u8 cabac_init_idc; -+ __s8 slice_qp_delta; -+ __s8 slice_qs_delta; -+ __u8 disable_deblocking_filter_idc; -+ __s8 slice_alpha_c0_offset_div2; -+ __s8 slice_beta_offset_div2; -+ __u8 num_ref_idx_l0_active_minus1; -+ __u8 num_ref_idx_l1_active_minus1; -+ __u32 slice_group_change_cycle; -+ -+ /* -+ * Entries on each list are indices into -+ * v4l2_ctrl_h264_decode_params.dpb[]. -+ */ -+ __u8 ref_pic_list0[32]; -+ __u8 ref_pic_list1[32]; -+ -+ __u32 flags; -+}; -+ -+#define V4L2_H264_DPB_ENTRY_FLAG_VALID 0x01 -+#define V4L2_H264_DPB_ENTRY_FLAG_ACTIVE 0x02 -+#define V4L2_H264_DPB_ENTRY_FLAG_LONG_TERM 0x04 -+ -+struct v4l2_h264_dpb_entry { -+ __u64 reference_ts; -+ __u16 frame_num; -+ __u16 pic_num; -+ /* Note that field is indicated by v4l2_buffer.field */ -+ __s32 top_field_order_cnt; -+ __s32 bottom_field_order_cnt; -+ __u32 flags; /* V4L2_H264_DPB_ENTRY_FLAG_* */ -+}; -+ -+#define V4L2_H264_DECODE_PARAM_FLAG_IDR_PIC 0x01 -+ -+struct v4l2_ctrl_h264_decode_params { -+ struct v4l2_h264_dpb_entry dpb[16]; -+ __u16 num_slices; -+ __u16 nal_ref_idc; -+ __u8 ref_pic_list_p0[32]; -+ __u8 ref_pic_list_b0[32]; -+ __u8 ref_pic_list_b1[32]; -+ __s32 top_field_order_cnt; -+ __s32 bottom_field_order_cnt; -+ __u32 flags; /* V4L2_H264_DECODE_PARAM_FLAG_* */ -+}; -+ -+#endif -diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h -index bd621cec65a5..dce6f33fd749 100644 ---- a/include/media/v4l2-ctrls.h -+++ b/include/media/v4l2-ctrls.h -@@ -23,11 +23,12 @@ - #include - - /* -- * Include the mpeg2 and fwht stateless codec compound control definitions. -+ * Include the stateless codec compound control definitions. - * This will move to the public headers once this API is fully stable. - */ - #include - #include -+#include - - /* forward references */ - struct file; -@@ -51,6 +52,11 @@ struct poll_table_struct; - * @p_mpeg2_slice_params: Pointer to a MPEG2 slice parameters structure. - * @p_mpeg2_quantization: Pointer to a MPEG2 quantization data structure. - * @p_fwht_params: Pointer to a FWHT stateless parameters structure. -+ * @p_h264_sps: Pointer to a struct v4l2_ctrl_h264_sps. -+ * @p_h264_pps: Pointer to a struct v4l2_ctrl_h264_pps. -+ * @p_h264_scaling_matrix: Pointer to a struct v4l2_ctrl_h264_scaling_matrix. -+ * @p_h264_slice_param: Pointer to a struct v4l2_ctrl_h264_slice_params. -+ * @p_h264_decode_param: Pointer to a struct v4l2_ctrl_h264_decode_params. - * @p: Pointer to a compound value. - */ - union v4l2_ctrl_ptr { -@@ -63,6 +69,11 @@ union v4l2_ctrl_ptr { - struct v4l2_ctrl_mpeg2_slice_params *p_mpeg2_slice_params; - struct v4l2_ctrl_mpeg2_quantization *p_mpeg2_quantization; - struct v4l2_ctrl_fwht_params *p_fwht_params; -+ struct v4l2_ctrl_h264_sps *p_h264_sps; -+ struct v4l2_ctrl_h264_pps *p_h264_pps; -+ struct v4l2_ctrl_h264_scaling_matrix *p_h264_scaling_matrix; -+ struct v4l2_ctrl_h264_slice_params *p_h264_slice_param; -+ struct v4l2_ctrl_h264_decode_params *p_h264_decode_param; - void *p; - }; - -diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h -index 496e6453450c..838732acdefc 100644 ---- a/include/uapi/linux/videodev2.h -+++ b/include/uapi/linux/videodev2.h -@@ -657,6 +657,7 @@ struct v4l2_pix_format { - #define V4L2_PIX_FMT_H264 v4l2_fourcc('H', '2', '6', '4') /* H264 with start codes */ - #define V4L2_PIX_FMT_H264_NO_SC v4l2_fourcc('A', 'V', 'C', '1') /* H264 without start codes */ - #define V4L2_PIX_FMT_H264_MVC v4l2_fourcc('M', '2', '6', '4') /* H264 MVC */ -+#define V4L2_PIX_FMT_H264_SLICE_RAW v4l2_fourcc('S', '2', '6', '4') /* H264 parsed slices */ - #define V4L2_PIX_FMT_H263 v4l2_fourcc('H', '2', '6', '3') /* H263 */ - #define V4L2_PIX_FMT_MPEG1 v4l2_fourcc('M', 'P', 'G', '1') /* MPEG-1 ES */ - #define V4L2_PIX_FMT_MPEG2 v4l2_fourcc('M', 'P', 'G', '2') /* MPEG-2 ES */ -From patchwork Thu Apr 4 12:59:03 2019 -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: 7bit -Subject: [v8,2/2] media: cedrus: Add H264 decoding support -From: Maxime Ripard -X-Patchwork-Id: 55457 -Message-Id: <157519b5571e24c9ef4189d30f8434b5b61121b1.1554382670.git-series.maxime.ripard@bootlin.com> -X-Patchwork-Delegate: hverkuil@xs4all.nl -To: hans.verkuil@cisco.com, acourbot@chromium.org, - sakari.ailus@linux.intel.com, - Laurent Pinchart -Cc: tfiga@chromium.org, posciak@chromium.org, - Paul Kocialkowski , - Chen-Yu Tsai , linux-kernel@vger.kernel.org, - linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, - nicolas.dufresne@collabora.com, jenskuske@gmail.com, - jernej.skrabec@gmail.com, jonas@kwiboo.se, ezequiel@collabora.com, - linux-sunxi@googlegroups.com, - Thomas Petazzoni , - Maxime Ripard , - Jernej Skrabec -Date: Thu, 4 Apr 2019 14:59:03 +0200 - -Introduce some basic H264 decoding support in cedrus. So far, only the -baseline profile videos have been tested, and some more advanced features -used in higher profiles are not even implemented. - -Reviewed-by: Jernej Skrabec -Signed-off-by: Maxime Ripard ---- - drivers/staging/media/sunxi/cedrus/Makefile | 3 +- - drivers/staging/media/sunxi/cedrus/cedrus.c | 31 +- - drivers/staging/media/sunxi/cedrus/cedrus.h | 38 +- - drivers/staging/media/sunxi/cedrus/cedrus_dec.c | 13 +- - drivers/staging/media/sunxi/cedrus/cedrus_h264.c | 574 +++++++++++++++- - drivers/staging/media/sunxi/cedrus/cedrus_hw.c | 4 +- - drivers/staging/media/sunxi/cedrus/cedrus_regs.h | 91 ++- - drivers/staging/media/sunxi/cedrus/cedrus_video.c | 9 +- - 8 files changed, 761 insertions(+), 2 deletions(-) - create mode 100644 drivers/staging/media/sunxi/cedrus/cedrus_h264.c - -diff --git a/drivers/staging/media/sunxi/cedrus/Makefile b/drivers/staging/media/sunxi/cedrus/Makefile -index 808842f0119e..c85ac6db0302 100644 ---- a/drivers/staging/media/sunxi/cedrus/Makefile -+++ b/drivers/staging/media/sunxi/cedrus/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 - obj-$(CONFIG_VIDEO_SUNXI_CEDRUS) += sunxi-cedrus.o - --sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o cedrus_mpeg2.o -+sunxi-cedrus-y = cedrus.o cedrus_video.o cedrus_hw.o cedrus_dec.o \ -+ cedrus_mpeg2.o cedrus_h264.o -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c -index b98add3cdedd..d613f5c24a2f 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus.c -@@ -40,6 +40,36 @@ static const struct cedrus_control cedrus_controls[] = { - .codec = CEDRUS_CODEC_MPEG2, - .required = false, - }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS, -+ .elem_size = sizeof(struct v4l2_ctrl_h264_decode_params), -+ .codec = CEDRUS_CODEC_H264, -+ .required = true, -+ }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS, -+ .elem_size = sizeof(struct v4l2_ctrl_h264_slice_params), -+ .codec = CEDRUS_CODEC_H264, -+ .required = true, -+ }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_H264_SPS, -+ .elem_size = sizeof(struct v4l2_ctrl_h264_sps), -+ .codec = CEDRUS_CODEC_H264, -+ .required = true, -+ }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_H264_PPS, -+ .elem_size = sizeof(struct v4l2_ctrl_h264_pps), -+ .codec = CEDRUS_CODEC_H264, -+ .required = true, -+ }, -+ { -+ .id = V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX, -+ .elem_size = sizeof(struct v4l2_ctrl_h264_scaling_matrix), -+ .codec = CEDRUS_CODEC_H264, -+ .required = true, -+ }, - }; - - #define CEDRUS_CONTROLS_COUNT ARRAY_SIZE(cedrus_controls) -@@ -278,6 +308,7 @@ static int cedrus_probe(struct platform_device *pdev) - } - - dev->dec_ops[CEDRUS_CODEC_MPEG2] = &cedrus_dec_ops_mpeg2; -+ dev->dec_ops[CEDRUS_CODEC_H264] = &cedrus_dec_ops_h264; - - mutex_init(&dev->dev_mutex); - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index c57c04b41d2e..bef79f630520 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -32,7 +32,7 @@ - - enum cedrus_codec { - CEDRUS_CODEC_MPEG2, -- -+ CEDRUS_CODEC_H264, - CEDRUS_CODEC_LAST, - }; - -@@ -42,6 +42,12 @@ enum cedrus_irq_status { - CEDRUS_IRQ_OK, - }; - -+enum cedrus_h264_pic_type { -+ CEDRUS_H264_PIC_TYPE_FRAME = 0, -+ CEDRUS_H264_PIC_TYPE_FIELD, -+ CEDRUS_H264_PIC_TYPE_MBAFF, -+}; -+ - struct cedrus_control { - u32 id; - u32 elem_size; -@@ -49,6 +55,14 @@ struct cedrus_control { - unsigned char required:1; - }; - -+struct cedrus_h264_run { -+ const struct v4l2_ctrl_h264_decode_params *decode_params; -+ const struct v4l2_ctrl_h264_pps *pps; -+ const struct v4l2_ctrl_h264_scaling_matrix *scaling_matrix; -+ const struct v4l2_ctrl_h264_slice_params *slice_params; -+ const struct v4l2_ctrl_h264_sps *sps; -+}; -+ - struct cedrus_mpeg2_run { - const struct v4l2_ctrl_mpeg2_slice_params *slice_params; - const struct v4l2_ctrl_mpeg2_quantization *quantization; -@@ -59,12 +73,20 @@ struct cedrus_run { - struct vb2_v4l2_buffer *dst; - - union { -+ struct cedrus_h264_run h264; - struct cedrus_mpeg2_run mpeg2; - }; - }; - - struct cedrus_buffer { - struct v4l2_m2m_buffer m2m_buf; -+ -+ union { -+ struct { -+ unsigned int position; -+ enum cedrus_h264_pic_type pic_type; -+ } h264; -+ } codec; - }; - - struct cedrus_ctx { -@@ -79,6 +101,19 @@ struct cedrus_ctx { - struct v4l2_ctrl **ctrls; - - struct vb2_buffer *dst_bufs[VIDEO_MAX_FRAME]; -+ -+ union { -+ struct { -+ void *mv_col_buf; -+ dma_addr_t mv_col_buf_dma; -+ ssize_t mv_col_buf_field_size; -+ ssize_t mv_col_buf_size; -+ void *pic_info_buf; -+ dma_addr_t pic_info_buf_dma; -+ void *neighbor_info_buf; -+ dma_addr_t neighbor_info_buf_dma; -+ } h264; -+ } codec; - }; - - struct cedrus_dec_ops { -@@ -121,6 +156,7 @@ struct cedrus_dev { - }; - - extern struct cedrus_dec_ops cedrus_dec_ops_mpeg2; -+extern struct cedrus_dec_ops cedrus_dec_ops_h264; - - static inline void cedrus_write(struct cedrus_dev *dev, u32 reg, u32 val) - { -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -index 4d6d602cdde6..bdad87eb9d79 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -@@ -46,6 +46,19 @@ void cedrus_device_run(void *priv) - V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION); - break; - -+ case V4L2_PIX_FMT_H264_SLICE_RAW: -+ run.h264.decode_params = cedrus_find_control_data(ctx, -+ V4L2_CID_MPEG_VIDEO_H264_DECODE_PARAMS); -+ run.h264.pps = cedrus_find_control_data(ctx, -+ V4L2_CID_MPEG_VIDEO_H264_PPS); -+ run.h264.scaling_matrix = cedrus_find_control_data(ctx, -+ V4L2_CID_MPEG_VIDEO_H264_SCALING_MATRIX); -+ run.h264.slice_params = cedrus_find_control_data(ctx, -+ V4L2_CID_MPEG_VIDEO_H264_SLICE_PARAMS); -+ run.h264.sps = cedrus_find_control_data(ctx, -+ V4L2_CID_MPEG_VIDEO_H264_SPS); -+ break; -+ - default: - break; - } -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -new file mode 100644 -index 000000000000..2c98a3e46d2b ---- /dev/null -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -@@ -0,0 +1,574 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Cedrus VPU driver -+ * -+ * Copyright (c) 2013 Jens Kuske -+ * Copyright (c) 2018 Bootlin -+ */ -+ -+#include -+ -+#include -+ -+#include "cedrus.h" -+#include "cedrus_hw.h" -+#include "cedrus_regs.h" -+ -+enum cedrus_h264_sram_off { -+ CEDRUS_SRAM_H264_PRED_WEIGHT_TABLE = 0x000, -+ CEDRUS_SRAM_H264_FRAMEBUFFER_LIST = 0x100, -+ CEDRUS_SRAM_H264_REF_LIST_0 = 0x190, -+ CEDRUS_SRAM_H264_REF_LIST_1 = 0x199, -+ CEDRUS_SRAM_H264_SCALING_LIST_8x8_0 = 0x200, -+ CEDRUS_SRAM_H264_SCALING_LIST_8x8_1 = 0x210, -+ CEDRUS_SRAM_H264_SCALING_LIST_4x4 = 0x220, -+}; -+ -+struct cedrus_h264_sram_ref_pic { -+ __le32 top_field_order_cnt; -+ __le32 bottom_field_order_cnt; -+ __le32 frame_info; -+ __le32 luma_ptr; -+ __le32 chroma_ptr; -+ __le32 mv_col_top_ptr; -+ __le32 mv_col_bot_ptr; -+ __le32 reserved; -+} __packed; -+ -+#define CEDRUS_H264_FRAME_NUM 18 -+ -+#define CEDRUS_NEIGHBOR_INFO_BUF_SIZE (16 * SZ_1K) -+#define CEDRUS_PIC_INFO_BUF_SIZE (128 * SZ_1K) -+ -+static void cedrus_h264_write_sram(struct cedrus_dev *dev, -+ enum cedrus_h264_sram_off off, -+ const void *data, size_t len) -+{ -+ const u32 *buffer = data; -+ size_t count = DIV_ROUND_UP(len, 4); -+ -+ cedrus_write(dev, VE_AVC_SRAM_PORT_OFFSET, off << 2); -+ -+ while (count--) -+ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, *buffer++); -+} -+ -+static dma_addr_t cedrus_h264_mv_col_buf_addr(struct cedrus_ctx *ctx, -+ unsigned int position, -+ unsigned int field) -+{ -+ dma_addr_t addr = ctx->codec.h264.mv_col_buf_dma; -+ -+ /* Adjust for the position */ -+ addr += position * ctx->codec.h264.mv_col_buf_field_size * 2; -+ -+ /* Adjust for the field */ -+ addr += field * ctx->codec.h264.mv_col_buf_field_size; -+ -+ return addr; -+} -+ -+static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx, -+ struct cedrus_buffer *buf, -+ unsigned int top_field_order_cnt, -+ unsigned int bottom_field_order_cnt, -+ struct cedrus_h264_sram_ref_pic *pic) -+{ -+ struct vb2_buffer *vbuf = &buf->m2m_buf.vb.vb2_buf; -+ unsigned int position = buf->codec.h264.position; -+ -+ pic->top_field_order_cnt = top_field_order_cnt; -+ pic->bottom_field_order_cnt = bottom_field_order_cnt; -+ pic->frame_info = buf->codec.h264.pic_type << 8; -+ -+ pic->luma_ptr = cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0); -+ pic->chroma_ptr = cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1); -+ pic->mv_col_top_ptr = cedrus_h264_mv_col_buf_addr(ctx, position, 0); -+ pic->mv_col_bot_ptr = cedrus_h264_mv_col_buf_addr(ctx, position, 1); -+} -+ -+static void cedrus_write_frame_list(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ struct cedrus_h264_sram_ref_pic pic_list[CEDRUS_H264_FRAME_NUM]; -+ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; -+ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; -+ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; -+ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; -+ struct cedrus_buffer *output_buf; -+ struct cedrus_dev *dev = ctx->dev; -+ unsigned long used_dpbs = 0; -+ unsigned int position; -+ unsigned int output = 0; -+ unsigned int i; -+ -+ memset(pic_list, 0, sizeof(pic_list)); -+ -+ for (i = 0; i < ARRAY_SIZE(decode->dpb); i++) { -+ const struct v4l2_h264_dpb_entry *dpb = &decode->dpb[i]; -+ struct cedrus_buffer *cedrus_buf; -+ int buf_idx; -+ -+ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_VALID)) -+ continue; -+ -+ buf_idx = vb2_find_timestamp(cap_q, dpb->reference_ts, 0); -+ if (buf_idx < 0) -+ continue; -+ -+ cedrus_buf = vb2_to_cedrus_buffer(ctx->dst_bufs[buf_idx]); -+ position = cedrus_buf->codec.h264.position; -+ used_dpbs |= BIT(position); -+ -+ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) -+ continue; -+ -+ cedrus_fill_ref_pic(ctx, cedrus_buf, -+ dpb->top_field_order_cnt, -+ dpb->bottom_field_order_cnt, -+ &pic_list[position]); -+ -+ output = max(position, output); -+ } -+ -+ position = find_next_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM, -+ output); -+ if (position >= CEDRUS_H264_FRAME_NUM) -+ position = find_first_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM); -+ -+ output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf); -+ output_buf->codec.h264.position = position; -+ -+ if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) -+ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FIELD; -+ else if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) -+ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_MBAFF; -+ else -+ output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FRAME; -+ -+ cedrus_fill_ref_pic(ctx, output_buf, -+ decode->top_field_order_cnt, -+ decode->bottom_field_order_cnt, -+ &pic_list[position]); -+ -+ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_FRAMEBUFFER_LIST, -+ pic_list, sizeof(pic_list)); -+ -+ cedrus_write(dev, VE_H264_OUTPUT_FRAME_IDX, position); -+} -+ -+#define CEDRUS_MAX_REF_IDX 32 -+ -+static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, -+ struct cedrus_run *run, -+ const u8 *ref_list, u8 num_ref, -+ enum cedrus_h264_sram_off sram) -+{ -+ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; -+ struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; -+ struct cedrus_dev *dev = ctx->dev; -+ u8 sram_array[CEDRUS_MAX_REF_IDX]; -+ unsigned int i; -+ size_t size; -+ -+ memset(sram_array, 0, sizeof(sram_array)); -+ -+ for (i = 0; i < num_ref; i++) { -+ const struct v4l2_h264_dpb_entry *dpb; -+ const struct cedrus_buffer *cedrus_buf; -+ const struct vb2_v4l2_buffer *ref_buf; -+ unsigned int position; -+ int buf_idx; -+ u8 dpb_idx; -+ -+ dpb_idx = ref_list[i]; -+ dpb = &decode->dpb[dpb_idx]; -+ -+ if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) -+ continue; -+ -+ buf_idx = vb2_find_timestamp(cap_q, dpb->reference_ts, 0); -+ if (buf_idx < 0) -+ continue; -+ -+ ref_buf = to_vb2_v4l2_buffer(ctx->dst_bufs[buf_idx]); -+ cedrus_buf = vb2_v4l2_to_cedrus_buffer(ref_buf); -+ position = cedrus_buf->codec.h264.position; -+ -+ sram_array[i] |= position << 1; -+ if (ref_buf->field == V4L2_FIELD_BOTTOM) -+ sram_array[i] |= BIT(0); -+ } -+ -+ size = min_t(size_t, ALIGN(num_ref, 4), sizeof(sram_array)); -+ cedrus_h264_write_sram(dev, sram, &sram_array, size); -+} -+ -+static void cedrus_write_ref_list0(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; -+ -+ _cedrus_write_ref_list(ctx, run, -+ slice->ref_pic_list0, -+ slice->num_ref_idx_l0_active_minus1 + 1, -+ CEDRUS_SRAM_H264_REF_LIST_0); -+} -+ -+static void cedrus_write_ref_list1(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; -+ -+ _cedrus_write_ref_list(ctx, run, -+ slice->ref_pic_list1, -+ slice->num_ref_idx_l1_active_minus1 + 1, -+ CEDRUS_SRAM_H264_REF_LIST_1); -+} -+ -+static void cedrus_write_scaling_lists(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ const struct v4l2_ctrl_h264_scaling_matrix *scaling = -+ run->h264.scaling_matrix; -+ struct cedrus_dev *dev = ctx->dev; -+ -+ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_0, -+ scaling->scaling_list_8x8[0], -+ sizeof(scaling->scaling_list_8x8[0])); -+ -+ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_8x8_1, -+ scaling->scaling_list_8x8[3], -+ sizeof(scaling->scaling_list_8x8[3])); -+ -+ cedrus_h264_write_sram(dev, CEDRUS_SRAM_H264_SCALING_LIST_4x4, -+ scaling->scaling_list_4x4, -+ sizeof(scaling->scaling_list_4x4)); -+} -+ -+static void cedrus_write_pred_weight_table(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ const struct v4l2_ctrl_h264_slice_params *slice = -+ run->h264.slice_params; -+ const struct v4l2_h264_pred_weight_table *pred_weight = -+ &slice->pred_weight_table; -+ struct cedrus_dev *dev = ctx->dev; -+ int i, j, k; -+ -+ cedrus_write(dev, VE_H264_SHS_WP, -+ ((pred_weight->chroma_log2_weight_denom & 0x7) << 4) | -+ ((pred_weight->luma_log2_weight_denom & 0x7) << 0)); -+ -+ cedrus_write(dev, VE_AVC_SRAM_PORT_OFFSET, -+ CEDRUS_SRAM_H264_PRED_WEIGHT_TABLE << 2); -+ -+ for (i = 0; i < ARRAY_SIZE(pred_weight->weight_factors); i++) { -+ const struct v4l2_h264_weight_factors *factors = -+ &pred_weight->weight_factors[i]; -+ -+ for (j = 0; j < ARRAY_SIZE(factors->luma_weight); j++) { -+ u32 val; -+ -+ val = (((u32)factors->luma_offset[j] & 0x1ff) << 16) | -+ (factors->luma_weight[j] & 0x1ff); -+ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, val); -+ } -+ -+ for (j = 0; j < ARRAY_SIZE(factors->chroma_weight); j++) { -+ for (k = 0; k < ARRAY_SIZE(factors->chroma_weight[0]); k++) { -+ u32 val; -+ -+ val = (((u32)factors->chroma_offset[j][k] & 0x1ff) << 16) | -+ (factors->chroma_weight[j][k] & 0x1ff); -+ cedrus_write(dev, VE_AVC_SRAM_PORT_DATA, val); -+ } -+ } -+ } -+} -+ -+static void cedrus_set_params(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; -+ const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; -+ const struct v4l2_ctrl_h264_pps *pps = run->h264.pps; -+ const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; -+ struct vb2_buffer *src_buf = &run->src->vb2_buf; -+ struct cedrus_dev *dev = ctx->dev; -+ dma_addr_t src_buf_addr; -+ u32 offset = slice->header_bit_size; -+ u32 len = (slice->size * 8) - offset; -+ u32 reg; -+ -+ cedrus_write(dev, VE_H264_VLD_LEN, len); -+ cedrus_write(dev, VE_H264_VLD_OFFSET, offset); -+ -+ src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); -+ cedrus_write(dev, VE_H264_VLD_END, -+ src_buf_addr + vb2_get_plane_payload(src_buf, 0)); -+ cedrus_write(dev, VE_H264_VLD_ADDR, -+ VE_H264_VLD_ADDR_VAL(src_buf_addr) | -+ VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID | -+ VE_H264_VLD_ADDR_LAST); -+ -+ /* -+ * FIXME: Since the bitstream parsing is done in software, and -+ * in userspace, this shouldn't be needed anymore. But it -+ * turns out that removing it breaks the decoding process, -+ * without any clear indication why. -+ */ -+ cedrus_write(dev, VE_H264_TRIGGER_TYPE, -+ VE_H264_TRIGGER_TYPE_INIT_SWDEC); -+ -+ if (((pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) && -+ (slice->slice_type == V4L2_H264_SLICE_TYPE_P || -+ slice->slice_type == V4L2_H264_SLICE_TYPE_SP)) || -+ (pps->weighted_bipred_idc == 1 && -+ slice->slice_type == V4L2_H264_SLICE_TYPE_B)) -+ cedrus_write_pred_weight_table(ctx, run); -+ -+ if ((slice->slice_type == V4L2_H264_SLICE_TYPE_P) || -+ (slice->slice_type == V4L2_H264_SLICE_TYPE_SP) || -+ (slice->slice_type == V4L2_H264_SLICE_TYPE_B)) -+ cedrus_write_ref_list0(ctx, run); -+ -+ if (slice->slice_type == V4L2_H264_SLICE_TYPE_B) -+ cedrus_write_ref_list1(ctx, run); -+ -+ // picture parameters -+ reg = 0; -+ /* -+ * FIXME: the kernel headers are allowing the default value to -+ * be passed, but the libva doesn't give us that. -+ */ -+ reg |= (slice->num_ref_idx_l0_active_minus1 & 0x1f) << 10; -+ reg |= (slice->num_ref_idx_l1_active_minus1 & 0x1f) << 5; -+ reg |= (pps->weighted_bipred_idc & 0x3) << 2; -+ if (pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE) -+ reg |= VE_H264_PPS_ENTROPY_CODING_MODE; -+ if (pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) -+ reg |= VE_H264_PPS_WEIGHTED_PRED; -+ if (pps->flags & V4L2_H264_PPS_FLAG_CONSTRAINED_INTRA_PRED) -+ reg |= VE_H264_PPS_CONSTRAINED_INTRA_PRED; -+ if (pps->flags & V4L2_H264_PPS_FLAG_TRANSFORM_8X8_MODE) -+ reg |= VE_H264_PPS_TRANSFORM_8X8_MODE; -+ cedrus_write(dev, VE_H264_PPS, reg); -+ -+ // sequence parameters -+ reg = 0; -+ reg |= (sps->chroma_format_idc & 0x7) << 19; -+ reg |= (sps->pic_width_in_mbs_minus1 & 0xff) << 8; -+ reg |= sps->pic_height_in_map_units_minus1 & 0xff; -+ if (sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY) -+ reg |= VE_H264_SPS_MBS_ONLY; -+ if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) -+ reg |= VE_H264_SPS_MB_ADAPTIVE_FRAME_FIELD; -+ if (sps->flags & V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE) -+ reg |= VE_H264_SPS_DIRECT_8X8_INFERENCE; -+ cedrus_write(dev, VE_H264_SPS, reg); -+ -+ // slice parameters -+ reg = 0; -+ reg |= decode->nal_ref_idc ? BIT(12) : 0; -+ reg |= (slice->slice_type & 0xf) << 8; -+ reg |= slice->cabac_init_idc & 0x3; -+ reg |= VE_H264_SHS_FIRST_SLICE_IN_PIC; -+ if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) -+ reg |= VE_H264_SHS_FIELD_PIC; -+ if (slice->flags & V4L2_H264_SLICE_FLAG_BOTTOM_FIELD) -+ reg |= VE_H264_SHS_BOTTOM_FIELD; -+ if (slice->flags & V4L2_H264_SLICE_FLAG_DIRECT_SPATIAL_MV_PRED) -+ reg |= VE_H264_SHS_DIRECT_SPATIAL_MV_PRED; -+ cedrus_write(dev, VE_H264_SHS, reg); -+ -+ reg = 0; -+ reg |= VE_H264_SHS2_NUM_REF_IDX_ACTIVE_OVRD; -+ reg |= (slice->num_ref_idx_l0_active_minus1 & 0x1f) << 24; -+ reg |= (slice->num_ref_idx_l1_active_minus1 & 0x1f) << 16; -+ reg |= (slice->disable_deblocking_filter_idc & 0x3) << 8; -+ reg |= (slice->slice_alpha_c0_offset_div2 & 0xf) << 4; -+ reg |= slice->slice_beta_offset_div2 & 0xf; -+ cedrus_write(dev, VE_H264_SHS2, reg); -+ -+ reg = 0; -+ reg |= (pps->second_chroma_qp_index_offset & 0x3f) << 16; -+ reg |= (pps->chroma_qp_index_offset & 0x3f) << 8; -+ reg |= (pps->pic_init_qp_minus26 + 26 + slice->slice_qp_delta) & 0x3f; -+ cedrus_write(dev, VE_H264_SHS_QP, reg); -+ -+ // clear status flags -+ cedrus_write(dev, VE_H264_STATUS, cedrus_read(dev, VE_H264_STATUS)); -+ -+ // enable int -+ cedrus_write(dev, VE_H264_CTRL, -+ VE_H264_CTRL_SLICE_DECODE_INT | -+ VE_H264_CTRL_DECODE_ERR_INT | -+ VE_H264_CTRL_VLD_DATA_REQ_INT); -+} -+ -+static enum cedrus_irq_status -+cedrus_h264_irq_status(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ u32 reg = cedrus_read(dev, VE_H264_STATUS); -+ -+ if (reg & (VE_H264_STATUS_DECODE_ERR_INT | -+ VE_H264_STATUS_VLD_DATA_REQ_INT)) -+ return CEDRUS_IRQ_ERROR; -+ -+ if (reg & VE_H264_CTRL_SLICE_DECODE_INT) -+ return CEDRUS_IRQ_OK; -+ -+ return CEDRUS_IRQ_NONE; -+} -+ -+static void cedrus_h264_irq_clear(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ -+ cedrus_write(dev, VE_H264_STATUS, -+ VE_H264_STATUS_INT_MASK); -+} -+ -+static void cedrus_h264_irq_disable(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ u32 reg = cedrus_read(dev, VE_H264_CTRL); -+ -+ cedrus_write(dev, VE_H264_CTRL, -+ reg & ~VE_H264_CTRL_INT_MASK); -+} -+ -+static void cedrus_h264_setup(struct cedrus_ctx *ctx, -+ struct cedrus_run *run) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ -+ cedrus_engine_enable(dev, CEDRUS_CODEC_H264); -+ -+ cedrus_write(dev, VE_H264_SDROT_CTRL, 0); -+ cedrus_write(dev, VE_H264_EXTRA_BUFFER1, -+ ctx->codec.h264.pic_info_buf_dma); -+ cedrus_write(dev, VE_H264_EXTRA_BUFFER2, -+ ctx->codec.h264.neighbor_info_buf_dma); -+ -+ cedrus_write_scaling_lists(ctx, run); -+ cedrus_write_frame_list(ctx, run); -+ -+ cedrus_set_params(ctx, run); -+} -+ -+static int cedrus_h264_start(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ unsigned int field_size; -+ unsigned int mv_col_size; -+ int ret; -+ -+ /* -+ * FIXME: It seems that the H6 cedarX code is using a formula -+ * here based on the size of the frame, while all the older -+ * code is using a fixed size, so that might need to be -+ * changed at some point. -+ */ -+ ctx->codec.h264.pic_info_buf = -+ dma_alloc_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, -+ &ctx->codec.h264.pic_info_buf_dma, -+ GFP_KERNEL); -+ if (!ctx->codec.h264.pic_info_buf) -+ return -ENOMEM; -+ -+ /* -+ * That buffer is supposed to be 16kiB in size, and be aligned -+ * on 16kiB as well. However, dma_alloc_coherent provides the -+ * guarantee that we'll have a CPU and DMA address aligned on -+ * the smallest page order that is greater to the requested -+ * size, so we don't have to overallocate. -+ */ -+ ctx->codec.h264.neighbor_info_buf = -+ dma_alloc_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, -+ &ctx->codec.h264.neighbor_info_buf_dma, -+ GFP_KERNEL); -+ if (!ctx->codec.h264.neighbor_info_buf) { -+ ret = -ENOMEM; -+ goto err_pic_buf; -+ } -+ -+ field_size = DIV_ROUND_UP(ctx->src_fmt.width, 16) * -+ DIV_ROUND_UP(ctx->src_fmt.height, 16) * 16; -+ -+ /* -+ * FIXME: This is actually conditional to -+ * V4L2_H264_SPS_FLAG_DIRECT_8X8_INFERENCE not being set, we -+ * might have to rework this if memory efficiency ever is -+ * something we need to work on. -+ */ -+ field_size = field_size * 2; -+ -+ /* -+ * FIXME: This is actually conditional to -+ * V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY not being set, we might -+ * have to rework this if memory efficiency ever is something -+ * we need to work on. -+ */ -+ field_size = field_size * 2; -+ ctx->codec.h264.mv_col_buf_field_size = field_size; -+ -+ mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM; -+ ctx->codec.h264.mv_col_buf_size = mv_col_size; -+ ctx->codec.h264.mv_col_buf = dma_alloc_coherent(dev->dev, -+ ctx->codec.h264.mv_col_buf_size, -+ &ctx->codec.h264.mv_col_buf_dma, -+ GFP_KERNEL); -+ if (!ctx->codec.h264.mv_col_buf) { -+ ret = -ENOMEM; -+ goto err_neighbor_buf; -+ } -+ -+ return 0; -+ -+err_neighbor_buf: -+ dma_free_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, -+ ctx->codec.h264.neighbor_info_buf, -+ ctx->codec.h264.neighbor_info_buf_dma); -+ -+err_pic_buf: -+ dma_free_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, -+ ctx->codec.h264.pic_info_buf, -+ ctx->codec.h264.pic_info_buf_dma); -+ return ret; -+} -+ -+static void cedrus_h264_stop(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ -+ dma_free_coherent(dev->dev, ctx->codec.h264.mv_col_buf_size, -+ ctx->codec.h264.mv_col_buf, -+ ctx->codec.h264.mv_col_buf_dma); -+ dma_free_coherent(dev->dev, CEDRUS_NEIGHBOR_INFO_BUF_SIZE, -+ ctx->codec.h264.neighbor_info_buf, -+ ctx->codec.h264.neighbor_info_buf_dma); -+ dma_free_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, -+ ctx->codec.h264.pic_info_buf, -+ ctx->codec.h264.pic_info_buf_dma); -+} -+ -+static void cedrus_h264_trigger(struct cedrus_ctx *ctx) -+{ -+ struct cedrus_dev *dev = ctx->dev; -+ -+ cedrus_write(dev, VE_H264_TRIGGER_TYPE, -+ VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE); -+} -+ -+struct cedrus_dec_ops cedrus_dec_ops_h264 = { -+ .irq_clear = cedrus_h264_irq_clear, -+ .irq_disable = cedrus_h264_irq_disable, -+ .irq_status = cedrus_h264_irq_status, -+ .setup = cedrus_h264_setup, -+ .start = cedrus_h264_start, -+ .stop = cedrus_h264_stop, -+ .trigger = cedrus_h264_trigger, -+}; -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -index fbfff7c1c771..748f7f673547 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -@@ -46,6 +46,10 @@ int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec) - reg |= VE_MODE_DEC_MPEG; - break; - -+ case CEDRUS_CODEC_H264: -+ reg |= VE_MODE_DEC_H264; -+ break; -+ - default: - return -EINVAL; - } -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h -index de2d6b6f64bf..3e9931416e45 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h -@@ -232,4 +232,95 @@ - #define VE_DEC_MPEG_ROT_LUMA (VE_ENGINE_DEC_MPEG + 0xcc) - #define VE_DEC_MPEG_ROT_CHROMA (VE_ENGINE_DEC_MPEG + 0xd0) - -+#define VE_H264_SPS 0x200 -+#define VE_H264_SPS_MBS_ONLY BIT(18) -+#define VE_H264_SPS_MB_ADAPTIVE_FRAME_FIELD BIT(17) -+#define VE_H264_SPS_DIRECT_8X8_INFERENCE BIT(16) -+ -+#define VE_H264_PPS 0x204 -+#define VE_H264_PPS_ENTROPY_CODING_MODE BIT(15) -+#define VE_H264_PPS_WEIGHTED_PRED BIT(4) -+#define VE_H264_PPS_CONSTRAINED_INTRA_PRED BIT(1) -+#define VE_H264_PPS_TRANSFORM_8X8_MODE BIT(0) -+ -+#define VE_H264_SHS 0x208 -+#define VE_H264_SHS_FIRST_SLICE_IN_PIC BIT(5) -+#define VE_H264_SHS_FIELD_PIC BIT(4) -+#define VE_H264_SHS_BOTTOM_FIELD BIT(3) -+#define VE_H264_SHS_DIRECT_SPATIAL_MV_PRED BIT(2) -+ -+#define VE_H264_SHS2 0x20c -+#define VE_H264_SHS2_NUM_REF_IDX_ACTIVE_OVRD BIT(12) -+ -+#define VE_H264_SHS_WP 0x210 -+ -+#define VE_H264_SHS_QP 0x21c -+#define VE_H264_SHS_QP_SCALING_MATRIX_DEFAULT BIT(24) -+ -+#define VE_H264_CTRL 0x220 -+#define VE_H264_CTRL_VLD_DATA_REQ_INT BIT(2) -+#define VE_H264_CTRL_DECODE_ERR_INT BIT(1) -+#define VE_H264_CTRL_SLICE_DECODE_INT BIT(0) -+ -+#define VE_H264_CTRL_INT_MASK (VE_H264_CTRL_VLD_DATA_REQ_INT | \ -+ VE_H264_CTRL_DECODE_ERR_INT | \ -+ VE_H264_CTRL_SLICE_DECODE_INT) -+ -+#define VE_H264_TRIGGER_TYPE 0x224 -+#define VE_H264_TRIGGER_TYPE_AVC_SLICE_DECODE (8 << 0) -+#define VE_H264_TRIGGER_TYPE_INIT_SWDEC (7 << 0) -+ -+#define VE_H264_STATUS 0x228 -+#define VE_H264_STATUS_VLD_DATA_REQ_INT VE_H264_CTRL_VLD_DATA_REQ_INT -+#define VE_H264_STATUS_DECODE_ERR_INT VE_H264_CTRL_DECODE_ERR_INT -+#define VE_H264_STATUS_SLICE_DECODE_INT VE_H264_CTRL_SLICE_DECODE_INT -+ -+#define VE_H264_STATUS_INT_MASK VE_H264_CTRL_INT_MASK -+ -+#define VE_H264_CUR_MB_NUM 0x22c -+ -+#define VE_H264_VLD_ADDR 0x230 -+#define VE_H264_VLD_ADDR_FIRST BIT(30) -+#define VE_H264_VLD_ADDR_LAST BIT(29) -+#define VE_H264_VLD_ADDR_VALID BIT(28) -+#define VE_H264_VLD_ADDR_VAL(x) (((x) & 0x0ffffff0) | ((x) >> 28)) -+ -+#define VE_H264_VLD_OFFSET 0x234 -+#define VE_H264_VLD_LEN 0x238 -+#define VE_H264_VLD_END 0x23c -+#define VE_H264_SDROT_CTRL 0x240 -+#define VE_H264_OUTPUT_FRAME_IDX 0x24c -+#define VE_H264_EXTRA_BUFFER1 0x250 -+#define VE_H264_EXTRA_BUFFER2 0x254 -+#define VE_H264_BASIC_BITS 0x2dc -+#define VE_AVC_SRAM_PORT_OFFSET 0x2e0 -+#define VE_AVC_SRAM_PORT_DATA 0x2e4 -+ -+#define VE_ISP_INPUT_SIZE 0xa00 -+#define VE_ISP_INPUT_STRIDE 0xa04 -+#define VE_ISP_CTRL 0xa08 -+#define VE_ISP_INPUT_LUMA 0xa78 -+#define VE_ISP_INPUT_CHROMA 0xa7c -+ -+#define VE_AVC_PARAM 0xb04 -+#define VE_AVC_QP 0xb08 -+#define VE_AVC_MOTION_EST 0xb10 -+#define VE_AVC_CTRL 0xb14 -+#define VE_AVC_TRIGGER 0xb18 -+#define VE_AVC_STATUS 0xb1c -+#define VE_AVC_BASIC_BITS 0xb20 -+#define VE_AVC_UNK_BUF 0xb60 -+#define VE_AVC_VLE_ADDR 0xb80 -+#define VE_AVC_VLE_END 0xb84 -+#define VE_AVC_VLE_OFFSET 0xb88 -+#define VE_AVC_VLE_MAX 0xb8c -+#define VE_AVC_VLE_LENGTH 0xb90 -+#define VE_AVC_REF_LUMA 0xba0 -+#define VE_AVC_REF_CHROMA 0xba4 -+#define VE_AVC_REC_LUMA 0xbb0 -+#define VE_AVC_REC_CHROMA 0xbb4 -+#define VE_AVC_REF_SLUMA 0xbb8 -+#define VE_AVC_REC_SLUMA 0xbbc -+#define VE_AVC_MB_INFO 0xbc0 -+ - #endif -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -index 9673874ece10..e2b530b1a956 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -@@ -38,6 +38,10 @@ static struct cedrus_format cedrus_formats[] = { - .directions = CEDRUS_DECODE_SRC, - }, - { -+ .pixelformat = V4L2_PIX_FMT_H264_SLICE_RAW, -+ .directions = CEDRUS_DECODE_SRC, -+ }, -+ { - .pixelformat = V4L2_PIX_FMT_SUNXI_TILED_NV12, - .directions = CEDRUS_DECODE_DST, - }, -@@ -100,6 +104,7 @@ static void cedrus_prepare_format(struct v4l2_pix_format *pix_fmt) - - switch (pix_fmt->pixelformat) { - case V4L2_PIX_FMT_MPEG2_SLICE: -+ case V4L2_PIX_FMT_H264_SLICE_RAW: - /* Zero bytes per line for encoded source. */ - bytesperline = 0; - -@@ -464,6 +469,10 @@ static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count) - ctx->current_codec = CEDRUS_CODEC_MPEG2; - break; - -+ case V4L2_PIX_FMT_H264_SLICE_RAW: -+ ctx->current_codec = CEDRUS_CODEC_H264; -+ break; -+ - default: - return -EINVAL; - } diff --git a/projects/Allwinner/patches/linux/0013-cec-improvements.patch b/projects/Allwinner/patches/linux/0006-wip-cec-improvements.patch similarity index 65% rename from projects/Allwinner/patches/linux/0013-cec-improvements.patch rename to projects/Allwinner/patches/linux/0006-wip-cec-improvements.patch index f9360ec979..fc1b07d068 100644 --- a/projects/Allwinner/patches/linux/0013-cec-improvements.patch +++ b/projects/Allwinner/patches/linux/0006-wip-cec-improvements.patch @@ -1,8 +1,85 @@ +From bf21ad0889bdcc1dc12fe5a024fd7df7ad2c4310 Mon Sep 17 00:00:00 2001 +From: Jonas Karlman +Date: Tue, 26 Feb 2019 20:45:14 +0000 +Subject: [PATCH 1/2] WIP: dw-hdmi-cec: sleep 100ms on error + +--- + drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 18 ++++++++++++++++-- + 1 file changed, 16 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +index 6c323510f128..b5a1a85c8700 100644 +--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c ++++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c +@@ -7,6 +7,7 @@ + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ ++#include + #include + #include + #include +@@ -132,8 +133,15 @@ static irqreturn_t dw_hdmi_cec_hardirq(int irq, void *data) + + dw_hdmi_write(cec, stat, HDMI_IH_CEC_STAT0); + +- if (stat & CEC_STAT_ERROR_INIT) { +- cec->tx_status = CEC_TX_STATUS_ERROR; ++ /* Status with both done and error_initiator bits have been seen ++ * on Rockchip RK3328 devices, transmit attempt seems to have failed ++ * when this happens, report as low drive and block cec-framework ++ * 100ms before core retransmits the failed message, this seems to ++ * mitigate the issue with failed transmit attempts. ++ */ ++ if ((stat & (CEC_STAT_DONE|CEC_STAT_ERROR_INIT)) == (CEC_STAT_DONE|CEC_STAT_ERROR_INIT)) { ++ pr_info("dw_hdmi_cec_hardirq: stat=%02x LOW_DRIVE\n", stat); ++ cec->tx_status = CEC_TX_STATUS_LOW_DRIVE; + cec->tx_done = true; + ret = IRQ_WAKE_THREAD; + } else if (stat & CEC_STAT_DONE) { +@@ -144,6 +152,10 @@ static irqreturn_t dw_hdmi_cec_hardirq(int irq, void *data) + cec->tx_status = CEC_TX_STATUS_NACK; + cec->tx_done = true; + ret = IRQ_WAKE_THREAD; ++ } else if (stat & CEC_STAT_ERROR_INIT) { ++ cec->tx_status = CEC_TX_STATUS_ERROR; ++ cec->tx_done = true; ++ ret = IRQ_WAKE_THREAD; + } + + if (stat & CEC_STAT_EOM) { +@@ -176,6 +188,8 @@ static irqreturn_t dw_hdmi_cec_thread(int irq, void *data) + + if (cec->tx_done) { + cec->tx_done = false; ++ if (cec->tx_status == CEC_TX_STATUS_LOW_DRIVE) ++ msleep(100); + cec_transmit_attempt_done(adap, cec->tx_status); + } + if (cec->rx_done) { +-- +2.21.0 + + +From 12f1abe2b5cee6575c6dd9cd29b17b589f044b80 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 25 May 2019 12:03:39 +0200 +Subject: [PATCH 2/2] WIP: sun8i-hdmi CEC improvements + +Signed-off-by: Jernej Skrabec +--- + drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 2 +- + drivers/gpu/drm/sun4i/Kconfig | 10 +++ + drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h | 11 +++ + drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 83 ++++++++++++++++++++++- + include/drm/bridge/dw_hdmi.h | 2 + + 5 files changed, 105 insertions(+), 3 deletions(-) + diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c -index a63e5f0dae56..fdda26f8b056 100644 +index 09fdc9f87651..f359c4c3f1d1 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c -@@ -2634,7 +2634,7 @@ __dw_hdmi_probe(struct platform_device *pdev, +@@ -2713,7 +2713,7 @@ __dw_hdmi_probe(struct platform_device *pdev, hdmi->audio = platform_device_register_full(&pdevinfo); } @@ -33,7 +110,7 @@ index 1dbbc3a1b763..7149c72e44c8 100644 tristate "Support for Allwinner Display Engine 2.0 Mixer" default MACH_SUN8I diff --git a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h -index 720c5aa8adc1..82dd84094638 100644 +index 720c5aa8adc1..49ca001923e3 100644 --- a/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h +++ b/drivers/gpu/drm/sun4i/sun8i_dw_hdmi.h @@ -12,6 +12,7 @@ @@ -71,15 +148,15 @@ index 720c5aa8adc1..82dd84094638 100644 struct sun8i_hdmi_phy { + struct cec_adapter *cec_adapter; -+ struct cec_notifier *cec_notifier; ++ struct cec_notifier *cec_notifier; struct clk *clk_bus; struct clk *clk_mod; struct clk *clk_phy; diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -index 66ea3a902e36..70e291353569 100644 +index 43643ad31730..d840bc07cba6 100644 --- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c +++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -@@ -503,8 +503,9 @@ static void sun8i_hdmi_phy_init_h3(struct sun8i_hdmi_phy *phy) +@@ -504,8 +504,9 @@ static void sun8i_hdmi_phy_init_h3(struct sun8i_hdmi_phy *phy) regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_PLL_CFG1_REG, SUN8I_HDMI_PHY_PLL_CFG1_CKIN_SEL_MSK, 0); @@ -91,7 +168,7 @@ index 66ea3a902e36..70e291353569 100644 /* read calibration data */ regmap_read(phy->regs, SUN8I_HDMI_PHY_ANA_STS_REG, &val); -@@ -530,8 +531,49 @@ void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy, +@@ -531,8 +532,49 @@ void sun8i_hdmi_phy_set_ops(struct sun8i_hdmi_phy *phy, plat_data->cur_ctr = variant->cur_ctr; plat_data->phy_config = variant->phy_cfg; } @@ -141,7 +218,7 @@ index 66ea3a902e36..70e291353569 100644 static struct regmap_config sun8i_hdmi_phy_regmap_config = { .reg_bits = 32, .val_bits = 32, -@@ -548,6 +590,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_a83t_hdmi_phy = { +@@ -549,6 +591,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_a83t_hdmi_phy = { }; static const struct sun8i_hdmi_phy_variant sun8i_h3_hdmi_phy = { @@ -149,7 +226,7 @@ index 66ea3a902e36..70e291353569 100644 .has_phy_clk = true, .is_custom_phy = true, .phy_init = &sun8i_hdmi_phy_init_h3, -@@ -556,6 +599,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_h3_hdmi_phy = { +@@ -557,6 +600,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_h3_hdmi_phy = { }; static const struct sun8i_hdmi_phy_variant sun8i_r40_hdmi_phy = { @@ -157,7 +234,7 @@ index 66ea3a902e36..70e291353569 100644 .has_phy_clk = true, .has_second_pll = true, .is_custom_phy = true, -@@ -565,6 +609,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_r40_hdmi_phy = { +@@ -566,6 +610,7 @@ static const struct sun8i_hdmi_phy_variant sun8i_r40_hdmi_phy = { }; static const struct sun8i_hdmi_phy_variant sun50i_a64_hdmi_phy = { @@ -165,7 +242,7 @@ index 66ea3a902e36..70e291353569 100644 .has_phy_clk = true, .is_custom_phy = true, .phy_init = &sun8i_hdmi_phy_init_h3, -@@ -708,10 +753,40 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node) +@@ -711,10 +756,40 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node) clk_prepare_enable(phy->clk_phy); } @@ -204,9 +281,9 @@ index 66ea3a902e36..70e291353569 100644 +err_disable_clk_phy: + clk_disable_unprepare(phy->clk_phy); err_disable_clk_mod: - clk_disable_unprepare(phy->clk_mod); + clk_disable_unprepare(phy->clk_mod); err_disable_clk_bus: -@@ -736,6 +811,10 @@ void sun8i_hdmi_phy_remove(struct sun8i_dw_hdmi *hdmi) +@@ -739,6 +814,10 @@ void sun8i_hdmi_phy_remove(struct sun8i_dw_hdmi *hdmi) { struct sun8i_hdmi_phy *phy = hdmi->phy; @@ -218,7 +295,7 @@ index 66ea3a902e36..70e291353569 100644 clk_disable_unprepare(phy->clk_bus); clk_disable_unprepare(phy->clk_phy); diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h -index 66e70770cce5..764b8bcfa62c 100644 +index 323febe7f102..cec73761856d 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -144,6 +144,8 @@ struct dw_hdmi_plat_data { @@ -230,3 +307,6 @@ index 66e70770cce5..764b8bcfa62c 100644 }; struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev, +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0007-media-cedrus-Fix-decoding-for-some-H264-videos.patch b/projects/Allwinner/patches/linux/0007-media-cedrus-Fix-decoding-for-some-H264-videos.patch new file mode 100644 index 0000000000..f8ba373631 --- /dev/null +++ b/projects/Allwinner/patches/linux/0007-media-cedrus-Fix-decoding-for-some-H264-videos.patch @@ -0,0 +1,76 @@ +From 443ca53cf78c635aa5bebe9f115721e55fe9ca38 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 25 May 2019 12:33:05 +0200 +Subject: [PATCH] media: cedrus: Fix decoding for some H264 videos + +It seems that for some H264 videos at least one bitstream parsing +trigger must be called in order to be decoded correctly. There is no +explanation why this helps, but it was observed that two sample videos +with this fix are now decoded correctly and there is no regression with +others. + +Signed-off-by: Jernej Skrabec +--- + .../staging/media/sunxi/cedrus/cedrus_h264.c | 22 ++++++++++++++++--- + 1 file changed, 19 insertions(+), 3 deletions(-) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +index a30bb283f69f..fab14de1815a 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +@@ -6,6 +6,7 @@ + * Copyright (c) 2018 Bootlin + */ + ++#include + #include + + #include +@@ -289,6 +290,20 @@ static void cedrus_write_pred_weight_table(struct cedrus_ctx *ctx, + } + } + ++static void cedrus_skip_bits(struct cedrus_dev *dev, int num) ++{ ++ for (; num > 32; num -= 32) { ++ cedrus_write(dev, VE_H264_TRIGGER_TYPE, 0x3 | (32 << 8)); ++ while (cedrus_read(dev, VE_H264_STATUS) & (1 << 8)) ++ udelay(1); ++ } ++ if (num > 0) { ++ cedrus_write(dev, VE_H264_TRIGGER_TYPE, 0x3 | (num << 8)); ++ while (cedrus_read(dev, VE_H264_STATUS) & (1 << 8)) ++ udelay(1); ++ } ++} ++ + static void cedrus_set_params(struct cedrus_ctx *ctx, + struct cedrus_run *run) + { +@@ -299,12 +314,11 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, + struct vb2_buffer *src_buf = &run->src->vb2_buf; + struct cedrus_dev *dev = ctx->dev; + dma_addr_t src_buf_addr; +- u32 offset = slice->header_bit_size; +- u32 len = (slice->size * 8) - offset; ++ u32 len = slice->size * 8; + u32 reg; + + cedrus_write(dev, VE_H264_VLD_LEN, len); +- cedrus_write(dev, VE_H264_VLD_OFFSET, offset); ++ cedrus_write(dev, VE_H264_VLD_OFFSET, 0); + + src_buf_addr = vb2_dma_contig_plane_dma_addr(src_buf, 0); + cedrus_write(dev, VE_H264_VLD_END, +@@ -323,6 +337,8 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, + cedrus_write(dev, VE_H264_TRIGGER_TYPE, + VE_H264_TRIGGER_TYPE_INIT_SWDEC); + ++ cedrus_skip_bits(dev, slice->header_bit_size); ++ + if (((pps->flags & V4L2_H264_PPS_FLAG_WEIGHTED_PRED) && + (slice->slice_type == V4L2_H264_SLICE_TYPE_P || + slice->slice_type == V4L2_H264_SLICE_TYPE_SP)) || +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0008-media-cedrus-Fix-H264-default-reference-index-count.patch b/projects/Allwinner/patches/linux/0008-media-cedrus-Fix-H264-default-reference-index-count.patch new file mode 100644 index 0000000000..6b08bad539 --- /dev/null +++ b/projects/Allwinner/patches/linux/0008-media-cedrus-Fix-H264-default-reference-index-count.patch @@ -0,0 +1,36 @@ +From fce7f7e700176b402b303d2a62813cc0cdd061e0 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 25 May 2019 13:18:50 +0200 +Subject: [PATCH 2/5] media: cedrus: Fix H264 default reference index count + +Reference index count in VE_H264_PPS should come from PPS control. +However, this is not really important, because reference index count is +in our case always overridden by that from slice header. + +Signed-off-by: Jernej Skrabec +--- + drivers/staging/media/sunxi/cedrus/cedrus_h264.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +index fab14de1815a..d0ee3f90ff46 100644 +--- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c ++++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +@@ -356,12 +356,8 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, + + // picture parameters + reg = 0; +- /* +- * FIXME: the kernel headers are allowing the default value to +- * be passed, but the libva doesn't give us that. +- */ +- reg |= (slice->num_ref_idx_l0_active_minus1 & 0x1f) << 10; +- reg |= (slice->num_ref_idx_l1_active_minus1 & 0x1f) << 5; ++ reg |= (pps->num_ref_idx_l0_default_active_minus1 & 0x1f) << 10; ++ reg |= (pps->num_ref_idx_l1_default_active_minus1 & 0x1f) << 5; + reg |= (pps->weighted_bipred_idc & 0x3) << 2; + if (pps->flags & V4L2_H264_PPS_FLAG_ENTROPY_CODING_MODE) + reg |= VE_H264_PPS_ENTROPY_CODING_MODE; +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0007-H264-improvements.patch b/projects/Allwinner/patches/linux/0009-media-cedrus-WIP-H264-improvements.patch similarity index 72% rename from projects/Allwinner/patches/linux/0007-H264-improvements.patch rename to projects/Allwinner/patches/linux/0009-media-cedrus-WIP-H264-improvements.patch index 0efa61a7fc..3abe59c038 100644 --- a/projects/Allwinner/patches/linux/0007-H264-improvements.patch +++ b/projects/Allwinner/patches/linux/0009-media-cedrus-WIP-H264-improvements.patch @@ -1,18 +1,18 @@ -From e41186f41a546d1c60797f090001da969f5eda5a Mon Sep 17 00:00:00 2001 +From 9714cf1bc8c5b48f21af3500e34497621b51a4b1 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 14 Feb 2019 22:50:12 +0100 -Subject: [PATCH] cedrus: Improve H264 +Subject: [PATCH 3/5] media: cedrus: WIP H264 improvements Signed-off-by: Jernej Skrabec --- - .../staging/media/sunxi/cedrus/cedrus_h264.c | 69 +++++++++++-------- - 1 file changed, 41 insertions(+), 28 deletions(-) + .../staging/media/sunxi/cedrus/cedrus_h264.c | 37 ++++++++++++++----- + 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -index a5c5f13ffecb..405545947b85 100644 +index d0ee3f90ff46..dcb8d3837869 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -@@ -38,7 +38,7 @@ struct cedrus_h264_sram_ref_pic { +@@ -39,7 +39,7 @@ struct cedrus_h264_sram_ref_pic { #define CEDRUS_H264_FRAME_NUM 18 #define CEDRUS_NEIGHBOR_INFO_BUF_SIZE (16 * SZ_1K) @@ -21,7 +21,7 @@ index a5c5f13ffecb..405545947b85 100644 static void cedrus_h264_write_sram(struct cedrus_dev *dev, enum cedrus_h264_sram_off off, -@@ -101,7 +101,7 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, +@@ -102,7 +102,7 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, struct cedrus_dev *dev = ctx->dev; unsigned long used_dpbs = 0; unsigned int position; @@ -30,7 +30,7 @@ index a5c5f13ffecb..405545947b85 100644 unsigned int i; memset(pic_list, 0, sizeof(pic_list)); -@@ -126,6 +126,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, +@@ -123,6 +123,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, position = cedrus_buf->codec.h264.position; used_dpbs |= BIT(position); @@ -42,7 +42,7 @@ index a5c5f13ffecb..405545947b85 100644 if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) continue; -@@ -133,13 +138,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, +@@ -130,13 +135,11 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, dpb->top_field_order_cnt, dpb->bottom_field_order_cnt, &pic_list[position]); @@ -59,7 +59,7 @@ index a5c5f13ffecb..405545947b85 100644 position = find_first_zero_bit(&used_dpbs, CEDRUS_H264_FRAME_NUM); output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf); -@@ -165,6 +168,10 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, +@@ -162,6 +165,10 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, #define CEDRUS_MAX_REF_IDX 32 @@ -70,7 +70,7 @@ index a5c5f13ffecb..405545947b85 100644 static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, struct cedrus_run *run, const u8 *ref_list, u8 num_ref, -@@ -187,7 +194,7 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, +@@ -184,7 +191,7 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, int buf_idx; u8 dpb_idx; @@ -79,7 +79,7 @@ index a5c5f13ffecb..405545947b85 100644 dpb = &decode->dpb[dpb_idx]; if (!(dpb->flags & V4L2_H264_DPB_ENTRY_FLAG_ACTIVE)) -@@ -206,7 +213,8 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, +@@ -199,7 +206,8 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, position = cedrus_buf->codec.h264.position; sram_array[i] |= position << 1; @@ -89,16 +89,16 @@ index a5c5f13ffecb..405545947b85 100644 sram_array[i] |= BIT(0); } -@@ -309,6 +317,8 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, +@@ -315,6 +323,8 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, + struct cedrus_dev *dev = ctx->dev; dma_addr_t src_buf_addr; - u32 offset = slice->header_bit_size; - u32 len = (slice->size * 8) - offset; + u32 len = slice->size * 8; + unsigned int pic_width_in_mbs; + bool mbaff_picture; u32 reg; cedrus_write(dev, VE_H264_VLD_LEN, len); -@@ -378,12 +387,19 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, +@@ -382,12 +392,19 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, reg |= VE_H264_SPS_DIRECT_8X8_INFERENCE; cedrus_write(dev, VE_H264_SPS, reg); @@ -119,15 +119,6 @@ index a5c5f13ffecb..405545947b85 100644 if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) reg |= VE_H264_SHS_FIELD_PIC; if (slice->flags & V4L2_H264_SLICE_FLAG_BOTTOM_FIELD) -@@ -531,7 +541,7 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx) - * we need to work on. - */ - field_size = field_size * 2; -- ctx->codec.h264.mv_col_buf_field_size = field_size; -+ ctx->codec.h264.mv_col_buf_field_size = ALIGN(field_size, 1024); - - mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM; - ctx->codec.h264.mv_col_buf_size = mv_col_size; -- -2.20.1 +2.21.0 diff --git a/projects/Allwinner/patches/linux/0008-HEVC-improvements.patch b/projects/Allwinner/patches/linux/0010-WIP-HEVC-improvements.patch similarity index 84% rename from projects/Allwinner/patches/linux/0008-HEVC-improvements.patch rename to projects/Allwinner/patches/linux/0010-WIP-HEVC-improvements.patch index 38c5f5f04c..96c0a6da59 100644 --- a/projects/Allwinner/patches/linux/0008-HEVC-improvements.patch +++ b/projects/Allwinner/patches/linux/0010-WIP-HEVC-improvements.patch @@ -1,8 +1,25 @@ +From c6582c38df2f78dc9d4f8fd920780a82a01e4d8e Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Sat, 25 May 2019 13:58:17 +0200 +Subject: [PATCH 2/3] WIP: HEVC improvements + +Signed-off-by: Jernej Skrabec +--- + drivers/media/v4l2-core/v4l2-ctrls.c | 8 + + drivers/staging/media/sunxi/cedrus/cedrus.c | 6 + + drivers/staging/media/sunxi/cedrus/cedrus.h | 11 +- + .../staging/media/sunxi/cedrus/cedrus_dec.c | 2 + + .../staging/media/sunxi/cedrus/cedrus_h265.c | 348 +++++++++++++----- + .../staging/media/sunxi/cedrus/cedrus_regs.h | 3 + + .../staging/media/sunxi/cedrus/cedrus_video.c | 12 +- + include/media/hevc-ctrls.h | 20 +- + 8 files changed, 301 insertions(+), 109 deletions(-) + diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 3bab9d4e3304..a14762dff91d 100644 +index 1107698b9d06..aed7a4526193 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -916,6 +916,7 @@ const char *v4l2_ctrl_get_name(u32 id) +@@ -947,6 +947,7 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_MPEG_VIDEO_HEVC_SPS: return "HEVC Sequence Parameter Set"; case V4L2_CID_MPEG_VIDEO_HEVC_PPS: return "HEVC Picture Parameter Set"; case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: return "HEVC Slice Parameters"; @@ -10,7 +27,7 @@ index 3bab9d4e3304..a14762dff91d 100644 /* CAMERA controls */ /* Keep the order of the 'case's the same as in v4l2-controls.h! */ -@@ -1332,6 +1333,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, +@@ -1368,6 +1369,9 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, case V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS: *type = V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS; break; @@ -20,7 +37,7 @@ index 3bab9d4e3304..a14762dff91d 100644 default: *type = V4L2_CTRL_TYPE_INTEGER; break; -@@ -1708,6 +1712,7 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, +@@ -1747,6 +1751,7 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx, case V4L2_CTRL_TYPE_HEVC_SPS: case V4L2_CTRL_TYPE_HEVC_PPS: case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS: @@ -28,7 +45,7 @@ index 3bab9d4e3304..a14762dff91d 100644 return 0; default: -@@ -2314,6 +2319,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, +@@ -2356,6 +2361,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl, case V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS: elem_size = sizeof(struct v4l2_ctrl_hevc_slice_params); break; @@ -39,10 +56,10 @@ index 3bab9d4e3304..a14762dff91d 100644 if (type < V4L2_CTRL_COMPOUND_TYPES) elem_size = sizeof(s32); diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c -index a713630ce7ba..3040f483e0a2 100644 +index 70642834f351..01860f247aa6 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c -@@ -87,6 +87,12 @@ static const struct cedrus_control cedrus_controls[] = { +@@ -88,6 +88,12 @@ static const struct cedrus_control cedrus_controls[] = { .codec = CEDRUS_CODEC_H265, .required = true, }, @@ -56,10 +73,10 @@ index a713630ce7ba..3040f483e0a2 100644 #define CEDRUS_CONTROLS_COUNT ARRAY_SIZE(cedrus_controls) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index b5d083812bea..deb9fa1de97c 100644 +index f19be772d78b..b518c5613fdf 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -72,6 +72,7 @@ struct cedrus_h265_run { +@@ -74,6 +74,7 @@ struct cedrus_h265_run { const struct v4l2_ctrl_hevc_sps *sps; const struct v4l2_ctrl_hevc_pps *pps; const struct v4l2_ctrl_hevc_slice_params *slice_params; @@ -67,7 +84,7 @@ index b5d083812bea..deb9fa1de97c 100644 }; struct cedrus_run { -@@ -88,6 +89,10 @@ struct cedrus_run { +@@ -90,6 +91,10 @@ struct cedrus_run { struct cedrus_buffer { struct v4l2_m2m_buffer m2m_buf; @@ -78,7 +95,7 @@ index b5d083812bea..deb9fa1de97c 100644 union { struct { unsigned int position; -@@ -121,12 +126,10 @@ struct cedrus_ctx { +@@ -123,12 +128,10 @@ struct cedrus_ctx { dma_addr_t neighbor_info_buf_dma; } h264; struct { @@ -94,10 +111,10 @@ index b5d083812bea..deb9fa1de97c 100644 } codec; }; diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -index c50397f8692f..80c6d920142d 100644 +index c6d0ef66cdd0..104adb08492c 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c -@@ -68,6 +68,8 @@ void cedrus_device_run(void *priv) +@@ -66,6 +66,8 @@ void cedrus_device_run(void *priv) V4L2_CID_MPEG_VIDEO_HEVC_PPS); run.h265.slice_params = cedrus_find_control_data(ctx, V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS); @@ -107,7 +124,7 @@ index c50397f8692f..80c6d920142d 100644 default: diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c -index f1c3665e95ab..2cc36d69548e 100644 +index fd4d86b02156..82d29c59b787 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c @@ -77,24 +77,25 @@ static void cedrus_h265_sram_write_offset(struct cedrus_dev *dev, u32 offset) @@ -157,7 +174,7 @@ index f1c3665e95ab..2cc36d69548e 100644 }; u32 offset = VE_DEC_H265_SRAM_OFFSET_FRAME_INFO + VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT * index; -@@ -157,28 +157,24 @@ static void cedrus_h265_ref_pic_list_write(struct cedrus_dev *dev, +@@ -158,28 +158,24 @@ static void cedrus_h265_ref_pic_list_write(struct cedrus_dev *dev, u8 num_ref_idx_active, u32 sram_offset) { @@ -195,7 +212,7 @@ index f1c3665e95ab..2cc36d69548e 100644 } static void cedrus_h265_pred_weight_write(struct cedrus_dev *dev, -@@ -219,6 +215,105 @@ static void cedrus_h265_pred_weight_write(struct cedrus_dev *dev, +@@ -220,6 +216,131 @@ static void cedrus_h265_pred_weight_write(struct cedrus_dev *dev, } } @@ -204,6 +221,7 @@ index f1c3665e95ab..2cc36d69548e 100644 +{ + const struct v4l2_ctrl_hevc_scaling_matrix *scaling; + struct cedrus_dev *dev = ctx->dev; ++ u32 i, j, k, val; + + scaling = run->h265.scaling_matrix; + @@ -219,21 +237,46 @@ index f1c3665e95ab..2cc36d69548e 100644 + (scaling->scaling_list_dc_coef_16x16[3] << 8) | + (scaling->scaling_list_dc_coef_16x16[2] << 0)); + -+ cedrus_h265_sram_write_offset(dev, VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_8x8); -+ cedrus_h265_sram_write_data(dev, scaling->scaling_list_8x8, -+ sizeof(scaling->scaling_list_8x8)); ++ cedrus_h265_sram_write_offset(dev, VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS); + -+ cedrus_h265_sram_write_offset(dev, VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_32x32); -+ cedrus_h265_sram_write_data(dev, scaling->scaling_list_32x32, -+ sizeof(scaling->scaling_list_32x32)); ++ for (i = 0; i < 6; i++) ++ for (j = 0; j < 8; j++) ++ for (k = 0; k < 8; k += 4) { ++ val = ((u32)scaling->scaling_list_8x8[i][j + (k + 3) * 8] << 24) | ++ ((u32)scaling->scaling_list_8x8[i][j + (k + 2) * 8] << 16) | ++ ((u32)scaling->scaling_list_8x8[i][j + (k + 1) * 8] << 8) | ++ scaling->scaling_list_8x8[i][j + k * 8]; ++ cedrus_write(dev, VE_DEC_H265_SRAM_DATA, val); ++ } + -+ cedrus_h265_sram_write_offset(dev, VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_16x16); -+ cedrus_h265_sram_write_data(dev, scaling->scaling_list_16x16, -+ sizeof(scaling->scaling_list_16x16)); ++ for (i = 0; i < 2; i++) ++ for (j = 0; j < 8; j++) ++ for (k = 0; k < 8; k += 4) { ++ val = ((u32)scaling->scaling_list_32x32[i][j + (k + 3) * 8] << 24) | ++ ((u32)scaling->scaling_list_32x32[i][j + (k + 2) * 8] << 16) | ++ ((u32)scaling->scaling_list_32x32[i][j + (k + 1) * 8] << 8) | ++ scaling->scaling_list_32x32[i][j + k * 8]; ++ cedrus_write(dev, VE_DEC_H265_SRAM_DATA, val); ++ } + -+ cedrus_h265_sram_write_offset(dev, VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_4x4); -+ cedrus_h265_sram_write_data(dev, scaling->scaling_list_4x4, -+ sizeof(scaling->scaling_list_4x4)); ++ for (i = 0; i < 6; i++) ++ for (j = 0; j < 8; j++) ++ for (k = 0; k < 8; k += 4) { ++ val = ((u32)scaling->scaling_list_16x16[i][j + (k + 3) * 8] << 24) | ++ ((u32)scaling->scaling_list_16x16[i][j + (k + 2) * 8] << 16) | ++ ((u32)scaling->scaling_list_16x16[i][j + (k + 1) * 8] << 8) | ++ scaling->scaling_list_16x16[i][j + k * 8]; ++ cedrus_write(dev, VE_DEC_H265_SRAM_DATA, val); ++ } ++ ++ for (i = 0; i < 6; i++) ++ for (j = 0; j < 4; j++) { ++ val = ((u32)scaling->scaling_list_4x4[i][j + 12] << 24) | ++ ((u32)scaling->scaling_list_4x4[i][j + 8] << 16) | ++ ((u32)scaling->scaling_list_4x4[i][j + 4] << 8) | ++ scaling->scaling_list_4x4[i][j]; ++ cedrus_write(dev, VE_DEC_H265_SRAM_DATA, val); ++ } +} + +static void write_entry_point_list(struct cedrus_ctx *ctx, @@ -301,7 +344,7 @@ index f1c3665e95ab..2cc36d69548e 100644 static void cedrus_h265_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) { -@@ -227,6 +322,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -228,6 +349,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, const struct v4l2_ctrl_hevc_pps *pps; const struct v4l2_ctrl_hevc_slice_params *slice_params; const struct v4l2_hevc_pred_weight_table *pred_weight_table; @@ -309,7 +352,7 @@ index f1c3665e95ab..2cc36d69548e 100644 dma_addr_t src_buf_addr; dma_addr_t src_buf_end_addr; u32 chroma_log2_weight_denom; -@@ -239,43 +335,10 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -240,43 +362,10 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, slice_params = run->h265.slice_params; pred_weight_table = &slice_params->pred_weight_table; @@ -355,7 +398,7 @@ index f1c3665e95ab..2cc36d69548e 100644 /* Source offset and length in bits. */ -@@ -299,18 +362,35 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -300,18 +389,35 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, src_buf_end_addr = src_buf_addr + DIV_ROUND_UP(slice_params->bit_size, 8); @@ -397,7 +440,7 @@ index f1c3665e95ab..2cc36d69548e 100644 /* Initialize bitstream access. */ cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_INIT_SWDEC); -@@ -333,6 +413,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -334,6 +440,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, VE_DEC_H265_DEC_SPS_HDR_LOG2_DIFF_MAX_MIN_LUMA_CODING_BLOCK_SIZE(sps->log2_diff_max_min_luma_coding_block_size) | VE_DEC_H265_DEC_SPS_HDR_LOG2_MIN_LUMA_CODING_BLOCK_SIZE_MINUS3(sps->log2_min_luma_coding_block_size_minus3) | VE_DEC_H265_DEC_SPS_HDR_BIT_DEPTH_CHROMA_MINUS8(sps->bit_depth_chroma_minus8) | @@ -405,7 +448,7 @@ index f1c3665e95ab..2cc36d69548e 100644 VE_DEC_H265_DEC_SPS_HDR_SEPARATE_COLOUR_PLANE_FLAG(sps->separate_colour_plane_flag) | VE_DEC_H265_DEC_SPS_HDR_CHROMA_FORMAT_IDC(sps->chroma_format_idc); -@@ -362,7 +443,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -363,7 +470,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, VE_DEC_H265_DEC_PPS_CTRL1_PPS_LOOP_FILTER_ACROSS_SLICES_ENABLED_FLAG(pps->pps_loop_filter_across_slices_enabled_flag) | VE_DEC_H265_DEC_PPS_CTRL1_LOOP_FILTER_ACROSS_TILES_ENABLED_FLAG(pps->loop_filter_across_tiles_enabled_flag) | VE_DEC_H265_DEC_PPS_CTRL1_ENTROPY_CODING_SYNC_ENABLED_FLAG(pps->entropy_coding_sync_enabled_flag) | @@ -414,7 +457,7 @@ index f1c3665e95ab..2cc36d69548e 100644 VE_DEC_H265_DEC_PPS_CTRL1_TRANSQUANT_BYPASS_ENABLE_FLAG(pps->transquant_bypass_enabled_flag) | VE_DEC_H265_DEC_PPS_CTRL1_WEIGHTED_BIPRED_FLAG(pps->weighted_bipred_flag) | VE_DEC_H265_DEC_PPS_CTRL1_WEIGHTED_PRED_FLAG(pps->weighted_pred_flag); -@@ -383,7 +464,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -384,7 +491,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, VE_DEC_H265_DEC_SLICE_HDR_INFO0_COLOUR_PLANE_ID(slice_params->colour_plane_id) | VE_DEC_H265_DEC_SLICE_HDR_INFO0_SLICE_TYPE(slice_params->slice_type) | VE_DEC_H265_DEC_SLICE_HDR_INFO0_DEPENDENT_SLICE_SEGMENT_FLAG(pps->dependent_slice_segment_flag) | @@ -423,7 +466,7 @@ index f1c3665e95ab..2cc36d69548e 100644 cedrus_write(dev, VE_DEC_H265_DEC_SLICE_HDR_INFO0, reg); -@@ -400,34 +481,68 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -401,34 +508,68 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, chroma_log2_weight_denom = pred_weight_table->luma_log2_weight_denom + pred_weight_table->delta_chroma_log2_weight_denom; @@ -497,7 +540,7 @@ index f1c3665e95ab..2cc36d69548e 100644 output_pic_list_index = V4L2_HEVC_DPB_ENTRIES_NUM_MAX; pic_order_cnt[0] = slice_params->slice_pic_order_cnt; pic_order_cnt[1] = slice_params->slice_pic_order_cnt; -@@ -443,36 +558,36 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -444,36 +585,36 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, if (slice_params->slice_type != V4L2_HEVC_SLICE_TYPE_I) { cedrus_h265_ref_pic_list_write(dev, slice_params->dpb, slice_params->ref_idx_l0, @@ -552,7 +595,7 @@ index f1c3665e95ab..2cc36d69548e 100644 } /* Enable appropriate interruptions. */ -@@ -483,9 +598,6 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx) +@@ -484,9 +625,6 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; @@ -562,7 +605,7 @@ index f1c3665e95ab..2cc36d69548e 100644 ctx->codec.h265.neighbor_info_buf = dma_alloc_coherent(dev->dev, CEDRUS_H265_NEIGHBOR_INFO_BUF_SIZE, &ctx->codec.h265.neighbor_info_buf_addr, -@@ -493,6 +605,17 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx) +@@ -494,6 +632,17 @@ static int cedrus_h265_start(struct cedrus_ctx *ctx) if (!ctx->codec.h265.neighbor_info_buf) return -ENOMEM; @@ -580,7 +623,7 @@ index f1c3665e95ab..2cc36d69548e 100644 return 0; } -@@ -500,17 +623,12 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx) +@@ -501,17 +650,12 @@ static void cedrus_h265_stop(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; @@ -602,7 +645,7 @@ index f1c3665e95ab..2cc36d69548e 100644 static void cedrus_h265_trigger(struct cedrus_ctx *ctx) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h -index 87651d6b6227..a2931f322c7a 100644 +index 87651d6b6227..8d153dbe4f83 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h @@ -496,6 +496,9 @@ @@ -615,23 +658,11 @@ index 87651d6b6227..a2931f322c7a 100644 #define VE_DEC_H265_LOW_ADDR (VE_ENGINE_DEC_H265 + 0x80) #define VE_DEC_H265_LOW_ADDR_PRIMARY_CHROMA(a) \ -@@ -513,7 +516,10 @@ - #define VE_DEC_H265_SRAM_OFFSET_PRED_WEIGHT_CHROMA_L1 0x80 - #define VE_DEC_H265_SRAM_OFFSET_FRAME_INFO 0x400 - #define VE_DEC_H265_SRAM_OFFSET_FRAME_INFO_UNIT 0x20 --#define VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS 0x800 -+#define VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_8x8 0x800 -+#define VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_32x32 0x980 -+#define VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_16x16 0xa00 -+#define VE_DEC_H265_SRAM_OFFSET_SCALING_LISTS_4x4 0xb80 - #define VE_DEC_H265_SRAM_OFFSET_REF_PIC_LIST0 0xc00 - #define VE_DEC_H265_SRAM_OFFSET_REF_PIC_LIST1 0xc10 - diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -index b9acdc03c839..adf00513c15f 100644 +index dbe6f9510641..a0817cae1d69 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -@@ -423,8 +423,18 @@ static void cedrus_buf_cleanup(struct vb2_buffer *vb) +@@ -433,8 +433,18 @@ static void cedrus_buf_cleanup(struct vb2_buffer *vb) struct vb2_queue *vq = vb->vb2_queue; struct cedrus_ctx *ctx = vb2_get_drv_priv(vq); @@ -652,24 +683,24 @@ index b9acdc03c839..adf00513c15f 100644 static int cedrus_buf_out_validate(struct vb2_buffer *vb) diff --git a/include/media/hevc-ctrls.h b/include/media/hevc-ctrls.h -index 005c71c67163..4bf3d79047f4 100644 +index 2de83d9f6d47..19469097c6d4 100644 --- a/include/media/hevc-ctrls.h +++ b/include/media/hevc-ctrls.h -@@ -14,11 +14,13 @@ - #define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 645) - #define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 646) - #define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 647) -+#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 648) +@@ -17,11 +17,13 @@ + #define V4L2_CID_MPEG_VIDEO_HEVC_SPS (V4L2_CID_MPEG_BASE + 1008) + #define V4L2_CID_MPEG_VIDEO_HEVC_PPS (V4L2_CID_MPEG_BASE + 1009) + #define V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS (V4L2_CID_MPEG_BASE + 1010) ++#define V4L2_CID_MPEG_VIDEO_HEVC_SCALING_MATRIX (V4L2_CID_MPEG_BASE + 1011) /* enum v4l2_ctrl_type type values */ - #define V4L2_CTRL_TYPE_HEVC_SPS 0x0115 - #define V4L2_CTRL_TYPE_HEVC_PPS 0x0116 - #define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0117 -+#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0118 + #define V4L2_CTRL_TYPE_HEVC_SPS 0x0120 + #define V4L2_CTRL_TYPE_HEVC_PPS 0x0121 + #define V4L2_CTRL_TYPE_HEVC_SLICE_PARAMS 0x0122 ++#define V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX 0x0123 #define V4L2_HEVC_SLICE_TYPE_B 0 #define V4L2_HEVC_SLICE_TYPE_P 1 -@@ -91,7 +93,7 @@ struct v4l2_ctrl_hevc_pps { +@@ -95,7 +97,7 @@ struct v4l2_ctrl_hevc_pps { __u8 lists_modification_present_flag; __u8 log2_parallel_merge_level_minus2; __u8 slice_segment_header_extension_present_flag; @@ -678,7 +709,7 @@ index 005c71c67163..4bf3d79047f4 100644 }; #define V4L2_HEVC_DPB_ENTRY_RPS_ST_CURR_BEFORE 0x01 -@@ -175,7 +177,21 @@ struct v4l2_ctrl_hevc_slice_params { +@@ -179,7 +181,21 @@ struct v4l2_ctrl_hevc_slice_params { /* ISO/IEC 23008-2, ITU-T Rec. H.265: Weighted prediction parameter */ struct v4l2_hevc_pred_weight_table pred_weight_table; @@ -701,3 +732,6 @@ index 005c71c67163..4bf3d79047f4 100644 }; #endif +-- +2.21.0 + diff --git a/projects/Allwinner/patches/linux/0010-WIP-dw-hdmi-cec-sleep-100ms-on-error.patch b/projects/Allwinner/patches/linux/0010-WIP-dw-hdmi-cec-sleep-100ms-on-error.patch deleted file mode 100644 index 4ce824a326..0000000000 --- a/projects/Allwinner/patches/linux/0010-WIP-dw-hdmi-cec-sleep-100ms-on-error.patch +++ /dev/null @@ -1,62 +0,0 @@ -From 9ce5c66f0f98cc968598307f7f7feb39a83d7342 Mon Sep 17 00:00:00 2001 -From: Jonas Karlman -Date: Tue, 26 Feb 2019 20:45:14 +0000 -Subject: [PATCH] WIP: dw-hdmi-cec: sleep 100ms on error - ---- - drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c -index 6c323510f128..b5a1a85c8700 100644 ---- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c -+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c -@@ -7,6 +7,7 @@ - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ -+#include - #include - #include - #include -@@ -132,8 +133,15 @@ static irqreturn_t dw_hdmi_cec_hardirq(int irq, void *data) - - dw_hdmi_write(cec, stat, HDMI_IH_CEC_STAT0); - -- if (stat & CEC_STAT_ERROR_INIT) { -- cec->tx_status = CEC_TX_STATUS_ERROR; -+ /* Status with both done and error_initiator bits have been seen -+ * on Rockchip RK3328 devices, transmit attempt seems to have failed -+ * when this happens, report as low drive and block cec-framework -+ * 100ms before core retransmits the failed message, this seems to -+ * mitigate the issue with failed transmit attempts. -+ */ -+ if ((stat & (CEC_STAT_DONE|CEC_STAT_ERROR_INIT)) == (CEC_STAT_DONE|CEC_STAT_ERROR_INIT)) { -+ pr_info("dw_hdmi_cec_hardirq: stat=%02x LOW_DRIVE\n", stat); -+ cec->tx_status = CEC_TX_STATUS_LOW_DRIVE; - cec->tx_done = true; - ret = IRQ_WAKE_THREAD; - } else if (stat & CEC_STAT_DONE) { -@@ -144,6 +152,10 @@ static irqreturn_t dw_hdmi_cec_hardirq(int irq, void *data) - cec->tx_status = CEC_TX_STATUS_NACK; - cec->tx_done = true; - ret = IRQ_WAKE_THREAD; -+ } else if (stat & CEC_STAT_ERROR_INIT) { -+ cec->tx_status = CEC_TX_STATUS_ERROR; -+ cec->tx_done = true; -+ ret = IRQ_WAKE_THREAD; - } - - if (stat & CEC_STAT_EOM) { -@@ -176,6 +188,8 @@ static irqreturn_t dw_hdmi_cec_thread(int irq, void *data) - - if (cec->tx_done) { - cec->tx_done = false; -+ if (cec->tx_status == CEC_TX_STATUS_LOW_DRIVE) -+ msleep(100); - cec_transmit_attempt_done(adap, cec->tx_status); - } - if (cec->rx_done) { --- -2.20.1 - diff --git a/projects/Allwinner/patches/linux/0009-cedrus-h264-4k.patch b/projects/Allwinner/patches/linux/0011-cedrus-h264-4k.patch similarity index 86% rename from projects/Allwinner/patches/linux/0009-cedrus-h264-4k.patch rename to projects/Allwinner/patches/linux/0011-cedrus-h264-4k.patch index 40849ac4ab..2d5ff656c0 100644 --- a/projects/Allwinner/patches/linux/0009-cedrus-h264-4k.patch +++ b/projects/Allwinner/patches/linux/0011-cedrus-h264-4k.patch @@ -1,7 +1,7 @@ -From bd5fed9f390fea4ef8df1abb5f4ac6b64fab5974 Mon Sep 17 00:00:00 2001 +From 6a900f36a70f921886f05373846368ca6f09446e Mon Sep 17 00:00:00 2001 From: Jernej Skrabec -Date: Mon, 18 Feb 2019 21:51:31 +0100 -Subject: [PATCH] cedrus h264 4k +Date: Sat, 25 May 2019 14:16:55 +0200 +Subject: [PATCH 5/5] cedrus h264 4k Signed-off-by: Jernej Skrabec --- @@ -16,10 +16,10 @@ Signed-off-by: Jernej Skrabec 8 files changed, 98 insertions(+), 59 deletions(-) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h -index deb9fa1de97c..8815332fe1c1 100644 +index b518c5613fdf..ee00449d3345 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h -@@ -116,14 +116,18 @@ struct cedrus_ctx { +@@ -118,14 +118,18 @@ struct cedrus_ctx { union { struct { @@ -43,7 +43,7 @@ index deb9fa1de97c..8815332fe1c1 100644 struct { void *neighbor_info_buf; diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c -index 405545947b85..737a317fd1ee 100644 +index dcb8d3837869..4fafaf2c6c0a 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c @@ -55,16 +55,14 @@ static void cedrus_h264_write_sram(struct cedrus_dev *dev, @@ -73,20 +73,21 @@ index 405545947b85..737a317fd1ee 100644 struct vb2_buffer *vbuf = &buf->m2m_buf.vb.vb2_buf; - unsigned int position = buf->codec.h264.position; - pic->top_field_order_cnt = top_field_order_cnt; - pic->bottom_field_order_cnt = bottom_field_order_cnt; -@@ -84,8 +81,8 @@ static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx, - - pic->luma_ptr = cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0); - pic->chroma_ptr = cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1); -- pic->mv_col_top_ptr = cedrus_h264_mv_col_buf_addr(ctx, position, 0); -- pic->mv_col_bot_ptr = cedrus_h264_mv_col_buf_addr(ctx, position, 1); -+ pic->mv_col_top_ptr = cedrus_h264_mv_col_buf_addr(ctx, buf, 0); -+ pic->mv_col_bot_ptr = cedrus_h264_mv_col_buf_addr(ctx, buf, 1); + pic->top_field_order_cnt = cpu_to_le32(top_field_order_cnt); + pic->bottom_field_order_cnt = cpu_to_le32(bottom_field_order_cnt); +@@ -85,9 +82,9 @@ static void cedrus_fill_ref_pic(struct cedrus_ctx *ctx, + pic->luma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 0)); + pic->chroma_ptr = cpu_to_le32(cedrus_buf_addr(vbuf, &ctx->dst_fmt, 1)); + pic->mv_col_top_ptr = +- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 0)); ++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 0)); + pic->mv_col_bot_ptr = +- cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, position, 1)); ++ cpu_to_le32(cedrus_h264_mv_col_buf_addr(ctx, buf, 1)); } static void cedrus_write_frame_list(struct cedrus_ctx *ctx, -@@ -148,6 +145,28 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, +@@ -145,6 +142,28 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, output_buf = vb2_to_cedrus_buffer(&run->dst->vb2_buf); output_buf->codec.h264.position = position; @@ -101,7 +102,7 @@ index 405545947b85..737a317fd1ee 100644 + if (!(sps->flags & V4L2_H264_SPS_FLAG_FRAME_MBS_ONLY)) + field_size = field_size * 2; + -+ output_buf->mv_col_buf_size = ALIGN(field_size, 1024) * 2; ++ output_buf->mv_col_buf_size = field_size * 2; + output_buf->mv_col_buf = + dma_alloc_coherent(dev->dev, + output_buf->mv_col_buf_size, @@ -115,7 +116,7 @@ index 405545947b85..737a317fd1ee 100644 if (slice->flags & V4L2_H264_SLICE_FLAG_FIELD_PIC) output_buf->codec.h264.pic_type = CEDRUS_H264_PIC_TYPE_FIELD; else if (sps->flags & V4L2_H264_SPS_FLAG_MB_ADAPTIVE_FRAME_FIELD) -@@ -331,6 +350,14 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, +@@ -338,6 +357,14 @@ static void cedrus_set_params(struct cedrus_ctx *ctx, VE_H264_VLD_ADDR_FIRST | VE_H264_VLD_ADDR_VALID | VE_H264_VLD_ADDR_LAST); @@ -130,7 +131,7 @@ index 405545947b85..737a317fd1ee 100644 /* * FIXME: Since the bitstream parsing is done in software, and * in userspace, this shouldn't be needed anymore. But it -@@ -471,7 +498,8 @@ static void cedrus_h264_setup(struct cedrus_ctx *ctx, +@@ -476,7 +503,8 @@ static void cedrus_h264_setup(struct cedrus_ctx *ctx, { struct cedrus_dev *dev = ctx->dev; @@ -140,7 +141,7 @@ index 405545947b85..737a317fd1ee 100644 cedrus_write(dev, VE_H264_SDROT_CTRL, 0); cedrus_write(dev, VE_H264_EXTRA_BUFFER1, -@@ -490,8 +518,6 @@ static void cedrus_h264_setup(struct cedrus_ctx *ctx, +@@ -493,8 +521,6 @@ static void cedrus_h264_setup(struct cedrus_ctx *ctx, static int cedrus_h264_start(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; @@ -149,7 +150,7 @@ index 405545947b85..737a317fd1ee 100644 int ret; /* -@@ -523,44 +549,42 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx) +@@ -526,44 +552,42 @@ static int cedrus_h264_start(struct cedrus_ctx *ctx) goto err_pic_buf; } @@ -183,7 +184,7 @@ index 405545947b85..737a317fd1ee 100644 - * we need to work on. - */ - field_size = field_size * 2; -- ctx->codec.h264.mv_col_buf_field_size = ALIGN(field_size, 1024); +- ctx->codec.h264.mv_col_buf_field_size = field_size; - - mv_col_size = field_size * 2 * CEDRUS_H264_FRAME_NUM; - ctx->codec.h264.mv_col_buf_size = mv_col_size; @@ -221,7 +222,7 @@ index 405545947b85..737a317fd1ee 100644 err_pic_buf: dma_free_coherent(dev->dev, CEDRUS_PIC_INFO_BUF_SIZE, ctx->codec.h264.pic_info_buf, -@@ -572,15 +596,20 @@ static void cedrus_h264_stop(struct cedrus_ctx *ctx) +@@ -575,15 +599,20 @@ static void cedrus_h264_stop(struct cedrus_ctx *ctx) { struct cedrus_dev *dev = ctx->dev; @@ -246,10 +247,10 @@ index 405545947b85..737a317fd1ee 100644 static void cedrus_h264_trigger(struct cedrus_ctx *ctx) diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c -index 2cc36d69548e..246d747d3fa9 100644 +index 51ee459b2d21..f915429e9c88 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c -@@ -336,9 +336,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, +@@ -337,9 +337,7 @@ static void cedrus_h265_setup(struct cedrus_ctx *ctx, pred_weight_table = &slice_params->pred_weight_table; /* Activate H265 engine. */ @@ -261,7 +262,7 @@ index 2cc36d69548e..246d747d3fa9 100644 /* Source offset and length in bits. */ diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c -index 6be604c52d5c..4b6c69010e39 100644 +index 7d2f6eedfc28..9503d395855b 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c @@ -30,7 +30,8 @@ @@ -297,12 +298,12 @@ index 6be604c52d5c..4b6c69010e39 100644 cedrus_write(dev, VE_PRIMARY_CHROMA_BUF_LEN, reg); diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -index b43c77d54b95..40b44722b7c0 100644 +index 27d0882397aa..0e67c69812be 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -@@ -18,7 +18,8 @@ - - #define CEDRUS_CLOCK_RATE_DEFAULT 320000000 +@@ -16,7 +16,8 @@ + #ifndef _CEDRUS_HW_H_ + #define _CEDRUS_HW_H_ -int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec); +int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec, @@ -311,7 +312,7 @@ index b43c77d54b95..40b44722b7c0 100644 void cedrus_dst_format_set(struct cedrus_dev *dev, diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c -index cb45fda9aaeb..2f6384ca385d 100644 +index 13c34927bad5..fc00a2cbf9bf 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_mpeg2.c @@ -96,7 +96,7 @@ static void cedrus_mpeg2_setup(struct cedrus_ctx *ctx, struct cedrus_run *run) @@ -339,7 +340,7 @@ index a2931f322c7a..df000b7c99be 100644 #define VE_PRIMARY_FB_LINE_STRIDE 0xc8 diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c -index adf00513c15f..b24317b26fd2 100644 +index a0817cae1d69..d27a9e82ff91 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c @@ -29,8 +29,8 @@ @@ -354,5 +355,5 @@ index adf00513c15f..b24317b26fd2 100644 static struct cedrus_format cedrus_formats[] = { { -- -2.20.1 +2.21.0 diff --git a/projects/Allwinner/patches/linux/0011-hdmi-init-fix.patch b/projects/Allwinner/patches/linux/0011-hdmi-init-fix.patch deleted file mode 100644 index 7022c77884..0000000000 --- a/projects/Allwinner/patches/linux/0011-hdmi-init-fix.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 4029cb43656ede363011e199e589357b2de95617 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Tue, 14 May 2019 22:02:46 +0200 -Subject: [PATCH 1/2] drm/sun4i: Fix sun8i HDMI PHY clock initialization - -Current code initializes HDMI PHY clock driver before reset line is -deasserted and clocks enabled. Because of that, initial readout of -clock divider is incorrect (0 instead of 2). This causes any clock -rate with divider 1 (register value 0) to be set incorrectly. - -Fix this by moving initialization of HDMI PHY clock driver after reset -line is deasserted and clocks enabled. - -Cc: stable@vger.kernel.org # 4.17+ -Fixes: 4f86e81748fe ("drm/sun4i: Add support for H3 HDMI PHY variant") -Signed-off-by: Jernej Skrabec ---- - drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 26 ++++++++++++++------------ - 1 file changed, 14 insertions(+), 12 deletions(-) - -diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -index 66ea3a902e36..afc6d4a9c20b 100644 ---- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -@@ -672,22 +672,13 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node) - goto err_put_clk_pll0; - } - } -- -- ret = sun8i_phy_clk_create(phy, dev, -- phy->variant->has_second_pll); -- if (ret) { -- dev_err(dev, "Couldn't create the PHY clock\n"); -- goto err_put_clk_pll1; -- } -- -- clk_prepare_enable(phy->clk_phy); - } - - phy->rst_phy = of_reset_control_get_shared(node, "phy"); - if (IS_ERR(phy->rst_phy)) { - dev_err(dev, "Could not get phy reset control\n"); - ret = PTR_ERR(phy->rst_phy); -- goto err_disable_clk_phy; -+ goto err_put_clk_pll1; - } - - ret = reset_control_deassert(phy->rst_phy); -@@ -708,18 +699,29 @@ int sun8i_hdmi_phy_probe(struct sun8i_dw_hdmi *hdmi, struct device_node *node) - goto err_disable_clk_bus; - } - -+ if (phy->variant->has_phy_clk) { -+ ret = sun8i_phy_clk_create(phy, dev, -+ phy->variant->has_second_pll); -+ if (ret) { -+ dev_err(dev, "Couldn't create the PHY clock\n"); -+ goto err_disable_clk_mod; -+ } -+ -+ clk_prepare_enable(phy->clk_phy); -+ } -+ - hdmi->phy = phy; - - return 0; - -+err_disable_clk_mod: -+ clk_disable_unprepare(phy->clk_mod); - err_disable_clk_bus: - clk_disable_unprepare(phy->clk_bus); - err_deassert_rst_phy: - reset_control_assert(phy->rst_phy); - err_put_rst_phy: - reset_control_put(phy->rst_phy); --err_disable_clk_phy: -- clk_disable_unprepare(phy->clk_phy); - err_put_clk_pll1: - clk_put(phy->clk_pll1); - err_put_clk_pll0: --- -2.21.0 - -From 3ebe28afd2b9250375d38bc1144a4aac74340464 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Tue, 14 May 2019 22:26:20 +0200 -Subject: [PATCH 2/2] drm/sun4i: Fix sun8i HDMI PHY configuration for > 148.5 - MHz - -Vendor provided documentation says that EMP bits should be set to 3 for -pixel clocks greater than 148.5 MHz. - -Fix that. - -Cc: stable@vger.kernel.org # 4.17+ -Fixes: 4f86e81748fe ("drm/sun4i: Add support for H3 HDMI PHY variant") -Signed-off-by: Jernej Skrabec ---- - drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -index afc6d4a9c20b..43643ad31730 100644 ---- a/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -+++ b/drivers/gpu/drm/sun4i/sun8i_hdmi_phy.c -@@ -293,7 +293,8 @@ static int sun8i_hdmi_phy_config_h3(struct dw_hdmi *hdmi, - SUN8I_HDMI_PHY_ANA_CFG2_REG_BIGSW | - SUN8I_HDMI_PHY_ANA_CFG2_REG_SLV(4); - ana_cfg3_init |= SUN8I_HDMI_PHY_ANA_CFG3_REG_AMPCK(9) | -- SUN8I_HDMI_PHY_ANA_CFG3_REG_AMP(13); -+ SUN8I_HDMI_PHY_ANA_CFG3_REG_AMP(13) | -+ SUN8I_HDMI_PHY_ANA_CFG3_REG_EMP(3); - } - - regmap_update_bits(phy->regs, SUN8I_HDMI_PHY_ANA_CFG1_REG, --- -2.21.0 - diff --git a/projects/Allwinner/patches/linux/0012-H6-USB3.patch b/projects/Allwinner/patches/linux/0012-H6-USB3.patch new file mode 100644 index 0000000000..49c10afe6d --- /dev/null +++ b/projects/Allwinner/patches/linux/0012-H6-USB3.patch @@ -0,0 +1,252 @@ +From d996492e1f700a9f0a104c50b126a022dee77dd6 Mon Sep 17 00:00:00 2001 +From: Icenowy Zheng +Date: Mon, 25 Dec 2017 12:04:02 +0800 +Subject: [PATCH 20/34] phy: allwinner: add phy driver for USB3 PHY on + Allwinner H6 SoC + +Allwinner H6 SoC contains a USB3 PHY (with USB2 DP/DM lines also +controlled). + +Add a driver for it. + +The register operations in this driver is mainly extracted from the BSP +USB3 driver. + +Signed-off-by: Icenowy Zheng +Reviewed-by: Chen-Yu Tsai +--- + drivers/phy/allwinner/Kconfig | 12 ++ + drivers/phy/allwinner/Makefile | 1 + + drivers/phy/allwinner/phy-sun50i-usb3.c | 194 ++++++++++++++++++++++++ + 3 files changed, 207 insertions(+) + create mode 100644 drivers/phy/allwinner/phy-sun50i-usb3.c + +diff --git a/drivers/phy/allwinner/Kconfig b/drivers/phy/allwinner/Kconfig +index fb1204bcc4548..2c363db177f20 100644 +--- a/drivers/phy/allwinner/Kconfig ++++ b/drivers/phy/allwinner/Kconfig +@@ -41,3 +41,15 @@ config PHY_SUN9I_USB + sun9i SoCs. + + This driver controls each individual USB 2 host PHY. ++ ++config PHY_SUN50I_USB3 ++ tristate "Allwinner sun50i SoC USB3 PHY driver" ++ depends on ARCH_SUNXI && HAS_IOMEM && OF ++ depends on RESET_CONTROLLER ++ select USB_COMMON ++ select GENERIC_PHY ++ help ++ Enable this to support the USB3.0-capable transceiver that is ++ part of some Allwinner sun50i SoCs. ++ ++ This driver controls each individual USB 2+3 host PHY combo. +diff --git a/drivers/phy/allwinner/Makefile b/drivers/phy/allwinner/Makefile +index 7d0053efbfaa6..59575a895779b 100644 +--- a/drivers/phy/allwinner/Makefile ++++ b/drivers/phy/allwinner/Makefile +@@ -1,3 +1,4 @@ + obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o + obj-$(CONFIG_PHY_SUN6I_MIPI_DPHY) += phy-sun6i-mipi-dphy.o + obj-$(CONFIG_PHY_SUN9I_USB) += phy-sun9i-usb.o ++obj-$(CONFIG_PHY_SUN50I_USB3) += phy-sun50i-usb3.o +diff --git a/drivers/phy/allwinner/phy-sun50i-usb3.c b/drivers/phy/allwinner/phy-sun50i-usb3.c +new file mode 100644 +index 0000000000000..226c99c2d664c +--- /dev/null ++++ b/drivers/phy/allwinner/phy-sun50i-usb3.c +@@ -0,0 +1,194 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * Allwinner sun50i(H6) USB 3.0 phy driver ++ * ++ * Copyright (C) 2017 Icenowy Zheng ++ * ++ * Based on phy-sun9i-usb.c, which is: ++ * ++ * Copyright (C) 2014-2015 Chen-Yu Tsai ++ * ++ * Based on code from Allwinner BSP, which is: ++ * ++ * Copyright (c) 2010-2015 Allwinner Technology Co., Ltd. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Interface Status and Control Registers */ ++#define SUNXI_ISCR 0x00 ++#define SUNXI_PIPE_CLOCK_CONTROL 0x14 ++#define SUNXI_PHY_TUNE_LOW 0x18 ++#define SUNXI_PHY_TUNE_HIGH 0x1c ++#define SUNXI_PHY_EXTERNAL_CONTROL 0x20 ++ ++/* USB2.0 Interface Status and Control Register */ ++#define SUNXI_ISCR_FORCE_VBUS (3 << 12) ++ ++/* PIPE Clock Control Register */ ++#define SUNXI_PCC_PIPE_CLK_OPEN (1 << 6) ++ ++/* PHY External Control Register */ ++#define SUNXI_PEC_EXTERN_VBUS (3 << 1) ++#define SUNXI_PEC_SSC_EN (1 << 24) ++#define SUNXI_PEC_REF_SSP_EN (1 << 26) ++ ++/* PHY Tune High Register */ ++#define SUNXI_TX_DEEMPH_3P5DB(n) ((n) << 19) ++#define SUNXI_TX_DEEMPH_3P5DB_MASK GENMASK(24, 19) ++#define SUNXI_TX_DEEMPH_6DB(n) ((n) << 13) ++#define SUNXI_TX_DEEMPH_6GB_MASK GENMASK(18, 13) ++#define SUNXI_TX_SWING_FULL(n) ((n) << 6) ++#define SUNXI_TX_SWING_FULL_MASK GENMASK(12, 6) ++#define SUNXI_LOS_BIAS(n) ((n) << 3) ++#define SUNXI_LOS_BIAS_MASK GENMASK(5, 3) ++#define SUNXI_TXVBOOSTLVL(n) ((n) << 0) ++#define SUNXI_TXVBOOSTLVL_MASK GENMASK(0, 2) ++ ++struct sun50i_usb3_phy { ++ struct phy *phy; ++ void __iomem *regs; ++ struct reset_control *reset; ++ struct clk *clk; ++}; ++ ++static void sun50i_usb3_phy_open(struct sun50i_usb3_phy *phy) ++{ ++ u32 val; ++ ++ val = readl(phy->regs + SUNXI_PHY_EXTERNAL_CONTROL); ++ val |= SUNXI_PEC_EXTERN_VBUS; ++ val |= SUNXI_PEC_SSC_EN | SUNXI_PEC_REF_SSP_EN; ++ writel(val, phy->regs + SUNXI_PHY_EXTERNAL_CONTROL); ++ ++ val = readl(phy->regs + SUNXI_PIPE_CLOCK_CONTROL); ++ val |= SUNXI_PCC_PIPE_CLK_OPEN; ++ writel(val, phy->regs + SUNXI_PIPE_CLOCK_CONTROL); ++ ++ val = readl(phy->regs + SUNXI_ISCR); ++ val |= SUNXI_ISCR_FORCE_VBUS; ++ writel(val, phy->regs + SUNXI_ISCR); ++ ++ /* ++ * All the magic numbers written to the PHY_TUNE_{LOW_HIGH} ++ * registers are directly taken from the BSP USB3 driver from ++ * Allwiner. ++ */ ++ writel(0x0047fc87, phy->regs + SUNXI_PHY_TUNE_LOW); ++ ++ val = readl(phy->regs + SUNXI_PHY_TUNE_HIGH); ++ val &= ~(SUNXI_TXVBOOSTLVL_MASK | SUNXI_LOS_BIAS_MASK | ++ SUNXI_TX_SWING_FULL_MASK | SUNXI_TX_DEEMPH_6GB_MASK | ++ SUNXI_TX_DEEMPH_3P5DB_MASK); ++ val |= SUNXI_TXVBOOSTLVL(0x7); ++ val |= SUNXI_LOS_BIAS(0x7); ++ val |= SUNXI_TX_SWING_FULL(0x55); ++ val |= SUNXI_TX_DEEMPH_6DB(0x20); ++ val |= SUNXI_TX_DEEMPH_3P5DB(0x15); ++ writel(val, phy->regs + SUNXI_PHY_TUNE_HIGH); ++} ++ ++static int sun50i_usb3_phy_init(struct phy *_phy) ++{ ++ struct sun50i_usb3_phy *phy = phy_get_drvdata(_phy); ++ int ret; ++ ++ ret = clk_prepare_enable(phy->clk); ++ if (ret) ++ goto err_clk; ++ ++ ret = reset_control_deassert(phy->reset); ++ if (ret) ++ goto err_reset; ++ ++ sun50i_usb3_phy_open(phy); ++ return 0; ++ ++err_reset: ++ clk_disable_unprepare(phy->clk); ++ ++err_clk: ++ return ret; ++} ++ ++static int sun50i_usb3_phy_exit(struct phy *_phy) ++{ ++ struct sun50i_usb3_phy *phy = phy_get_drvdata(_phy); ++ ++ reset_control_assert(phy->reset); ++ clk_disable_unprepare(phy->clk); ++ ++ return 0; ++} ++ ++static const struct phy_ops sun50i_usb3_phy_ops = { ++ .init = sun50i_usb3_phy_init, ++ .exit = sun50i_usb3_phy_exit, ++ .owner = THIS_MODULE, ++}; ++ ++static int sun50i_usb3_phy_probe(struct platform_device *pdev) ++{ ++ struct sun50i_usb3_phy *phy; ++ struct device *dev = &pdev->dev; ++ struct phy_provider *phy_provider; ++ struct resource *res; ++ ++ phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); ++ if (!phy) ++ return -ENOMEM; ++ ++ phy->clk = devm_clk_get(dev, NULL); ++ if (IS_ERR(phy->clk)) { ++ dev_err(dev, "failed to get phy clock\n"); ++ return PTR_ERR(phy->clk); ++ } ++ ++ phy->reset = devm_reset_control_get(dev, NULL); ++ if (IS_ERR(phy->reset)) { ++ dev_err(dev, "failed to get reset control\n"); ++ return PTR_ERR(phy->reset); ++ } ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ phy->regs = devm_ioremap_resource(dev, res); ++ if (IS_ERR(phy->regs)) ++ return PTR_ERR(phy->regs); ++ ++ phy->phy = devm_phy_create(dev, NULL, &sun50i_usb3_phy_ops); ++ if (IS_ERR(phy->phy)) { ++ dev_err(dev, "failed to create PHY\n"); ++ return PTR_ERR(phy->phy); ++ } ++ ++ phy_set_drvdata(phy->phy, phy); ++ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); ++ ++ return PTR_ERR_OR_ZERO(phy_provider); ++} ++ ++static const struct of_device_id sun50i_usb3_phy_of_match[] = { ++ { .compatible = "allwinner,sun50i-h6-usb3-phy" }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, sun50i_usb3_phy_of_match); ++ ++static struct platform_driver sun50i_usb3_phy_driver = { ++ .probe = sun50i_usb3_phy_probe, ++ .driver = { ++ .of_match_table = sun50i_usb3_phy_of_match, ++ .name = "sun50i-usb3-phy", ++ } ++}; ++module_platform_driver(sun50i_usb3_phy_driver); ++ ++MODULE_DESCRIPTION("Allwinner sun50i USB 3.0 phy driver"); ++MODULE_AUTHOR("Icenowy Zheng "); ++MODULE_LICENSE("GPL"); diff --git a/projects/Allwinner/patches/linux/0018-cedrus-increase-frequency.patch b/projects/Allwinner/patches/linux/0018-cedrus-increase-frequency.patch deleted file mode 100644 index 680adb5aff..0000000000 --- a/projects/Allwinner/patches/linux/0018-cedrus-increase-frequency.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 18c9a269e2b744ee84f32de9d5c6c66857725ef8 Mon Sep 17 00:00:00 2001 -From: Jernej Skrabec -Date: Sat, 15 Dec 2018 12:56:53 +0100 -Subject: [PATCH 20/20] cedrus increase frequency - ---- - drivers/staging/media/sunxi/cedrus/cedrus_hw.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -index b43c77d54b95..70677571f3d3 100644 ---- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -+++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.h -@@ -16,7 +16,7 @@ - #ifndef _CEDRUS_HW_H_ - #define _CEDRUS_HW_H_ - --#define CEDRUS_CLOCK_RATE_DEFAULT 320000000 -+#define CEDRUS_CLOCK_RATE_DEFAULT 402000000 - - int cedrus_engine_enable(struct cedrus_dev *dev, enum cedrus_codec codec); - void cedrus_engine_disable(struct cedrus_dev *dev); --- -2.20.0 - diff --git a/projects/Allwinner/patches/u-boot/001-sun8i-h3-Add-support-for-the-Beelink-x2-STB.patch b/projects/Allwinner/patches/u-boot/001-sun8i-h3-Add-support-for-the-Beelink-x2-STB.patch index ab823e9d56..bcd30193cd 100644 --- a/projects/Allwinner/patches/u-boot/001-sun8i-h3-Add-support-for-the-Beelink-x2-STB.patch +++ b/projects/Allwinner/patches/u-boot/001-sun8i-h3-Add-support-for-the-Beelink-x2-STB.patch @@ -258,23 +258,21 @@ new file mode 100644 index 0000000000..6508e470a0 --- /dev/null +++ b/configs/beelink_x2_defconfig -@@ -0,0 +1,19 @@ +@@ -0,0 +1,17 @@ +CONFIG_ARM=y +CONFIG_ARCH_SUNXI=y +CONFIG_SPL=y +CONFIG_MACH_SUN8I_H3=y -+CONFIG_DRAM_CLK=624 ++CONFIG_DRAM_CLK=576 +CONFIG_DRAM_ZQ=3881979 +CONFIG_DRAM_ODT_EN=y +CONFIG_MMC_SUNXI_SLOT_EXTRA=2 -+CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-beelink-x2" ++CONFIG_NR_DRAM_BANKS=1 +# CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set -+CONFIG_CONSOLE_MUX=y -+CONFIG_SPL_I2C_SUPPORT=y +# CONFIG_CMD_FLASH is not set +# CONFIG_SPL_DOS_PARTITION is not set +# CONFIG_SPL_EFI_PARTITION is not set ++CONFIG_DEFAULT_DEVICE_TREE="sun8i-h3-beelink-x2" +CONFIG_SUN8I_EMAC=y -+CONFIG_SY8106A_POWER=y +CONFIG_USB_EHCI_HCD=y +CONFIG_SYS_USB_EVENT_POLL_VIA_INT_QUEUE=y diff --git a/projects/Allwinner/patches/u-boot/003-fix-hdmi-clocks.patch b/projects/Allwinner/patches/u-boot/003-fix-hdmi-clocks.patch deleted file mode 100644 index 417c52b652..0000000000 --- a/projects/Allwinner/patches/u-boot/003-fix-hdmi-clocks.patch +++ /dev/null @@ -1,135 +0,0 @@ -diff --git a/drivers/video/sunxi/sunxi_dw_hdmi.c b/drivers/video/sunxi/sunxi_dw_hdmi.c -index 9dbea649a0..a2aced2cab 100644 ---- a/drivers/video/sunxi/sunxi_dw_hdmi.c -+++ b/drivers/video/sunxi/sunxi_dw_hdmi.c -@@ -132,7 +132,7 @@ static int sunxi_dw_hdmi_wait_for_hpd(void) - return -1; - } - --static void sunxi_dw_hdmi_phy_set(uint clock) -+static void sunxi_dw_hdmi_phy_set(uint clock, int phy_div) - { - struct sunxi_hdmi_phy * const phy = - (struct sunxi_hdmi_phy *)(SUNXI_HDMI_BASE + HDMI_PHY_OFFS); -@@ -146,7 +146,7 @@ static void sunxi_dw_hdmi_phy_set(uint clock) - switch (div) { - case 1: - writel(0x30dc5fc0, &phy->pll); -- writel(0x800863C0, &phy->clk); -+ writel(0x800863C0 | (phy_div - 1), &phy->clk); - mdelay(10); - writel(0x00000001, &phy->unk3); - setbits_le32(&phy->pll, BIT(25)); -@@ -164,7 +164,7 @@ static void sunxi_dw_hdmi_phy_set(uint clock) - break; - case 2: - writel(0x39dc5040, &phy->pll); -- writel(0x80084381, &phy->clk); -+ writel(0x80084380 | (phy_div - 1), &phy->clk); - mdelay(10); - writel(0x00000001, &phy->unk3); - setbits_le32(&phy->pll, BIT(25)); -@@ -178,7 +178,7 @@ static void sunxi_dw_hdmi_phy_set(uint clock) - break; - case 4: - writel(0x39dc5040, &phy->pll); -- writel(0x80084343, &phy->clk); -+ writel(0x80084340 | (phy_div - 1), &phy->clk); - mdelay(10); - writel(0x00000001, &phy->unk3); - setbits_le32(&phy->pll, BIT(25)); -@@ -192,7 +192,7 @@ static void sunxi_dw_hdmi_phy_set(uint clock) - break; - case 11: - writel(0x39dc5040, &phy->pll); -- writel(0x8008430a, &phy->clk); -+ writel(0x80084300 | (phy_div - 1), &phy->clk); - mdelay(10); - writel(0x00000001, &phy->unk3); - setbits_le32(&phy->pll, BIT(25)); -@@ -207,36 +207,46 @@ static void sunxi_dw_hdmi_phy_set(uint clock) - } - } - --static void sunxi_dw_hdmi_pll_set(uint clk_khz) -+static void sunxi_dw_hdmi_pll_set(uint clk_khz, int *phy_div) - { -- int value, n, m, div = 0, diff; -- int best_n = 0, best_m = 0, best_diff = 0x0FFFFFFF; -- -- div = sunxi_dw_hdmi_get_divider(clk_khz * 1000); -+ int value, n, m, div, diff; -+ int best_n = 0, best_m = 0, best_div = 0, best_diff = 0x0FFFFFFF; - - /* - * Find the lowest divider resulting in a matching clock. If there - * is no match, pick the closest lower clock, as monitors tend to - * not sync to higher frequencies. - */ -- for (m = 1; m <= 16; m++) { -- n = (m * div * clk_khz) / 24000; -- -- if ((n >= 1) && (n <= 128)) { -- value = (24000 * n) / m / div; -- diff = clk_khz - value; -- if (diff < best_diff) { -- best_diff = diff; -- best_m = m; -- best_n = n; -+ for (div = 1; div <= 16; div++) { -+ int target = clk_khz * div; -+ -+ if (target < 192000) -+ continue; -+ if (target > 912000) -+ continue; -+ -+ for (m = 1; m <= 16; m++) { -+ n = (m * target) / 24000; -+ -+ if ((n >= 1) && (n <= 128)) { -+ value = (24000 * n) / m / div; -+ diff = clk_khz - value; -+ if (diff < best_diff) { -+ best_diff = diff; -+ best_m = m; -+ best_n = n; -+ best_div = div; -+ } - } - } - } - -+ *phy_div = best_div; -+ - clock_set_pll3_factors(best_m, best_n); - debug("dotclock: %dkHz = %dkHz: (24MHz * %d) / %d / %d\n", -- clk_khz, (clock_get_pll3() / 1000) / div, -- best_n, best_m, div); -+ clk_khz, (clock_get_pll3() / 1000) / best_div, -+ best_n, best_m, best_div); - } - - static void sunxi_dw_hdmi_lcdc_init(int mux, const struct display_timing *edid, -@@ -244,7 +254,7 @@ static void sunxi_dw_hdmi_lcdc_init(int mux, const struct display_timing *edid, - { - struct sunxi_ccm_reg * const ccm = - (struct sunxi_ccm_reg *)SUNXI_CCM_BASE; -- int div = sunxi_dw_hdmi_get_divider(edid->pixelclock.typ); -+ int div = clock_get_pll3() / edid->pixelclock.typ; - struct sunxi_lcdc_reg *lcdc; - - if (mux == 0) { -@@ -276,8 +286,10 @@ static void sunxi_dw_hdmi_lcdc_init(int mux, const struct display_timing *edid, - - static int sunxi_dw_hdmi_phy_cfg(struct dw_hdmi *hdmi, uint mpixelclock) - { -- sunxi_dw_hdmi_pll_set(mpixelclock/1000); -- sunxi_dw_hdmi_phy_set(mpixelclock); -+ int phy_div; -+ -+ sunxi_dw_hdmi_pll_set(mpixelclock/1000, &phy_div); -+ sunxi_dw_hdmi_phy_set(mpixelclock, phy_div); - - return 0; - } diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index 477a829856..b401135c1e 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 5.0.6 Kernel Configuration +# Linux/x86_64 5.1.6 Kernel Configuration # # @@ -10,6 +10,7 @@ CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=70200 CONFIG_CLANG_VERSION=0 CONFIG_CC_HAS_ASM_GOTO=y +CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_EXTABLE_SORT=y CONFIG_THREAD_INFO_IN_TASK=y @@ -193,6 +194,7 @@ CONFIG_TIMERFD=y CONFIG_EVENTFD=y CONFIG_SHMEM=y CONFIG_AIO=y +CONFIG_IO_URING=y CONFIG_ADVISE_SYSCALLS=y CONFIG_MEMBARRIER=y CONFIG_KALLSYMS=y @@ -469,6 +471,7 @@ CONFIG_ACPI_THERMAL=y CONFIG_ACPI_NUMA=y CONFIG_ARCH_HAS_ACPI_TABLE_UPGRADE=y CONFIG_ACPI_TABLE_UPGRADE=y +# CONFIG_ACPI_TABLE_OVERRIDE_VIA_BUILTIN_INITRD is not set # CONFIG_ACPI_DEBUG is not set # CONFIG_ACPI_PCI_SLOT is not set CONFIG_ACPI_CONTAINER=y @@ -531,6 +534,7 @@ CONFIG_X86_SPEEDSTEP_LIB=y CONFIG_CPU_IDLE=y CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set CONFIG_INTEL_IDLE=y # @@ -549,7 +553,6 @@ CONFIG_AMD_NB=y # Binary Emulations # CONFIG_IA32_EMULATION=y -# CONFIG_IA32_AOUT is not set # CONFIG_X86_X32 is not set CONFIG_COMPAT_32=y CONFIG_COMPAT=y @@ -672,6 +675,7 @@ CONFIG_HAVE_STACK_VALIDATION=y CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_64BIT_TIME=y CONFIG_COMPAT_32BIT_TIME=y CONFIG_HAVE_ARCH_VMAP_STACK=y # CONFIG_VMAP_STACK is not set @@ -837,6 +841,7 @@ CONFIG_SKB_EXTENSIONS=y CONFIG_PACKET=y # CONFIG_PACKET_DIAG is not set CONFIG_UNIX=y +CONFIG_UNIX_SCM=y # CONFIG_UNIX_DIAG is not set # CONFIG_TLS is not set # CONFIG_XFRM_USER is not set @@ -960,6 +965,7 @@ CONFIG_NF_NAT_NEEDED=y CONFIG_NF_NAT_FTP=m CONFIG_NF_NAT_IRC=m CONFIG_NF_NAT_SIP=m +CONFIG_NF_NAT_MASQUERADE=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m @@ -1053,8 +1059,6 @@ CONFIG_NF_DEFRAG_IPV4=m # CONFIG_NF_LOG_ARP is not set # CONFIG_NF_LOG_IPV4 is not set CONFIG_NF_REJECT_IPV4=m -CONFIG_NF_NAT_IPV4=m -CONFIG_NF_NAT_MASQUERADE_IPV4=y CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set @@ -1082,7 +1086,6 @@ CONFIG_IP_NF_MANGLE=m # CONFIG_NF_DUP_IPV6 is not set CONFIG_NF_REJECT_IPV6=m # CONFIG_NF_LOG_IPV6 is not set -CONFIG_NF_NAT_IPV6=m CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_AH is not set # CONFIG_IP6_NF_MATCH_EUI64 is not set @@ -1312,7 +1315,6 @@ CONFIG_RFKILL_INPUT=y CONFIG_DST_CACHE=y CONFIG_GRO_CELLS=y # CONFIG_NET_DEVLINK is not set -CONFIG_MAY_USE_DEVLINK=y CONFIG_FAILOVER=y CONFIG_HAVE_EBPF_JIT=y @@ -1337,6 +1339,7 @@ CONFIG_PCIEASPM_DEFAULT=y CONFIG_PCIE_PME=y # CONFIG_PCIE_DPC is not set # CONFIG_PCIE_PTM is not set +# CONFIG_PCIE_BW is not set CONFIG_PCI_MSI=y CONFIG_PCI_MSI_IRQ_DOMAIN=y CONFIG_PCI_QUIRKS=y @@ -1502,6 +1505,7 @@ CONFIG_ALTERA_STAPL=m # CONFIG_INTEL_MEI is not set # CONFIG_INTEL_MEI_ME is not set # CONFIG_INTEL_MEI_TXE is not set +# CONFIG_INTEL_MEI_HDCP is not set # CONFIG_VMWARE_VMCI is not set # @@ -1547,6 +1551,7 @@ CONFIG_ALTERA_STAPL=m # CONFIG_MISC_ALCOR_PCI is not set CONFIG_MISC_RTSX_PCI=y CONFIG_MISC_RTSX_USB=y +# CONFIG_HABANA_AI is not set CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -1640,7 +1645,6 @@ CONFIG_MEGARAID_SAS=y # CONFIG_SCSI_PM8001 is not set # CONFIG_SCSI_VIRTIO is not set # CONFIG_SCSI_DH is not set -# CONFIG_SCSI_OSD_INITIATOR is not set CONFIG_ATA=y # CONFIG_ATA_VERBOSE_ERROR is not set CONFIG_ATA_ACPI=y @@ -2162,6 +2166,7 @@ CONFIG_MT76x0E=m CONFIG_MT76x2_COMMON=m CONFIG_MT76x2E=m CONFIG_MT76x2U=m +CONFIG_MT7603E=m CONFIG_WLAN_VENDOR_RALINK=y CONFIG_RT2X00=m CONFIG_RT2400PCI=m @@ -2422,6 +2427,7 @@ CONFIG_INPUT_MISC=y # CONFIG_INPUT_AD714X is not set # CONFIG_INPUT_BMA150 is not set # CONFIG_INPUT_E3X0_BUTTON is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set # CONFIG_INPUT_MMA8450 is not set # CONFIG_INPUT_APANEL is not set # CONFIG_INPUT_GP2A is not set @@ -2492,6 +2498,7 @@ CONFIG_UNIX98_PTYS=y # CONFIG_NOZOMI is not set # CONFIG_N_GSM is not set # CONFIG_TRACE_SINK is not set +CONFIG_LDISC_AUTOLOAD=y CONFIG_DEVMEM=y # CONFIG_DEVKMEM is not set @@ -2545,7 +2552,6 @@ CONFIG_HW_RANDOM_AMD=m # CONFIG_HW_RANDOM_VIA is not set CONFIG_HW_RANDOM_VIRTIO=m # CONFIG_NVRAM is not set -# CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # CONFIG_MWAVE is not set # CONFIG_RAW_DRIVER is not set @@ -2708,6 +2714,7 @@ CONFIG_GPIO_SYSFS=y # CONFIG_GPIO_MB86S7X is not set # CONFIG_GPIO_MOCKUP is not set # CONFIG_GPIO_VX855 is not set +# CONFIG_GPIO_AMD_FCH is not set # # Port-mapped I/O GPIO drivers @@ -3047,6 +3054,7 @@ CONFIG_MFD_INTEL_LPSS_PCI=y # CONFIG_TWL6040_CORE is not set # CONFIG_MFD_WL1273_CORE is not set # CONFIG_MFD_LM3533 is not set +# CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_WM8400 is not set @@ -3417,10 +3425,6 @@ CONFIG_VIDEO_SAA6752HS=m # # Miscellaneous helper chips # - -# -# Sensors used on soc_camera driver -# CONFIG_MEDIA_TUNER=m CONFIG_MEDIA_TUNER_SIMPLE=m CONFIG_MEDIA_TUNER_TDA18250=m @@ -3643,6 +3647,10 @@ CONFIG_DRM_SCHED=y # CONFIG_DRM_I2C_SIL164 is not set # CONFIG_DRM_I2C_NXP_TDA998X is not set # CONFIG_DRM_I2C_NXP_TDA9950 is not set + +# +# ARM devices +# CONFIG_DRM_RADEON=y # CONFIG_DRM_RADEON_USERPTR is not set CONFIG_DRM_AMDGPU=y @@ -3716,6 +3724,7 @@ CONFIG_DRM_PANEL_BRIDGE=y # Display Interface Bridges # # CONFIG_DRM_ANALOGIX_ANX78XX is not set +# CONFIG_DRM_ETNAVIV is not set # CONFIG_DRM_HISI_HIBMC is not set # CONFIG_DRM_TINYDRM is not set # CONFIG_DRM_LEGACY is not set @@ -3995,6 +4004,7 @@ CONFIG_SND_SOC_AMD_ACP3x=m # CONFIG_SND_SOC_FSL_SSI is not set # CONFIG_SND_SOC_FSL_SPDIF is not set # CONFIG_SND_SOC_FSL_ESAI is not set +# CONFIG_SND_SOC_FSL_MICFIL is not set # CONFIG_SND_SOC_IMX_AUDMUX is not set # CONFIG_SND_I2S_HI6210_I2S is not set # CONFIG_SND_SOC_IMG is not set @@ -4044,11 +4054,14 @@ CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH=m # CONFIG_SND_SOC_INTEL_KBL_RT5660_MACH is not set # CONFIG_SND_SOC_INTEL_GLK_RT5682_MAX98357A_MACH is not set CONFIG_SND_SOC_INTEL_SKL_HDA_DSP_GENERIC_MACH=m +# CONFIG_SND_SOC_MTK_BTCVSD is not set # # STMicroelectronics STM32 SOC audio support # # CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set # CONFIG_SND_SOC_XTFPGA_I2S is not set # CONFIG_ZX_TDM is not set CONFIG_SND_SOC_I2C_AND_SPI=y @@ -4074,6 +4087,7 @@ CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_CS35L33 is not set # CONFIG_SND_SOC_CS35L34 is not set # CONFIG_SND_SOC_CS35L35 is not set +# CONFIG_SND_SOC_CS35L36 is not set # CONFIG_SND_SOC_CS42L42 is not set # CONFIG_SND_SOC_CS42L51_I2C is not set # CONFIG_SND_SOC_CS42L52 is not set @@ -4084,6 +4098,7 @@ CONFIG_SND_SOC_ADAU7002=m # CONFIG_SND_SOC_CS4271_I2C is not set # CONFIG_SND_SOC_CS42XX8_I2C is not set # CONFIG_SND_SOC_CS43130 is not set +# CONFIG_SND_SOC_CS4341 is not set # CONFIG_SND_SOC_CS4349 is not set # CONFIG_SND_SOC_CS53L30 is not set CONFIG_SND_SOC_DA7213=m @@ -4113,6 +4128,7 @@ CONFIG_SND_SOC_MAX98927=m # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3168A_I2C is not set # CONFIG_SND_SOC_PCM512x_I2C is not set +# CONFIG_SND_SOC_RK3328 is not set CONFIG_SND_SOC_RL6231=m # CONFIG_SND_SOC_RT5616 is not set # CONFIG_SND_SOC_RT5631 is not set @@ -4159,6 +4175,7 @@ CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_WM8782 is not set # CONFIG_SND_SOC_WM8804_I2C is not set # CONFIG_SND_SOC_WM8903 is not set +# CONFIG_SND_SOC_WM8904 is not set # CONFIG_SND_SOC_WM8960 is not set # CONFIG_SND_SOC_WM8962 is not set # CONFIG_SND_SOC_WM8974 is not set @@ -4167,6 +4184,7 @@ CONFIG_SND_SOC_TS3A227E=m # CONFIG_SND_SOC_ZX_AUD96P22 is not set # CONFIG_SND_SOC_MAX9759 is not set # CONFIG_SND_SOC_MT6351 is not set +# CONFIG_SND_SOC_MT6358 is not set # CONFIG_SND_SOC_NAU8540 is not set # CONFIG_SND_SOC_NAU8810 is not set # CONFIG_SND_SOC_NAU8822 is not set @@ -4223,6 +4241,7 @@ CONFIG_HID_EZKEY=y CONFIG_HID_KYE=y # CONFIG_HID_UCLOGIC is not set # CONFIG_HID_WALTOP is not set +# CONFIG_HID_VIEWSONIC is not set CONFIG_HID_GYRATION=y # CONFIG_HID_ICADE is not set # CONFIG_HID_ITE is not set @@ -4240,6 +4259,7 @@ CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y CONFIG_LOGIWHEELS_FF=y # CONFIG_HID_MAGICMOUSE is not set +# CONFIG_HID_MALTRON is not set # CONFIG_HID_MAYFLASH is not set # CONFIG_HID_REDRAGON is not set CONFIG_HID_MICROSOFT=y @@ -4316,6 +4336,7 @@ CONFIG_USB_DEFAULT_PERSIST=y # CONFIG_USB_OTG_WHITELIST is not set # CONFIG_USB_OTG_BLACKLIST_HUB is not set # CONFIG_USB_LEDS_TRIGGER_USBPORT is not set +CONFIG_USB_AUTOSUSPEND_DELAY=2 CONFIG_USB_MON=m # CONFIG_USB_WUSB_CBAF is not set @@ -4331,6 +4352,7 @@ CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_TT_NEWSCHED=y CONFIG_USB_EHCI_PCI=y +# CONFIG_USB_EHCI_FSL is not set # CONFIG_USB_EHCI_HCD_PLATFORM is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set @@ -4624,6 +4646,7 @@ CONFIG_RTC_INTF_DEV=y # I2C RTC drivers # # CONFIG_RTC_DRV_ABB5ZES3 is not set +# CONFIG_RTC_DRV_ABEOZ9 is not set # CONFIG_RTC_DRV_ABX80X is not set # CONFIG_RTC_DRV_DS1307 is not set # CONFIG_RTC_DRV_DS1374 is not set @@ -4646,7 +4669,9 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_RX8581 is not set # CONFIG_RTC_DRV_RX8025 is not set # CONFIG_RTC_DRV_EM3027 is not set +# CONFIG_RTC_DRV_RV3028 is not set # CONFIG_RTC_DRV_RV8803 is not set +# CONFIG_RTC_DRV_SD3078 is not set # # SPI RTC drivers @@ -4687,7 +4712,6 @@ CONFIG_RTC_DRV_CMOS=y # # HID Sensor RTC drivers # -# CONFIG_RTC_DRV_HID_SENSOR_TIME is not set CONFIG_DMADEVICES=y # CONFIG_DMADEVICES_DEBUG is not set @@ -4759,7 +4783,6 @@ CONFIG_RTS5208=y # CONFIG_VT6655 is not set CONFIG_VT6656=m # CONFIG_FB_SM750 is not set -# CONFIG_FB_XGI is not set # # Speakup console speech @@ -4768,6 +4791,10 @@ CONFIG_VT6656=m CONFIG_STAGING_MEDIA=y # CONFIG_VIDEO_ZORAN is not set +# +# soc_camera sensor drivers +# + # # Android # @@ -4780,13 +4807,11 @@ CONFIG_STAGING_MEDIA=y # CONFIG_KS7010 is not set # CONFIG_GREYBUS is not set # CONFIG_DRM_VBOXVIDEO is not set -# CONFIG_MTK_MMC is not set # # Gasket devices # # CONFIG_STAGING_GASKET_FRAMEWORK is not set -# CONFIG_XIL_AXIS_FIFO is not set # CONFIG_EROFS_FS is not set CONFIG_X86_PLATFORM_DEVICES=y # CONFIG_ACER_WMI is not set @@ -4849,6 +4874,7 @@ CONFIG_WMI_BMOF=y # CONFIG_I2C_MULTI_INSTANTIATE is not set CONFIG_INTEL_ATOMISP2_PM=y # CONFIG_HUAWEI_WMI is not set +# CONFIG_PCENGINES_APU2 is not set CONFIG_PMC_ATOM=y # CONFIG_CHROME_PLATFORMS is not set # CONFIG_MELLANOX_PLATFORM is not set @@ -4969,11 +4995,13 @@ CONFIG_NVMEM=y # CONFIG_UNISYS_VISORBUS is not set # CONFIG_SIOX is not set # CONFIG_SLIMBUS is not set +# CONFIG_INTERCONNECT is not set # # File systems # CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_VALIDATE_FS_PARSER=y CONFIG_FS_IOMAP=y # CONFIG_EXT2_FS is not set # CONFIG_EXT3_FS is not set @@ -4981,7 +5009,6 @@ CONFIG_EXT4_FS=y CONFIG_EXT4_USE_FOR_EXT2=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y -# CONFIG_EXT4_ENCRYPTION is not set # CONFIG_EXT4_DEBUG is not set CONFIG_JBD2=y # CONFIG_JBD2_DEBUG is not set @@ -5150,6 +5177,7 @@ CONFIG_SUNRPC_GSS=y CONFIG_SUNRPC_BACKCHANNEL=y CONFIG_SUNRPC_SWAP=y CONFIG_RPCSEC_GSS_KRB5=m +# CONFIG_CONFIG_SUNRPC_DISABLE_INSECURE_ENCTYPES is not set # CONFIG_SUNRPC_DEBUG is not set # CONFIG_CEPH_FS is not set CONFIG_CIFS=y @@ -5234,7 +5262,7 @@ CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_FORTIFY_SOURCE is not set # CONFIG_STATIC_USERMODEHELPER is not set CONFIG_DEFAULT_SECURITY_DAC=y -CONFIG_DEFAULT_SECURITY="" +CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor" CONFIG_XOR_BLOCKS=y CONFIG_CRYPTO=y @@ -5264,6 +5292,7 @@ CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y # CONFIG_CRYPTO_USER is not set # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +# CONFIG_CRYPTO_MANAGER_EXTRA_TESTS is not set CONFIG_CRYPTO_GF128MUL=m CONFIG_CRYPTO_NULL=y CONFIG_CRYPTO_NULL2=y @@ -5478,7 +5507,6 @@ CONFIG_XZ_DEC=y # CONFIG_XZ_DEC_ARMTHUMB is not set # CONFIG_XZ_DEC_SPARC is not set # CONFIG_XZ_DEC_TEST is not set -CONFIG_DECOMPRESS_GZIP=y CONFIG_INTERVAL_TREE=y CONFIG_XARRAY_MULTI=y CONFIG_ASSOCIATIVE_ARRAY=y @@ -5489,6 +5517,7 @@ CONFIG_NEED_SG_DMA_LENGTH=y CONFIG_NEED_DMA_MAP_STATE=y CONFIG_ARCH_DMA_ADDR_T_64BIT=y CONFIG_SWIOTLB=y +# CONFIG_DMA_API_DEBUG is not set CONFIG_SGL_ALLOC=y CONFIG_IOMMU_HELPER=y CONFIG_CHECK_SIGNATURE=y @@ -5522,6 +5551,7 @@ CONFIG_SBITMAP=y # printk and dmesg options # CONFIG_PRINTK_TIME=y +# CONFIG_PRINTK_CALLER is not set CONFIG_CONSOLE_LOGLEVEL_DEFAULT=7 CONFIG_CONSOLE_LOGLEVEL_QUIET=4 CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4 @@ -5537,7 +5567,6 @@ CONFIG_FRAME_WARN=1024 CONFIG_STRIP_ASM_SYMS=y # CONFIG_READABLE_ASM is not set # CONFIG_UNUSED_SYMBOLS is not set -# CONFIG_PAGE_OWNER is not set CONFIG_DEBUG_FS=y # CONFIG_HEADERS_CHECK is not set # CONFIG_DEBUG_SECTION_MISMATCH is not set @@ -5555,6 +5584,7 @@ CONFIG_DEBUG_KERNEL=y # # CONFIG_PAGE_EXTENSION is not set # CONFIG_DEBUG_PAGEALLOC is not set +# CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set # CONFIG_DEBUG_PAGE_REF is not set # CONFIG_DEBUG_RODATA_TEST is not set @@ -5703,7 +5733,6 @@ CONFIG_FTRACE_MCOUNT_RECORD=y # CONFIG_TRACE_EVAL_MAP_FILE is not set CONFIG_TRACING_EVENTS_GPIO=y # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set -# CONFIG_DMA_API_DEBUG is not set CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_LKDTM is not set # CONFIG_TEST_LIST_SORT is not set @@ -5727,6 +5756,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_HASH is not set # CONFIG_TEST_IDA is not set # CONFIG_TEST_LKM is not set +# CONFIG_TEST_VMALLOC is not set # CONFIG_TEST_USER_COPY is not set # CONFIG_TEST_BPF is not set # CONFIG_FIND_BIT_BENCHMARK is not set @@ -5736,6 +5766,7 @@ CONFIG_RUNTIME_TESTING_MENU=y # CONFIG_TEST_STATIC_KEYS is not set # CONFIG_TEST_KMOD is not set # CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_STACKINIT is not set # CONFIG_MEMTEST is not set # CONFIG_BUG_ON_DATA_CORRUPTION is not set # CONFIG_SAMPLES is not set @@ -5743,6 +5774,7 @@ CONFIG_HAVE_ARCH_KGDB=y # CONFIG_KGDB is not set CONFIG_ARCH_HAS_UBSAN_SANITIZE_ALL=y # CONFIG_UBSAN is not set +CONFIG_UBSAN_ALIGNMENT=y CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y CONFIG_STRICT_DEVMEM=y # CONFIG_IO_STRICT_DEVMEM is not set diff --git a/projects/Generic/options b/projects/Generic/options index 7c4e1691fc..8b667ac1cc 100644 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -21,18 +21,9 @@ # u-boot version to use (default) UBOOT_VERSION="default" - # Configuration for u-boot - UBOOT_CONFIG="" - - # Target Configfile for u-boot - UBOOT_CONFIGFILE="" - # Kernel target KERNEL_TARGET="bzImage" - # Kernel extra targets to build - KERNEL_UBOOT_EXTRA_TARGET="" - # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="" diff --git a/projects/RPi/options b/projects/RPi/options index 3713f2e866..3b0654d979 100644 --- a/projects/RPi/options +++ b/projects/RPi/options @@ -38,18 +38,9 @@ # u-boot version to use (default) UBOOT_VERSION="default" - # Configuration for u-boot - UBOOT_CONFIG="" - - # Target Configfile for u-boot - UBOOT_CONFIGFILE="" - # Kernel target KERNEL_TARGET="zImage" - # Kernel extra targets to build - KERNEL_UBOOT_EXTRA_TARGET="" - # Additional kernel make parameters (for example to specify the u-boot loadaddress) KERNEL_MAKE_EXTRACMD="dtbs" diff --git a/projects/Rockchip/options b/projects/Rockchip/options index 409645769a..a6a46fdcee 100644 --- a/projects/Rockchip/options +++ b/projects/Rockchip/options @@ -5,9 +5,6 @@ # Bootloader to use (syslinux / u-boot / bcm2835-bootloader) BOOTLOADER="u-boot" - # Kernel extra targets to build - KERNEL_UBOOT_EXTRA_TARGET="" - # Kernel to use. values can be: # default: default mainline kernel LINUX="${LINUX:-rockchip-4.4}" @@ -81,4 +78,4 @@ # driver addons to install: # for a list of additinoal drivers see packages/linux-driver-addons # Space separated list is supported, - DRIVER_ADDONS="crazycat dvb-latest" + DRIVER_ADDONS="dvb-latest" diff --git a/scripts/create_addon_st b/scripts/create_addon_st deleted file mode 100755 index 921e135600..0000000000 --- a/scripts/create_addon_st +++ /dev/null @@ -1,266 +0,0 @@ -#!/bin/bash - -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv) - -. config/options "" - -# usage -usage() { - cat - >&2 < ./script/create_addon_st all - - build audio encoders and decoders, only - > ./script/create_addon_st audioencoder.* audiodecoder.* - - build all, but not binary - > ./script/create_addon_st all -binary - -EOUSAGE - exit ${1:0} -} - -# functions -function find_addons() { - local _paths="" - local _filter="." - case $1 in - binary) _paths="$ROOT/packages/mediacenter/kodi-binary-addons";; - official) _paths="$ROOT/packages/addons";; - all) _paths="$ROOT/packages $ROOT/projects/*/packages";; - *) _paths="$ROOT/packages $ROOT/projects/*/packages"; - _filter="^$1$";; - esac - - local _addons=$( - find $_paths -name 'package.mk' \ - `# select packages with PKG_IS_ADDON (can yes, no or unset at this moment)` \ - | xargs grep -l 'PKG_IS_ADDON' \ - `# extract package name from path` \ - | sed 's|^.*/\([^/]*\)/package.mk$|\1|g' \ - `# filter package list against the given filter` \ - | grep -e "$_filter" \ - `# make entries unique` \ - | sort -u \ - `# select packages with PKG_IS_ADDON=yes (slow, but is a short list, now)` \ - | xargs -n1 -I{} /bin/bash -c '. ./config/options {} &>/dev/null; [ "$PKG_IS_ADDON" = "yes" ] && echo $PKG_NAME' - ) - - # check if anything is found - local _count=$(wc -w <<< $_addons) - if [ $_count -eq 0 ]; then - # handle embedded addons here. Should only build when they are explictly specified in the addon list - ( . ./config/options "$1" &>/dev/null - [ "$PKG_IS_ADDON" != "embedded" -a "$PKG_IS_ADDON" != "yes" ] && exit 1 - echo $PKG_NAME - ) - - # abort when nothing found and not embedded - if [ $? -ne 0 ]; then - echo "$(print_color CLR_ERROR "ERROR: '$1' matches nothing...")" >&$SILENT_OUT - echo "for more informations type: ./scripts/create_addon_st --help" >&$SILENT_OUT - die - fi - fi - - echo $_addons -} - -not_supported_arch() { - build_msg "CLR_WARNING" "*** SKIP: ${PKG_ADDON_ID} '${TARGET_ARCH}' not supported ***" - exit 0 -} - -not_supported_device() { - build_msg "CLR_WARNING" "*** SKIP: ${PKG_ADDON_ID}: '${DEVICE:-${PROJECT}}' not supported ***" - exit 0 -} - -# build addon function -build_addon() { - # addon build - . config/options $1 - - # check support - if [ -n "$PKG_ARCH" ]; then - listcontains "$PKG_ARCH" "!$TARGET_ARCH" && not_supported_arch - listcontains "$PKG_ARCH" "$TARGET_ARCH" || listcontains "$PKG_ARCH" "any" || not_supported_arch - fi - - if [ -n "$PKG_ADDON_PROJECTS" ]; then - [ "${DEVICE}" = "RPi" ] && _DEVICE="RPi1" || _DEVICE="${DEVICE}" - - if listcontains "$PKG_ADDON_PROJECTS" "!${_DEVICE:-$PROJECT}" || - listcontains "$PKG_ADDON_PROJECTS" "!${PROJECT}"; then - not_supported_device - fi - - if ! listcontains "$PKG_ADDON_PROJECTS" "${_DEVICE:-$PROJECT}" && - ! listcontains "$PKG_ADDON_PROJECTS" "${PROJECT}" && - ! listcontains "$PKG_ADDON_PROJECTS" "any"; then - not_supported_device - fi - fi - - # build addon - $SCRIPTS/build $1 - - # cleanup old install path - rm -rf $ADDON_BUILD - - # install addon parts - if pkg_call_exists addon; then - pkg_call addon - else - install_binary_addon $PKG_ADDON_ID - fi - - # HACK for packages that provide multiple addons like screensavers.rsxs - # addon's addon() in package.mk should take care for exporting - # MULTI_ADDONS="addon.boo1 addon.boo2 addon.boo3" - if [ -n "$MULTI_ADDONS" ] ; then - for _ADDON in $MULTI_ADDONS ; do - PKG_ADDON_ID=$_ADDON - ${SCRIPTS}/install_addon $PKG_NAME $PKG_ADDON_ID - done - else - ${SCRIPTS}/install_addon $PKG_NAME $PKG_ADDON_ID - fi -} - -# need parameter -if [ $# -eq 0 ]; then - usage 1 -fi - -# collect list of addons for building -addons="" -addons_drop="" -show_only="false" -write_logs="no" -log_path="$BUILD/logs" -summary_file="/dev/null" -export BUILD_INDENT=$((${BUILD_INDENT:-1}+$BUILD_INDENT_SIZE)) - -# read addons from parameter list -while [ $# -gt 0 ]; do - case $1 in - --help) usage 0;; - --show-only) show_only="true";; - --write-logs=*) write_logs="${1:13}";; - --log-path=*) log_path="${1:11}";; - --*) usage 1;; - -*) addons_drop+=" $(find_addons ${1:1})";; - *) addons+=" $(find_addons $1)";; - esac - shift -done - -# check log parameter -case "$write_logs" in - no) log_path="" - remove_success_logs="false";; - yes) remove_success_logs="false";; - errors) remove_success_logs="true";; - *) usage 1 -esac -if [ -n "$log_path" ]; then - mkdir -p "$log_path" - summary_file="$log_path/addon-summary.log" - rm -f $summary_file -fi - -# check environment and create toolchain -$SCRIPTS/checkdeps -setup_toolchain target - -# build addons, by calling function build_addon with one addon, after another -# (do not abort on build failure) -addons_failed="" -set +e -_count='' -for addon in $(tr " " "\n" <<< $addons | sort -u); do - # no build, when addon is in drop list / should not build - if listcontains "$addons_drop" "$addon"; then - continue - fi - - # show-only: print name and continue with next addon - if [ "$show_only" = "true" ]; then - echo $addon - continue - fi - - # define log file - log_file=/dev/null - if [ -n "$log_path" ]; then - log_file="$log_path/$addon.log" - fi - - # build package - echo "$(print_color CLR_BUILD "CREATE ADDON $addon") (${DEVICE:-$PROJECT}/$TARGET_ARCH)" >&$SILENT_OUT - _count+='x' - ( build_addon $addon ) \ - 2>&1 | tee $log_file - if [ ${PIPESTATUS[0]} != 0 ]; then - addons_failed+="$addon " - echo "$(print_color CLR_ERROR "ADDON FAILED $addon")" >&$SILENT_OUT - echo "failed: ${addon}" >> $summary_file - else - if [ "$remove_success_logs" = "true" ]; then - rm -f $log_file - fi - echo "success: ${addon}" >> $summary_file - fi -done - -# show-only has no summary, can exit here -if [ "$show_only" = "true" ]; then - exit 0 -fi - -# print summary -if [ "$_count" != 'x' ]; then - if [ -z "$addons_failed" ]; then - echo "$(print_color CLR_INFO "ALL ADDONS BUILDS SUCCESSFUL")" - exit 0 - else - die "$(print_color CLR_ERROR "FAILED ADDONS: $addons_failed")" - fi -fi diff --git a/scripts/image_st b/scripts/image_st deleted file mode 100755 index c2275176e1..0000000000 --- a/scripts/image_st +++ /dev/null @@ -1,579 +0,0 @@ -#!/bin/bash - -# SPDX-License-Identifier: GPL-2.0-or-later -# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) -# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv) - -unset _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST - -. config/options "" -. config/show_config - -show_config -save_build_config - -setup_toolchain target - -$SCRIPTS/checkdeps -$SCRIPTS/build toolchain -$SCRIPTS/build squashfs:host -$SCRIPTS/build dosfstools:host -$SCRIPTS/build fakeroot:host -$SCRIPTS/build kmod:host -$SCRIPTS/build mtools:host -$SCRIPTS/build populatefs:host - -function do_mkimage() { - # Variables used in mkimage script must be passed - env \ - PATH="$PATH:/sbin" \ - ROOT="$ROOT" \ - SCRIPTS="$SCRIPTS" \ - TOOLCHAIN="$TOOLCHAIN" \ - PROJECT_DIR="$PROJECT_DIR" \ - PROJECT="$PROJECT" \ - DEVICE="$DEVICE" \ - DISTRO="$DISTRO" \ - TARGET_IMG="$TARGET_IMG" \ - BUILD_NAME="$IMAGE_NAME" \ - IMAGE_NAME="${1:-$IMAGE_NAME}" \ - INSTALL_SRC_DIR="$INSTALL_SRC_DIR" \ - BOOTLOADER="$BOOTLOADER" \ - KERNEL_NAME="$KERNEL_NAME" \ - TARGET_KERNEL_ARCH="$TARGET_KERNEL_ARCH" \ - RELEASE_DIR="$RELEASE_DIR" \ - UUID_SYSTEM="$UUID_SYSTEM" \ - UUID_STORAGE="$UUID_STORAGE" \ - DISTRO_BOOTLABEL="$DISTRO_BOOTLABEL" \ - DISTRO_DISKLABEL="$DISTRO_DISKLABEL" \ - UBOOT_SYSTEM="$UBOOT_SYSTEM" \ - UBOOT_VERSION="$UBOOT_VERSION" \ - EXTRA_CMDLINE="$EXTRA_CMDLINE" \ - SYSTEM_SIZE="$SYSTEM_SIZE" \ - SYSTEM_PART_START="$SYSTEM_PART_START" \ - OVA_SIZE="$OVA_SIZE" \ - $SCRIPTS/mkimage -} - -if [ -n "$CUSTOM_GIT_HASH" ]; then - GIT_HASH="$CUSTOM_GIT_HASH" -else - GIT_HASH=$(git rev-parse HEAD) -fi - -if [ "$LIBREELEC_VERSION" = "devel" ]; then - GIT_ABBREV=${GIT_HASH:0:7} - DEVEL_VERSION=$LIBREELEC_VERSION - case "$BUILD_PERIODIC" in - nightly) LIBREELEC_VERSION=nightly-$(date +%Y%m%d)-$GIT_ABBREV;; - daily) LIBREELEC_VERSION=daily-$(date +%Y%j)-$GIT_ABBREV;; - weekly) LIBREELEC_VERSION=weekly-$(date +%G%V)-$GIT_ABBREV;; - monthly) LIBREELEC_VERSION=monthly-$(date +%Y%m)-$GIT_ABBREV;; - *) LIBREELEC_VERSION=devel-$(date +%Y%m%d%H%M%S)-$GIT_ABBREV;; - esac -fi - -# Get origin url, fix git:// and git@github.com: urls if necessary -ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed 's#\.git$##;s#^git:#https:#;s#^git@github\.com:#https://github.com/#')" - -[ "${BUILDER_NAME,,}" = "official" ] && BUILDER_NAME= -if [ "$OFFICIAL" = "yes" ]; then - LIBREELEC_BUILD="official" -else - if [ -n "$BUILDER_NAME" ]; then - LIBREELEC_BUILD="$BUILDER_NAME" - else - LIBREELEC_BUILD="community" - fi -fi - -if [ -n "$CUSTOM_VERSION" ]; then - LIBREELEC_VERSION="$CUSTOM_VERSION" -fi - -LIBREELEC_ARCH="${DEVICE:-$PROJECT}.$TARGET_ARCH" -TARGET_VERSION="$LIBREELEC_ARCH-$LIBREELEC_VERSION" - -if [ -n "$CUSTOM_IMAGE_NAME" ]; then - IMAGE_NAME="$CUSTOM_IMAGE_NAME" -else - if [ "$DEVEL_VERSION" = "devel" ]; then - IMAGE_NAME="$DISTRONAME-$LIBREELEC_ARCH-$OS_VERSION-$LIBREELEC_VERSION" - else - IMAGE_NAME="$DISTRONAME-$TARGET_VERSION" - fi - - if [ -n "$UBOOT_SYSTEM" ] && [ "$UBOOT_SYSTEM" != "${DEVICE:-$PROJECT}" ]; then - IMAGE_NAME="$IMAGE_NAME-$UBOOT_SYSTEM" - fi -fi - -if [ -n "$IMAGE_SUFFIX" ]; then - IMAGE_NAME="$IMAGE_NAME-$IMAGE_SUFFIX" -fi - -echo "$IMAGE_NAME" > $BUILD/BUILD_FILENAME - -# setup fakeroot -rm -rf $FAKEROOT_SCRIPT # remove $FAKEROOT_SCRIPT if it exist -touch $FAKEROOT_SCRIPT # create an empty $FAKEROOT_SCRIPT -chmod +x $FAKEROOT_SCRIPT # make $FAKEROOT_SCRIPT executable -echo "chown -R 0:0 $INSTALL" >> $FAKEROOT_SCRIPT - -# clean old install dirs -rm -rf $INSTALL -rm -rf $STAMPS_INSTALL -mkdir -p $INSTALL - -# create baselayout -for directory in etc dev proc run sys tmp usr var flash storage; do - mkdir -p $INSTALL/$directory -done -ln -sfn /var/media $INSTALL/media -ln -sfn /usr/lib $INSTALL/lib -ln -sfn /usr/bin $INSTALL/bin -ln -sfn /usr/sbin $INSTALL/sbin - -if [ "$TARGET_ARCH" = "x86_64" ]; then - ln -sfn /usr/lib $INSTALL/lib64 - ln -sfn /usr/lib $INSTALL/usr/lib64 -fi - -echo "$TARGET_VERSION" > $INSTALL/etc/release - -# create /etc/os-release -echo -e "NAME=\"$DISTRONAME\"" > $INSTALL/etc/os-release -echo -e "VERSION=\"$LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release -echo -e "ID=\"libreelec\"" >> $INSTALL/etc/os-release -echo -e "VERSION_ID=\"$OS_VERSION\"" >> $INSTALL/etc/os-release -echo -e "PRETTY_NAME=\"$DISTRONAME ($LIBREELEC_BUILD): $LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release -echo -e "HOME_URL=\"https://libreelec.tv\"" >> $INSTALL/etc/os-release -echo -e "BUG_REPORT_URL=\"$ORIGIN_URL\"" >> $INSTALL/etc/os-release -echo -e "BUILD_ID=\"$GIT_HASH\"" >> $INSTALL/etc/os-release -echo -e "OPENELEC_ARCH=\"$LIBREELEC_ARCH\"" >> $INSTALL/etc/os-release -echo -e "LIBREELEC_ARCH=\"$LIBREELEC_ARCH\"" >> $INSTALL/etc/os-release -echo -e "LIBREELEC_BUILD=\"$LIBREELEC_BUILD\"" >> $INSTALL/etc/os-release -echo -e "LIBREELEC_PROJECT=\"$PROJECT\"" >> $INSTALL/etc/os-release -[ -n "$DEVICE" ] && echo -e "LIBREELEC_DEVICE=\"$DEVICE\"" >> $INSTALL/etc/os-release -[ -n "$BUILDER_NAME" ] && echo -e "BUILDER_NAME=\"$BUILDER_NAME\"" >> $INSTALL/etc/os-release -[ -n "$BUILDER_VERSION" ] && echo -e "BUILDER_VERSION=\"$BUILDER_VERSION\"" >> $INSTALL/etc/os-release - -# create /etc/issue -echo "$GREETING0" > $INSTALL/etc/issue -echo "$GREETING1" >> $INSTALL/etc/issue -echo "$GREETING2" >> $INSTALL/etc/issue -echo "$GREETING3" >> $INSTALL/etc/issue -echo "$GREETING4" >> $INSTALL/etc/issue -echo "$DISTRONAME ($LIBREELEC_BUILD): $LIBREELEC_VERSION ($LIBREELEC_ARCH)" >> $INSTALL/etc/issue - -ln -sf /etc/issue $INSTALL/etc/motd - -# populate base system... -$SCRIPTS/install libc -$SCRIPTS/install gcc - -$SCRIPTS/install linux -export _CACHED_KERNEL_MODULE_DIR="$(get_module_dir)" - -$SCRIPTS/install linux-drivers -$SCRIPTS/install linux-firmware -$SCRIPTS/install $BOOTLOADER -$SCRIPTS/install busybox -$SCRIPTS/install util-linux -$SCRIPTS/install corefonts -$SCRIPTS/install network - -# Graphic support -[ ! "$DISPLAYSERVER" = "no" ] && $SCRIPTS/install $DISPLAYSERVER - -# Multimedia support -[ ! "$MEDIACENTER" = "no" ] && $SCRIPTS/install mediacenter - -# Sound support -[ "$ALSA_SUPPORT" = "yes" ] && $SCRIPTS/install alsa - -# Automounter support -[ "$UDEVIL" = "yes" ] && $SCRIPTS/install udevil - -# EXFAT support -[ "$EXFAT" = "yes" ] && $SCRIPTS/install fuse-exfat - -# NTFS 3G support -[ "$NTFS3G" = "yes" ] && $SCRIPTS/install ntfs-3g_ntfsprogs - -# Remote support -[ "$REMOTE_SUPPORT" = "yes" ] && $SCRIPTS/install remote - -# Install miscellaneous packages -$SCRIPTS/install misc-packages - -# Virtual image creation support -[ "$PROJECT" = "Generic" ] && $SCRIPTS/install virtual - -# Installer support -[ "$INSTALLER_SUPPORT" = "yes" ] && $SCRIPTS/install installer - -# Devtools... (not for Release) -[ "$TESTING" = "yes" ] && $SCRIPTS/install testing - -# Install gdb in all builds, including releases -$SCRIPTS/install debug - -# OEM packages -[ "$OEM_SUPPORT" = "yes" ] && $SCRIPTS/install oem - -# copy PROJECT related files to filesystem -if [ -d "$PROJECT_DIR/$PROJECT/filesystem" ]; then - cp -PR $PROJECT_DIR/$PROJECT/filesystem/* $INSTALL - # install project specific systemd services - for service in $PROJECT_DIR/$PROJECT/filesystem/usr/lib/systemd/system/*.service; do - if [ -f "$service" ]; then - enable_service $(basename $service) - fi - done -fi - -# copy DEVICE related files to filesystem -if [ -n "$DEVICE" -a -d "$PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem" ]; then - cp -PR $PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem/* $INSTALL - # install device specific systemd services - for service in $PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem/usr/lib/systemd/system/*.service; do - if [ -f "$service" ]; then - enable_service $(basename $service) - fi - done -fi - -# run depmod for base overlay modules -MODVER=$(basename $(ls -d $INSTALL/usr/lib/kernel-overlays/base/lib/modules/*)) -find $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/ -name *.ko | \ - sed -e "s,$INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/,," \ - > $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/modules.order -$TOOLCHAIN/bin/depmod -b $INSTALL/usr/lib/kernel-overlays/base -a -e -F "$BUILD/linux-$(kernel_version)/System.map" $MODVER - -# strip kernel modules -for MOD in $(find $INSTALL/usr/lib/kernel-overlays/ -type f -name *.ko); do - ${TARGET_KERNEL_PREFIX}strip --strip-debug $MOD -done - -# symlink overlayed modules to /usr/lib/modules -ln -sT /var/lib/modules $INSTALL/usr/lib/modules - -# symlink overlayed firmware to /usr/lib/firmware -ln -sT /var/lib/firmware $INSTALL/usr/lib/firmware - -# make target dir -mkdir -p $TARGET_IMG -rm -rf $TARGET_IMG/$IMAGE_NAME.kernel - -# copy kernel to target dir -cp -PR $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel -chmod 0644 $TARGET_IMG/$IMAGE_NAME.kernel - -# Set mksquashfs options for each compression method -if [ -z "$SQUASHFS_COMPRESSION_OPTION" ]; then - if [ "${SQUASHFS_COMPRESSION:-gzip}" = "gzip" ]; then - SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 9 -b 262144" - elif [ "$SQUASHFS_COMPRESSION" = "lzo" ]; then - SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 9 -b 524288" - elif [ "$SQUASHFS_COMPRESSION" = "zstd" ]; then - SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 22 -b 262144" - fi -fi - -# create squashfs file, default to gzip if no compression configured -echo "rm -rf \"$TARGET_IMG/$IMAGE_NAME.system\"" >> $FAKEROOT_SCRIPT -echo "$TOOLCHAIN/bin/mksquashfs \"$BUILD/image/system\" \"$TARGET_IMG/$IMAGE_NAME.system\" -noappend -comp ${SQUASHFS_COMPRESSION:-gzip} ${SQUASHFS_COMPRESSION_OPTION}" >> $FAKEROOT_SCRIPT - -# run fakeroot -$TOOLCHAIN/bin/fakeroot -- $FAKEROOT_SCRIPT -rm -rf $FAKEROOT_SCRIPT - -# set permissions -chmod 0644 $TARGET_IMG/$IMAGE_NAME.system - -if [ "$1" = "release" -o "$1" = "mkimage" -o "$1" = "amlpkg" -o "$1" = "noobs" ]; then - - RELEASE_DIR="target/$IMAGE_NAME" - - # cleanup - rm -rf $RELEASE_DIR - - # create release dir - mkdir -p $RELEASE_DIR - - # remove n previous created release image - rm -rf $TARGET_IMG/$IMAGE_NAME.img.gz - - if [ -n "$BOOTLOADER" ]; then - - BOOTLOADER_DIR="$(get_pkg_directory "$BOOTLOADER")" - - if [ -d $BOOTLOADER_DIR/files ]; then - cp -R $BOOTLOADER_DIR/files/* $RELEASE_DIR - fi - - if find_file_path bootloader/release $BOOTLOADER_DIR/release; then - echo "Running $FOUND_PATH" - . $FOUND_PATH - fi - fi - - cp $ROOT/README* $RELEASE_DIR - cp $ROOT/CHANGELOG* $RELEASE_DIR - echo "$TARGET_VERSION" > $RELEASE_DIR/RELEASE - - if [ ! "$MEDIACENTER" = "no" ]; then - echo "Kodi commit: $(get_pkg_version $MEDIACENTER)" >> $RELEASE_DIR/RELEASE - fi - - mkdir -p $RELEASE_DIR/licenses - cp $ROOT/licenses/* $RELEASE_DIR/licenses - - mkdir -p $RELEASE_DIR/target - cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/target/SYSTEM - cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/target/KERNEL - - # create md5sum's - ( cd $RELEASE_DIR; - md5sum -t target/SYSTEM > target/SYSTEM.md5; - md5sum -t target/KERNEL > target/KERNEL.md5; - ) - - # create target directory - mkdir -p $TARGET_IMG - - # remove an previous created release tarball - rm -rf $TARGET_IMG/$IMAGE_NAME.tar - - # create release tarball - tar cf $TARGET_IMG/$IMAGE_NAME.tar -C target $IMAGE_NAME - - # create sha256 checksum of tarball - ( cd $TARGET_IMG - sha256sum ${IMAGE_NAME}.tar > ${IMAGE_NAME}.tar.sha256 - ) - - # create image files if requested - if [[ ( "$1" = "amlpkg" || "$1" = "noobs" || "$1" = "mkimage" ) && -n "$BOOTLOADER" ]]; then - # INSTALL_SRC_DIR can be board specific - if [ -n "$DEVICE" -a -d "$PROJECT_DIR/$PROJECT/devices/$DEVICE/install" ]; then - INSTALL_SRC_DIR="$PROJECT_DIR/$PROJECT/devices/$DEVICE/install" - else - INSTALL_SRC_DIR="$PROJECT_DIR/$PROJECT/install" - fi - - UUID_SYSTEM="$(date '+%d%m')-$(date '+%M%S')" - UUID_STORAGE="$(uuidgen)" - - DEVICE_BOARDS=$($SCRIPTS/uboot_helper "$PROJECT" "$DEVICE") - - if [ "$BOOTLOADER" = "u-boot" -a -z "$UBOOT_SYSTEM" -a -n "$DEVICE" -a -n "$DEVICE_BOARDS" ]; then - for UBOOT_SYSTEM in $DEVICE_BOARDS; do - - # re-install u-boot package - rm $STAMPS_INSTALL/u-boot/install_target - UBOOT_SYSTEM="$UBOOT_SYSTEM" $SCRIPTS/install u-boot - - # re-run bootloader/release - if find_file_path bootloader/release $BOOTLOADER_DIR/release; then - echo "Running $FOUND_PATH" - . $FOUND_PATH - fi - - do_mkimage "$IMAGE_NAME-$UBOOT_SYSTEM" - done - else - do_mkimage - fi - fi - - # cleanup release dir - rm -rf $RELEASE_DIR - - # create WeTek Play (Amlogic) ZIP update and auto-install packages if requested - if [ "$1" = "amlpkg" ]; then - echo "Creating Amlogic ZIP update package" - - AML_PKG_DIR="$RELEASE_DIR/ampl-pkg" - - # create package directory - mkdir -p "$AML_PKG_DIR" - - # copy system and kernel images - mkdir -p "$AML_PKG_DIR/system" - cp $TARGET_IMG/$IMAGE_NAME.system $AML_PKG_DIR/system/SYSTEM - cp $TARGET_IMG/$IMAGE_NAME.kernel $AML_PKG_DIR/KERNEL - - # copy update-binary and updater-script - META_INF_DIR="$AML_PKG_DIR/META-INF/com/google/android" - mkdir -p "$META_INF_DIR" - cp $INSTALL_SRC_DIR/update-binary $META_INF_DIR - cp $INSTALL_SRC_DIR/updater-script $META_INF_DIR - - # copy other files if any - if [ -d "$INSTALL_SRC_DIR/files" ]; then - cp -PR $INSTALL_SRC_DIR/files/* $AML_PKG_DIR - fi - - # copy device tree image if any - if [ -f "$INSTALL/usr/share/bootloader/dtb.img" ]; then - cp "$INSTALL/usr/share/bootloader/dtb.img" $AML_PKG_DIR/dtb.img - fi - - # create the update package - pushd "$AML_PKG_DIR" > /dev/null - zip -rq update.zip * - - # sign the update package - echo "Signing the update package" - mkdir -p sign - SIGNAPK_DIR="$ROOT/tools/signapk" - java -Xmx1024m -jar $SIGNAPK_DIR/signapk.jar -w $SIGNAPK_DIR/testkey.x509.pem $SIGNAPK_DIR/testkey.pk8 update.zip sign/$IMAGE_NAME-update.zip - - # create the auto-install package - echo "Creating Amlogic ZIP auto-install package" - pushd sign > /dev/null - echo --update_package=/sdcard/$IMAGE_NAME-update.zip > factory_update_param.aml - echo --wipe_data >> factory_update_param.aml - echo --wipe_cache >> factory_update_param.aml - if [ -f "$INSTALL_SRC_DIR/files/recovery.img" ]; then - cp $INSTALL_SRC_DIR/files/recovery.img . - fi - - if [ -f $INSTALL_SRC_DIR/files/aml_autoscript ]; then - cp $INSTALL_SRC_DIR/files/aml_autoscript . - fi - - # copy device tree image if any - if [ -f "$INSTALL/usr/share/bootloader/dtb.img" ]; then - cp "$INSTALL/usr/share/bootloader/dtb.img" . - fi - - zip -q $TARGET_IMG/$IMAGE_NAME.zip * - - # create sha256 checksum of zip - ( cd $TARGET_IMG - sha256sum ${IMAGE_NAME}.zip > ${IMAGE_NAME}.zip.sha256 - ) - - popd > /dev/null - popd > /dev/null - - elif [ "$1" = "noobs" ]; then - echo "Creating \"$1\" release tarball..." - - RELEASE_DIR="$TARGET_IMG/${IMAGE_NAME}-$1" - - # eg. LibreELEC_RPi, LibreELEC_RPi2 etc. - NOOBS_DISTRO="${DISTRONAME}_${DEVICE:-$PROJECT}" - - # create release dir - mkdir -p $RELEASE_DIR/${NOOBS_DISTRO} - - if [ -f $DISTRO_DIR/$DISTRO/${DISTRONAME}_40x40.png ]; then - cp -PR $DISTRO_DIR/$DISTRO/${DISTRONAME}_40x40.png $RELEASE_DIR/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png - else - cp -PR $DISTRO_DIR/$DISTRO/${DISTRONAME}.png $RELEASE_DIR/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png - fi - cp -PR $ROOT/config/noobs/os.json $RELEASE_DIR/${NOOBS_DISTRO} - cp -PR $ROOT/config/noobs/partition_setup.sh $RELEASE_DIR/${NOOBS_DISTRO} - cp -PR $ROOT/config/noobs/partitions.json $RELEASE_DIR/${NOOBS_DISTRO} - if [ -d $DISTRO_DIR/$DISTRO/noobs/marketing ]; then - tar cf $RELEASE_DIR/${NOOBS_DISTRO}/marketing.tar -C $DISTRO_DIR/$DISTRO/noobs/marketing . - else - tar cf $RELEASE_DIR/${NOOBS_DISTRO}/marketing.tar -C $ROOT/config/noobs/marketing . - fi - cp $ROOT/README* $RELEASE_DIR/${NOOBS_DISTRO} - cp $ROOT/CHANGELOG $RELEASE_DIR/${NOOBS_DISTRO}/release_notes.txt - - sed -e "s%@DISTRONAME@%$DISTRONAME%g" \ - -e "s%@PROJECT@%${DEVICE:-$PROJECT}%g" \ - -e "s%@LIBREELEC_VERSION@%$LIBREELEC_VERSION%g" \ - -e "s%@RELEASE_DATE@%$(date +%F)%g" \ - -e "s%@KERNEL_VERSION@%$(kernel_version)%g" \ - -e "s%@DESCRIPTION@%$DESCRIPTION%g" \ - -e "s%@ROOT_PASSWORD@%$ROOT_PASSWORD%g" \ - -e "s%@NOOBS_SUPPORTED_MODELS@%$NOOBS_SUPPORTED_MODELS%g" \ - -e "s%@NOOBS_HEX@%$NOOBS_HEX%g" \ - -i $RELEASE_DIR/${NOOBS_DISTRO}/os.json - - sed -e "s%@DISTRONAME@%$DISTRONAME%g" \ - -e "s%@PROJECT@%${DEVICE:-$PROJECT}%g" \ - -e "s%@SYSTEM_SIZE@%$SYSTEM_SIZE%g" \ - -i $RELEASE_DIR/${NOOBS_DISTRO}/partitions.json - - # create System dir - mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System - - BOOTLOADER_DIR="$(get_pkg_directory "$BOOTLOADER")" - if [ -d $BOOTLOADER_DIR/files/3rdparty/bootloader/ ]; then - cp -PR $BOOTLOADER_DIR/files/3rdparty/bootloader/* $RELEASE_DIR/${NOOBS_DISTRO}/System - fi - - # copy Bootloader - cp -PR $BUILD/bcm2835-bootloader-*/LICENCE* $RELEASE_DIR/${NOOBS_DISTRO}/System/ - cp -PR $BUILD/bcm2835-bootloader-*/bootcode.bin $RELEASE_DIR/${NOOBS_DISTRO}/System/ - cp -PR $BUILD/bcm2835-bootloader-*/fixup_x.dat $RELEASE_DIR/${NOOBS_DISTRO}/System/fixup.dat - cp -PR $BUILD/bcm2835-bootloader-*/start_x.elf $RELEASE_DIR/${NOOBS_DISTRO}/System/start.elf - [ -f $BUILD/bcm2835-bootloader-*/dt-blob.bin ] && cp -PR $BUILD/bcm2835-bootloader-*/dt-blob.bin $RELEASE_DIR/${NOOBS_DISTRO}/System/dt-blob.bin - - # copy system files - cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/${NOOBS_DISTRO}/System/SYSTEM - cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/${NOOBS_DISTRO}/System/kernel.img - - for dtb in $INSTALL/usr/share/bootloader/*.dtb; do - if [ -f $dtb ]; then - cp -PR $dtb $RELEASE_DIR/${NOOBS_DISTRO}/System - fi - done - - for overlay in $INSTALL/usr/share/bootloader/overlays/*; do - if [ -f $overlay ]; then - mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System/overlays - cp -PR $overlay $RELEASE_DIR/${NOOBS_DISTRO}/System/overlays - fi - done - - # create md5sum's - ( cd $RELEASE_DIR/${NOOBS_DISTRO}/System; - md5sum -t SYSTEM > SYSTEM.md5; - md5sum -t kernel.img > kernel.img.md5; - ) - - # copy additional files - mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System/licenses - cp $ROOT/licenses/* $RELEASE_DIR/${NOOBS_DISTRO}/System/licenses - - # create Storage dir - mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/Storage - - # remove any previously created release tarball - rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/System.tar.xz - rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/Storage.tar.xz - - # create filesystem tarballs - tar cJf $RELEASE_DIR/${NOOBS_DISTRO}/System.tar.xz -C $RELEASE_DIR/${NOOBS_DISTRO}/System/ . - tar cJf $RELEASE_DIR/${NOOBS_DISTRO}/Storage.tar.xz -C $RELEASE_DIR/${NOOBS_DISTRO}/Storage/ . - - # remove filesystem dirs - rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/System - rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/Storage - - # remove any previously created release tarball - rm -rf $TARGET_IMG/${IMAGE_NAME}-$1.tar - - # create release tarball - tar cf $TARGET_IMG/${IMAGE_NAME}-$1.tar -C $TARGET_IMG ${IMAGE_NAME}-$1 - - # create sha256 checksum of tarball - ( cd $TARGET_IMG - sha256sum ${IMAGE_NAME}-$1.tar > ${IMAGE_NAME}-$1.tar.sha256 - ) - fi - - if [ -d $RELEASE_DIR ]; then - # cleanup release dir - rm -rf $RELEASE_DIR - fi -fi diff --git a/scripts/uboot_helper b/scripts/uboot_helper index 8d993311c9..141b970122 100755 --- a/scripts/uboot_helper +++ b/scripts/uboot_helper @@ -28,6 +28,8 @@ devices = { }, 'H6' : { 'pine_h64' : { 'dtb' : 'sun50i-h6-pine-h64.dtb', 'config' : 'pine_h64_defconfig' }, + 'orangepi_3' : { 'dtb' : 'sun50i-h6-orangepi-3.dtb', 'config' : 'orangepi_3_defconfig' }, + 'orangepi_one_plus' : { 'dtb' : 'sun50i-h6-orangepi-one-plus.dtb', 'config' : 'orangepi_one_plus_defconfig' }, }, }, 'Rockchip' : {